Make object_key_t portable
authorPetri Lehtinen <petri@digip.org>
Thu, 12 Aug 2010 18:35:19 +0000 (21:35 +0300)
committerPetri Lehtinen <petri@digip.org>
Thu, 12 Aug 2010 18:35:23 +0000 (21:35 +0300)
A flexible array member is unportable. Use a table of length 1
instead. This needs some adjustment to the memory allocatio, too.

src/jansson_private.h
src/value.c

index 6d7e46c..55532eb 100644 (file)
@@ -53,7 +53,7 @@ typedef struct {
 
 typedef struct {
     unsigned long serial;
-    char key[];
+    char key[1];
 } object_key_t;
 
 const object_key_t *jsonp_object_iter_fullkey(void *iter);
index e024fdb..8e0cfa2 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <config.h>
 
+#include <stddef.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -124,9 +125,11 @@ int json_object_set_new_nocheck(json_t *json, const char *key, json_t *value)
     }
     object = json_to_object(json);
 
-    k = malloc(sizeof(object_key_t) + strlen(key) + 1);
-    if(!k)
-        return -1;
+    /* offsetof(...) returns the size of object_key_t without the
+       last, flexible member. This way, the correct amount is
+       allocated. */
+    k = malloc(offsetof(object_key_t, key) +
+    strlen(key) + 1); if(!k) return -1;
 
     k->serial = object->serial++;
     strcpy(k->key, key);