Since libubox is used by procd, it should deal gracefully with allocation
failures.
---
 blobmsg_json.c |  2 ++
 json_script.c  |  3 +++
 kvlist.c       |  4 ++++
 ustream.c      | 16 +++++++++++++---
 utils.c        |  3 +++
 5 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/blobmsg_json.c b/blobmsg_json.c
index ffde23d..1f2b4bc 100644
--- a/blobmsg_json.c
+++ b/blobmsg_json.c
@@ -297,6 +297,8 @@ char *blobmsg_format_json_with_cb(struct blob_attr *attr, 
bool list, blobmsg_jso
 
        s.len = blob_len(attr);
        s.buf = malloc(s.len);
+        if (!s.buf)
+            return NULL;
        s.pos = 0;
        s.custom_format = cb;
        s.priv = priv;
diff --git a/json_script.c b/json_script.c
index 73c2502..8fe58b0 100644
--- a/json_script.c
+++ b/json_script.c
@@ -44,6 +44,9 @@ json_script_file_from_blobmsg(const char *name, void *data, 
int len)
                name_len = strlen(name) + 1;
 
        f = calloc_a(sizeof(*f) + len, &new_name, name_len);
+        if (!f)
+               return NULL;
+
        memcpy(f->data, data, len);
        if (name)
                f->avl.key = strcpy(new_name, name);
diff --git a/kvlist.c b/kvlist.c
index e0a8acb..4097109 100644
--- a/kvlist.c
+++ b/kvlist.c
@@ -81,6 +81,10 @@ void kvlist_set(struct kvlist *kv, const char *name, const 
void *data)
 
        node = calloc_a(sizeof(struct kvlist_node) + len,
                &name_buf, strlen(name) + 1);
+        if (!node)
+            /* XXX */
+            return;
+
        memcpy(node->data, data, len);
 
        node->avl.key = strcpy(name_buf, name);
diff --git a/ustream.c b/ustream.c
index e7ee9f0..e051b68 100644
--- a/ustream.c
+++ b/ustream.c
@@ -65,6 +65,9 @@ static int ustream_alloc_default(struct ustream *s, struct 
ustream_buf_list *l)
                return -1;
 
        buf = malloc(sizeof(*buf) + l->buffer_len + s->string_data);
+       if (!buf)
+               return -1;
+
        ustream_init_buf(buf, l->buffer_len);
        ustream_add_buf(l, buf);
 
@@ -490,6 +493,8 @@ int ustream_vprintf(struct ustream *s, const char *format, 
va_list arg)
                        return ustream_write_buffered(s, buf, maxlen, wr);
                } else {
                        buf = malloc(maxlen + 1);
+                       if (!buf)
+                               return 0;
                        wr = vsnprintf(buf, maxlen + 1, format, arg);
                        wr = ustream_write(s, buf, wr, false);
                        free(buf);
@@ -507,20 +512,25 @@ int ustream_vprintf(struct ustream *s, const char 
*format, va_list arg)
        maxlen = vsnprintf(buf, buflen, format, arg2);
        va_end(arg2);
 
+       buf = malloc(maxlen + 1);
+       if (!buf)
+               return 0;
+
        wr = maxlen;
        if (wr >= buflen)
                wr = buflen - 1;
 
        l->data_tail->tail += wr;
        l->data_bytes += wr;
-       if (maxlen < buflen)
+       if (maxlen < buflen) {
+               free(buf);
                return wr;
+       }
 
-       buf = malloc(maxlen + 1);
        maxlen = vsnprintf(buf, maxlen + 1, format, arg);
        wr = ustream_write_buffered(s, buf + wr, maxlen - wr, wr);
-       free(buf);
 
+       free(buf);
        return wr;
 }
 
diff --git a/utils.c b/utils.c
index 8fd19f4..e9a1b69 100644
--- a/utils.c
+++ b/utils.c
@@ -43,6 +43,9 @@ void *__calloc_a(size_t len, ...)
        va_end(ap1);
 
        ptr = calloc(1, alloc_len);
+        if(ptr == NULL)
+               return NULL;
+
        alloc_len = 0;
        foreach_arg(ap, cur_addr, cur_len, &ret, len) {
                *cur_addr = &ptr[alloc_len];
-- 
2.1.4
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to