Attempt to deal gracefully with allocation failures.
authorJuliusz Chroboczek <jch@pps.univ-paris-diderot.fr>
Thu, 25 Jun 2015 22:23:33 +0000 (00:23 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 6 Jul 2015 21:16:47 +0000 (23:16 +0200)
These should probably not happen in practice, but having an explicit
error message may make debugging out-of-memory situations easier.

rcS.c
system.c

diff --git a/rcS.c b/rcS.c
index 8c72c19..b3e3c22 100644 (file)
--- a/rcS.c
+++ b/rcS.c
@@ -115,6 +115,10 @@ static void add_initd(struct runqueue *q, char *file, char *param)
        char *p, *f;
 
        s = calloc_a(sizeof(*s), &f, strlen(file) + 1, &p, strlen(param) + 1);
        char *p, *f;
 
        s = calloc_a(sizeof(*s), &f, strlen(file) + 1, &p, strlen(param) + 1);
+       if (!s) {
+               ERROR("Out of memory in %s.\n", file);
+               return;
+       }
        s->proc.task.type = &initd_type;
        s->proc.task.complete = q_initd_complete;
        if (!strcmp(param, "stop") || !strcmp(param, "shutdown"))
        s->proc.task.type = &initd_type;
        s->proc.task.complete = q_initd_complete;
        if (!strcmp(param, "stop") || !strcmp(param, "shutdown"))
@@ -132,6 +136,11 @@ static int _rc(struct runqueue *q, char *path, const char *file, char *pattern,
        glob_t gl;
        int j;
 
        glob_t gl;
        int j;
 
+       if (!dir) {
+               ERROR("Out of memory in %s.\n", file);
+               return -1;
+       }
+
        DEBUG(2, "running %s/%s%s %s\n", path, file, pattern, param);
        sprintf(dir, "%s/%s%s", path, file, pattern);
        if (glob(dir, GLOB_NOESCAPE | GLOB_MARK, NULL, &gl)) {
        DEBUG(2, "running %s/%s%s %s\n", path, file, pattern, param);
        sprintf(dir, "%s/%s%s", path, file, pattern);
        if (glob(dir, GLOB_NOESCAPE | GLOB_MARK, NULL, &gl)) {
index 77111f9..82c672e 100644 (file)
--- a/system.c
+++ b/system.c
@@ -144,6 +144,11 @@ static int system_board(struct ubus_context *ctx, struct ubus_object *obj,
                                continue;
 
                        dest = blobmsg_alloc_string_buffer(&b, key, strlen(val));
                                continue;
 
                        dest = blobmsg_alloc_string_buffer(&b, key, strlen(val));
+                       if (!dest) {
+                               ERROR("Failed to allocate blob.\n");
+                               continue;
+                       }
+
                        while (val && (ch = *(val++)) != 0) {
                                switch (ch) {
                                case '\'':
                        while (val && (ch = *(val++)) != 0) {
                                switch (ch) {
                                case '\'':