json: Fix parsing of strings that end with a backslash.
authorBen Pfaff <blp@nicira.com>
Wed, 25 Jun 2014 18:39:25 +0000 (11:39 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 25 Jun 2014 18:41:20 +0000 (11:41 -0700)
json_string_unescape() flagged a backslash at the end of a string as an
error, but of course "\\" is a valid string.  This fixes the problem.

VMware-BZ: #1275208
Reported-by: Michael Hu <mhu@nicira.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Alex Wang <alexw@nicira.com>
lib/json.c
tests/json.at

index 56dc5ef..021dd70 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -812,10 +812,6 @@ json_string_unescape(const char *in, size_t in_len, char **outp)
 
     ds_init(&out);
     ds_reserve(&out, in_len);
-    if (in_len > 0 && in[in_len - 1] == '\\') {
-        ds_put_cstr(&out, "quoted string may not end with backslash");
-        goto exit;
-    }
     while (in < end) {
         if (*in == '"') {
             ds_clear(&out);
@@ -828,6 +824,14 @@ json_string_unescape(const char *in, size_t in_len, char **outp)
         }
 
         in++;
+        if (in >= end) {
+            /* The JSON parser will never trigger this message, because its
+             * lexer will never pass in a string that ends in a single
+             * backslash, but json_string_unescape() has other callers that
+             * are not as careful.*/
+            ds_put_cstr(&out, "quoted string may not end with backslash");
+            goto exit;
+        }
         switch (*in++) {
         case '"': case '\\': case '/':
             ds_put_char(&out, in[-1]);
index 3962da1..54d6c29 100644 (file)
@@ -120,6 +120,13 @@ JSON_CHECK_NEGATIVE([surrogatess must paired properly],
 JSON_CHECK_NEGATIVE([null bytes not allowed], 
                     [[["\u0000"]]], 
                     [error: null bytes not supported in quoted strings])
+dnl Check for regression against a prior bug.
+JSON_CHECK_POSITIVE([properly quoted backslash at end of string],
+  [[["\\"]]],
+  [[["\\"]]])
+JSON_CHECK_NEGATIVE([stray backslash at end of string],
+  [[["abcd\"]]],
+  [error: unexpected end of input in quoted string])
 
 AT_SETUP([end of input in quoted string - C])
 AT_KEYWORDS([json negative])