This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a commit to branch 3.3.x
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit ecc76abaa2c11502ebdf153665bee391a7307ca8
Author: Nick Vatamaniuc <vatam...@gmail.com>
AuthorDate: Thu Jun 22 16:08:36 2023 -0400

    Fix the ability to use ; in config values
    
    Config values may contain `;` in them as long as `;` is not preceded by a
    space or a tab character.
    
    Fixes: https://github.com/apache/couchdb/issues/4651
---
 src/config/src/config.erl | 40 +++++++++++++++++++++++++++++++++++-----
 1 file changed, 35 insertions(+), 5 deletions(-)

diff --git a/src/config/src/config.erl b/src/config/src/config.erl
index 7c38ff58f..0df47811c 100644
--- a/src/config/src/config.erl
+++ b/src/config/src/config.erl
@@ -468,8 +468,16 @@ read_ini_file(IniFile) ->
     end.
 
 remove_comments(Line) ->
-    {NoComments, _Comments} = string:take(Line, [$;], true),
-    NoComments.
+    case trim(Line) of
+        [$; | _] ->
+            % Comment is at the start of line after it's trimmed
+            "";
+        NoLeadingComment when is_list(NoLeadingComment) ->
+            % Check for in-line comments. In-line comments must be preceded by
+            % space or a tab character.
+            [NoComments | _] = re:split(NoLeadingComment, " ;|\t;", [{return, 
list}]),
+            NoComments
+    end.
 
 % Specially handle the ?DELETE marker
 %
@@ -638,6 +646,10 @@ parse_skip_test() ->
     ?assertEqual([], ini("s]\nk=v")),
     ?assertEqual([], ini(";[s]\nk = v")),
     ?assertEqual([], ini(" ; [s]\nk = v")),
+    ?assertEqual([], ini("[s]\n ;k = v")),
+    ?assertEqual([], ini("[s]\n;;k = v")),
+    ?assertEqual([], ini("[s]\n\t;k = v")),
+    ?assertEqual([], ini("[s]\nk ;=v")),
     ?assertEqual([], ini("[s]\n ; k = v")),
     ?assertEqual([], ini("[]\nk = v")),
     ?assertEqual([], ini(";[s]\n ")).
@@ -669,14 +681,32 @@ parse_extra_equal_sign_test() ->
 
 parse_delete_test() ->
     ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk=")),
-    ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk=;")),
     ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk =")),
     ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk = ")),
     ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk= ")),
     ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk = ")),
     ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk = ;")),
-    ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk  =;")),
-    ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk=\n")).
+    ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk  =\t;")),
+    ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk=\n")),
+    ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk = ; ;")),
+    ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk = ;v")),
+    ?assertEqual([{{"s", "k"}, ?DELETE}], ini("[s]\nk = ;")).
+
+parse_comments_test() ->
+    ?assertEqual([], ini("[s]\n;k=v")),
+    ?assertEqual([{{"s", "k"}, ";"}], ini("[s]\nk=;")),
+    ?assertEqual([{{"s", "k"}, ";"}], ini("[s]\nk =;")),
+    ?assertEqual([{{"s", "k"}, "v;"}], ini("[s]\nk = v;")),
+    ?assertEqual([{{"s", "k"}, ";v;"}], ini("[s]\nk =;v;")),
+    ?assertEqual([{{"s", "k"}, ";v"}], ini("[s]\nk =;v")),
+    ?assertEqual([{{"s", "k"}, "v;"}], ini("[s]\nk =v;")),
+    ?assertEqual([{{"s", "k"}, "v;;"}], ini("[s]\nk =v;;")),
+    ?assertEqual([{{"s", "k"}, "v1;v2"}], ini("[s]\nk = v1;v2")),
+    ?assertEqual([{{"s", "k"}, "v1;v2;v3"}], ini("[s]\nk = v1;v2;v3")),
+    ?assertEqual([{{"s", "k"}, "v1;v2"}], ini("[s]\nk = v1;v2 ;")),
+    ?assertEqual([{{"s", "k"}, "v1;v2"}], ini("[s]\nk = v1;v2\t;")),
+    ?assertEqual([{{"s", "k"}, "v1;v2"}], ini("[s]\nk = v1;v2 ;;")),
+    ?assertEqual([{{"s", "k"}, "v1;v2"}], ini("[s]\nk = v1;v2 ;c1; c2")).
 
 parse_multiple_kvs_test() ->
     ?assertEqual(

Reply via email to