Bladeren bron

Null-terminate %Q conversions

PUBLISHED_FROM=a395ff5f8e1514f437f0678c3e1fe9d8058981ed
Sergey Lyubka 9 jaren geleden
bovenliggende
commit
56c15f1e5b
2 gewijzigde bestanden met toevoegingen van 24 en 13 verwijderingen
  1. 13 11
      frozen.c
  2. 11 2
      unit_test.c

+ 13 - 11
frozen.c

@@ -85,14 +85,14 @@ struct fstate {
   struct fstate fstate = {(ptr), (type), (fr)->path_len}; \
   append_to_path((fr), (str), (len));
 
-#define CALL_BACK(fr)                                                       \
-  do {                                                                      \
-    struct json_token __t = {                                               \
-        fstate.ptr, (fr)->cur - (const char *) fstate.ptr, fstate.type};    \
-    truncate_path((fr), fstate.path_len);                                   \
-    if ((fr)->callback &&                                                   \
-        ((fr)->path_len == 0 || (fr)->path[(fr)->path_len - 1] != '.'))     \
-      (fr)->callback((fr)->callback_data, (fr)->path, &__t);                \
+#define CALL_BACK(fr)                                                         \
+  do {                                                                        \
+    struct json_token t = {fstate.ptr, (fr)->cur - (const char *) fstate.ptr, \
+                           fstate.type};                                      \
+    truncate_path((fr), fstate.path_len);                                     \
+    if ((fr)->callback &&                                                     \
+        ((fr)->path_len == 0 || (fr)->path[(fr)->path_len - 1] != '.'))       \
+      (fr)->callback((fr)->callback_data, (fr)->path, &t);                    \
   } while (0)
 
 static int append_to_path(struct frozen *f, const char *str, int size) {
@@ -693,12 +693,14 @@ static void json_scanf_cb_tok(void *callback_data, const char *path,
 static void json_scanf_cb_str(void *callback_data, const char *path,
                               const struct json_token *tok) {
   struct json_scanf_info *info = (struct json_scanf_info *) callback_data;
+  char **dst = (char **) info->target;
   if (strcmp(path, info->path) == 0) {
     info->num_conversions++;
     /* TODO(lsm): un-escape string */
-    *(char **) info->target = (char *) malloc(tok->len + 1);
-    if (*(char **) info->target != NULL) {
-      strncpy(*(char **) info->target, tok->ptr, tok->len);
+    *dst = (char *) malloc(tok->len + 1);
+    if (*dst != NULL) {
+      strncpy(*dst, tok->ptr, tok->len);
+      (*dst)[tok->len] = '\0';
     }
   }
 }

+ 11 - 2
unit_test.c

@@ -114,8 +114,8 @@ static const char *test_errors(void) {
 
   ASSERT(json_parse(NULL, 0, NULL, 0) == JSON_STRING_INVALID);
   for (i = 0; invalid_tests[i] != NULL; i++) {
-    ASSERT(json_parse(invalid_tests[i], strlen(invalid_tests[i]), NULL,
-                      NULL) == JSON_STRING_INVALID);
+    ASSERT(json_parse(invalid_tests[i], strlen(invalid_tests[i]), NULL, NULL) ==
+           JSON_STRING_INVALID);
   }
 
   for (i = 0; incomplete_tests[i] != NULL; i++) {
@@ -342,6 +342,15 @@ static const char *test_scanf(void) {
     ASSERT(strncmp(t.ptr, "[1,2,3]", t.len) == 0);
   }
 
+  {
+    /* Test zero termination */
+    char *s = NULL;
+    const char *str = "{a: \"foo\", b:123}";
+    ASSERT(json_scanf(str, strlen(str), "{a: %Q}", &s) == 1);
+    ASSERT(s != NULL);
+    ASSERT(s[3] == '\0');
+  }
+
   return NULL;
 }