libubox: tests: add more blobmsg/json test cases
[project/libubox.git] / jshn.c
diff --git a/jshn.c b/jshn.c
index 1efe2548b74b9f57b5eb401aa5be2369187b3423..1b685e5fb0d853c4053389242b92c34967beb94f 100644 (file)
--- a/jshn.c
+++ b/jshn.c
@@ -68,7 +68,7 @@ static int add_json_array(struct array_list *a)
        int ret;
 
        for (i = 0, len = array_list_length(a); i < len; i++) {
-               sprintf(seq, "%d", i);
+               snprintf(seq, sizeof(seq), "%d", i);
                ret = add_json_element(seq, array_list_get_idx(a, i));
                if (ret)
                        return ret;
@@ -178,12 +178,15 @@ static int jshn_parse(const char *str)
 
        obj = json_tokener_parse(str);
        if (!obj || json_object_get_type(obj) != json_type_object) {
+               if (obj)
+                       json_object_put(obj);
                fprintf(stderr, "Failed to parse message data\n");
                return 1;
        }
        fprintf(stdout, "json_init;\n");
        add_json_object(obj);
        fflush(stdout);
+       json_object_put(obj);
 
        return 0;
 }
@@ -197,25 +200,27 @@ static char *getenv_avl(const char *key)
 static char *get_keys(const char *prefix)
 {
        char *keys;
+       size_t len = var_prefix_len + strlen(prefix) + sizeof("K_") + 1;
 
-       keys = alloca(var_prefix_len + strlen(prefix) + sizeof("K_") + 1);
-       sprintf(keys, "%sK_%s", var_prefix, prefix);
+       keys = alloca(len);
+       snprintf(keys, len, "%sK_%s", var_prefix, prefix);
        return getenv_avl(keys);
 }
 
 static void get_var(const char *prefix, const char **name, char **var, char **type)
 {
        char *tmpname, *varname;
+       size_t len = var_prefix_len + strlen(prefix) + 1 + strlen(*name) + 1 + sizeof("T_");
 
-       tmpname = alloca(var_prefix_len + strlen(prefix) + 1 + strlen(*name) + 1 + sizeof("T_"));
+       tmpname = alloca(len);
 
-       sprintf(tmpname, "%s%s_%s", var_prefix, prefix, *name);
+       snprintf(tmpname, len, "%s%s_%s", var_prefix, prefix, *name);
        *var = getenv_avl(tmpname);
 
-       sprintf(tmpname, "%sT_%s_%s", var_prefix, prefix, *name);
+       snprintf(tmpname, len, "%sT_%s_%s", var_prefix, prefix, *name);
        *type = getenv_avl(tmpname);
 
-       sprintf(tmpname, "%sN_%s_%s", var_prefix, prefix, *name);
+       snprintf(tmpname, len, "%sN_%s_%s", var_prefix, prefix, *name);
        varname = getenv_avl(tmpname);
        if (varname)
                *name = varname;
@@ -308,7 +313,7 @@ out:
 
 static int usage(const char *progname)
 {
-       fprintf(stderr, "Usage: %s [-n] [-i] -r <message>|-R <file>|-w\n", progname);
+       fprintf(stderr, "Usage: %s [-n] [-i] -r <message>|-R <file>|-o <file>|-p <prefix>|-w\n", progname);
        return 2;
 }
 
@@ -351,7 +356,7 @@ static int jshn_parse_file(const char *path)
                return 3;
        }
 
-       if (!(fbuf = malloc(sb.st_size))) {
+       if (!(fbuf = calloc(1, sb.st_size+1))) {
                fprintf(stderr, "Error allocating memory for %s\n", path);
                close(fd);
                return 3;
@@ -443,12 +448,15 @@ int main(int argc, char **argv)
                        indent = true;
                        break;
                default:
+                       free(vars);
                        return usage(argv[0]);
                }
        }
 
+       free(vars);
        return usage(argv[0]);
 
 exit:
+       free(vars);
        return ret;
 }