libubox: tests: add more blobmsg/json test cases
[project/libubox.git] / blobmsg_json.c
index ca9dd1a4a8eff1f959e0ae193e45d4e528e7e04e..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;
@@ -146,7 +152,7 @@ static bool blobmsg_puts(struct strbuf *s, const char *c, int len)
 static void add_separator(struct strbuf *s)
 {
        const char *indent_chars = "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
-       int len;
+       size_t len;
 
        if (!s->indent)
                return;
@@ -185,7 +191,6 @@ static void blobmsg_format_string(struct strbuf *s, const char *str)
                        break;
                case '"':
                case '\\':
-               case '/':
                        escape = *p;
                        break;
                default:
@@ -203,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;
@@ -220,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;
 
@@ -244,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", 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);
@@ -280,7 +285,7 @@ static void blobmsg_format_json_list(struct strbuf *s, struct blob_attr *attr, i
 {
        struct blob_attr *pos;
        bool first = true;
-       int rem = len;
+       size_t rem = len;
 
        blobmsg_puts(s, (array ? "[" : "{" ), 1);
        s->indent_level++;
@@ -316,7 +321,7 @@ static void setup_strbuf(struct strbuf *s, struct blob_attr *attr, blobmsg_json_
 
 char *blobmsg_format_json_with_cb(struct blob_attr *attr, bool list, blobmsg_json_format_t cb, void *priv, int indent)
 {
-       struct strbuf s;
+       struct strbuf s = {0};
        bool array;
        char *ret;
 
@@ -350,7 +355,7 @@ char *blobmsg_format_json_with_cb(struct blob_attr *attr, bool list, blobmsg_jso
 
 char *blobmsg_format_json_value_with_cb(struct blob_attr *attr, blobmsg_json_format_t cb, void *priv, int indent)
 {
-       struct strbuf s;
+       struct strbuf s = {0};
        char *ret;
 
        setup_strbuf(&s, attr, cb, priv, indent);