libubox: tests: add more blobmsg/json test cases
[project/libubox.git] / blobmsg_json.c
index aee7a64fbca732142e87f0fcb70f2bf58699a2ca..dce81e991ef7b83ac4906bca6f875369d3057f36 100644 (file)
@@ -66,9 +66,15 @@ bool blobmsg_add_json_element(struct blob_buf *b, const char *name, json_object
        case json_type_boolean:
                blobmsg_add_u8(b, name, json_object_get_boolean(obj));
                break;
-       case json_type_int:
-               blobmsg_add_u32(b, name, json_object_get_int(obj));
+       case json_type_int: {
+               int64_t i64 = json_object_get_int64(obj);
+               if (i64 >= INT32_MIN && i64 <= INT32_MAX) {
+                       blobmsg_add_u32(b, name, (uint32_t)i64);
+               } else {
+                       blobmsg_add_u64(b, name, (uint64_t)i64);
+               }
                break;
+       }
        case json_type_double:
                blobmsg_add_double(b, name, json_object_get_double(obj));
                break;
@@ -202,7 +208,7 @@ static void blobmsg_format_string(struct strbuf *s, const char *str)
                buf[1] = escape;
 
                if (escape == 'u') {
-                       sprintf(buf + 4, "%02x", (unsigned char) *p);
+                       snprintf(buf + 4, sizeof(buf) - 4, "%02x", (unsigned char) *p);
                        len = 6;
                } else {
                        len = 2;
@@ -219,7 +225,7 @@ static void blobmsg_format_json_list(struct strbuf *s, struct blob_attr *attr, i
 static void blobmsg_format_element(struct strbuf *s, struct blob_attr *attr, bool without_name, bool head)
 {
        const char *data_str;
-       char buf[32];
+       char buf[317];
        void *data;
        int len;
 
@@ -243,22 +249,22 @@ static void blobmsg_format_element(struct strbuf *s, struct blob_attr *attr, boo
        data_str = buf;
        switch(blob_id(attr)) {
        case BLOBMSG_TYPE_UNSPEC:
-               sprintf(buf, "null");
+               snprintf(buf, sizeof(buf), "null");
                break;
        case BLOBMSG_TYPE_BOOL:
-               sprintf(buf, "%s", *(uint8_t *)data ? "true" : "false");
+               snprintf(buf, sizeof(buf), "%s", *(uint8_t *)data ? "true" : "false");
                break;
        case BLOBMSG_TYPE_INT16:
-               sprintf(buf, "%d", (int16_t) be16_to_cpu(*(uint16_t *)data));
+               snprintf(buf, sizeof(buf), "%" PRId16, (int16_t) be16_to_cpu(*(uint16_t *)data));
                break;
        case BLOBMSG_TYPE_INT32:
-               sprintf(buf, "%d", (int32_t) be32_to_cpu(*(uint32_t *)data));
+               snprintf(buf, sizeof(buf), "%" PRId32, (int32_t) be32_to_cpu(*(uint32_t *)data));
                break;
        case BLOBMSG_TYPE_INT64:
-               sprintf(buf, "%" PRId64, (int64_t) be64_to_cpu(*(uint64_t *)data));
+               snprintf(buf, sizeof(buf), "%" PRId64, (int64_t) be64_to_cpu(*(uint64_t *)data));
                break;
        case BLOBMSG_TYPE_DOUBLE:
-               sprintf(buf, "%lf", blobmsg_get_double(attr));
+               snprintf(buf, sizeof(buf), "%lf", blobmsg_get_double(attr));
                break;
        case BLOBMSG_TYPE_STRING:
                blobmsg_format_string(s, data);