]> granicus.if.org Git - ejabberd/commitdiff
Allow balanced expressions inside @(...) in ejabberd_sql_pt
authorAlexey Shchepin <alexey@process-one.net>
Fri, 12 Feb 2016 13:26:51 +0000 (16:26 +0300)
committerAlexey Shchepin <alexey@process-one.net>
Tue, 1 Mar 2016 21:12:49 +0000 (00:12 +0300)
src/ejabberd_sql_pt.erl

index 23fc263ba27e9b09ca451eb9df41ecf96bf09a57..6b26cbcd66a738cb091eb30a54db7168ba505b5a 100644 (file)
@@ -174,12 +174,12 @@ append_string(S, State) ->
     State#state{query = [{str, S} | State#state.query]}.
 
 parse_name(S, State) ->
-    parse_name(S, [], State).
+    parse_name(S, [], 0, State).
 
-parse_name([], Acc, State) ->
+parse_name([], _Acc, _Depth, State) ->
     throw({error, State#state.loc,
            "expected ')', found end of string"});
-parse_name([$), T | S], Acc, State) ->
+parse_name([$), T | S], Acc, 0, State) ->
     Type =
         case T of
             $d -> integer;
@@ -190,11 +190,15 @@ parse_name([$), T | S], Acc, State) ->
                        ["unknown type specifier '", T, "'"]})
         end,
     {lists:reverse(Acc), Type, S, State};
-parse_name([$)], Acc, State) ->
+parse_name([$)], Acc, 0, State) ->
     throw({error, State#state.loc,
            "expected type specifier, found end of string"});
-parse_name([C | S], Acc, State) ->
-    parse_name(S, [C | Acc], State).
+parse_name([$( = C | S], Acc, Depth, State) ->
+    parse_name(S, [C | Acc], Depth + 1, State);
+parse_name([$) = C | S], Acc, Depth, State) ->
+    parse_name(S, [C | Acc], Depth - 1, State);
+parse_name([C | S], Acc, Depth, State) ->
+    parse_name(S, [C | Acc], Depth, State).
 
 
 make_sql_query(State) ->