deparse: handle all valid json escape sequences in dequote_jsonval
authorPetr Jelinek <pjmodos@pjmodos.net>
Wed, 20 Aug 2014 13:16:53 +0000 (15:16 +0200)
committerAndres Freund <andres@anarazel.de>
Fri, 5 Sep 2014 20:11:26 +0000 (22:11 +0200)
src/backend/commands/event_trigger.c

index 33879e1b000c8401a4e2fb76e700162f99cdee74..31adf712d8161f8f9a7937804eed60d74e099c27 100644 (file)
@@ -1841,26 +1841,36 @@ dequote_jsonval(char *jsonval)
    /* skip the start and end quotes right away */
    for (i = 1; i < inputlen - 1; i++)
    {
-       /*
-        * XXX this skips the \ in a \" sequence but leaves other escaped
-        * sequences in place.  Are there other cases we need to handle
-        * specially?
-        */
        if (jsonval[i] == '\\')
        {
-           if (jsonval[i + 1] == 'n')
-           {
-               result[j++] = '\n';
-               i++;
-               continue;
-           }
-           else if (jsonval[i + 1] == 't')
+           i++;
+
+           /* This uses same logic as json.c */
+           switch (jsonval[i])
            {
-               result[j++] = '\t';
-               i++;
-               continue;
+               case 'b':
+                   result[j++] = '\b';
+                   continue;
+               case 'f':
+                   result[j++] = '\f';
+                   continue;
+               case 'n':
+                   result[j++] = '\n';
+                   continue;
+               case 'r':
+                   result[j++] = '\r';
+                   continue;
+               case 't':
+                   result[j++] = '\t';
+                   continue;
+               case '"':
+               case '\\':
+               case '/':
+                   break;
+               default:
+                   /* XXX: ERROR? */
+                   break;
            }
-           i++;
        }
 
        result[j++] = jsonval[i];