Fix issue #53 - ensure explicit length string are still NUL terminated, and fix json_...
authorEric Haszlakiewicz <erh+git@nimenees.com>
Sun, 9 Dec 2012 22:32:11 +0000 (16:32 -0600)
committerEric Haszlakiewicz <erh+git@nimenees.com>
Sun, 9 Dec 2012 22:32:11 +0000 (16:32 -0600)
Adjust test_null to check for this case.
See also http://bugs.debian.org/687269

json_object.c
json_tokener.c
tests/test_null.c

index 5b60a06..a84785c 100644 (file)
@@ -620,8 +620,9 @@ struct json_object* json_object_new_string_len(const char *s, int len)
   if(!jso) return NULL;
   jso->_delete = &json_object_string_delete;
   jso->_to_json_string = &json_object_string_to_json_string;
-  jso->o.c_string.str = (char*)malloc(len);
+  jso->o.c_string.str = (char*)malloc(len + 1);
   memcpy(jso->o.c_string.str, (void *)s, len);
+  jso->o.c_string.str[len] = '\0';
   jso->o.c_string.len = len;
   return jso;
 }
index f5fa8d6..05357fb 100644 (file)
@@ -393,7 +393,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
        while(1) {
          if(c == tok->quote_char) {
            printbuf_memappend_fast(tok->pb, case_start, str-case_start);
-           current = json_object_new_string(tok->pb->buf);
+           current = json_object_new_string_len(tok->pb->buf, tok->pb->bpos);
            saved_state = json_tokener_state_finish;
            state = json_tokener_state_eatws;
            break;
index 675eab5..1f07910 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "json_inttypes.h"
 #include "json_object.h"
+#include "json_tokener.h"
 
 int main()
 {
@@ -33,5 +34,24 @@ int main()
                retval=1;
        }
        json_object_put(string);
+
+       struct json_object *parsed_str = json_tokener_parse(expected);
+       if (parsed_str)
+       {
+               int parsed_len = json_object_get_string_len(parsed_str);
+               const char *parsed_cstr = json_object_get_string(parsed_str);
+               int ii;
+               printf("Re-parsed object string len=%d, chars=[", parsed_len);
+               for (ii = 0; ii < parsed_len ; ii++)
+               {
+                       printf("%s%d", (ii ? ", " : ""), (int)parsed_cstr[ii]);
+               }
+               printf("]\n");
+               json_object_put(parsed_str);
+       }
+       else
+       {
+               printf("ERROR: failed to parse\n");
+       }
        return retval;
 }