Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.openwrt.org/project/libubox.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2016-06-21 18:19:10 +0300
committerFelix Fietkau <nbd@nbd.name>2016-06-26 13:53:51 +0300
commit1f019ceea1ed39286e6bccfb3ff936c22fe0f7c0 (patch)
tree92ec3e71ca90b1bb12ff930ac1b7abfa8c1d0e07 /json_script.c
parentc2f2c47f3e9a2d709ec82a79f6fadd3124c18781 (diff)
Fix various memory management issues
Consistently handle allocation failures. Some functions are changed to return bool or int instead of void to allow returning an error. Also fix a buffer size miscalculation in lua/uloop and use _exit() instead of exit() on errors after forking. Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
Diffstat (limited to 'json_script.c')
-rw-r--r--json_script.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/json_script.c b/json_script.c
index b5d414d..463aac8 100644
--- a/json_script.c
+++ b/json_script.c
@@ -45,6 +45,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);
@@ -426,12 +429,15 @@ static int eval_string(struct json_call *call, struct blob_buf *buf, const char
char c = '%';
dest = blobmsg_alloc_string_buffer(buf, name, 1);
+ if (!dest)
+ return -1;
+
next = alloca(strlen(pattern) + 1);
strcpy(next, pattern);
for (str = next; str; str = next) {
const char *cur;
- char *end;
+ char *end, *new_buf;
int cur_len = 0;
bool cur_var = var;
@@ -464,7 +470,14 @@ static int eval_string(struct json_call *call, struct blob_buf *buf, const char
cur_len = end - str;
}
- dest = blobmsg_realloc_string_buffer(buf, len + cur_len + 1);
+ new_buf = blobmsg_realloc_string_buffer(buf, len + cur_len + 1);
+ if (!new_buf) {
+ /* Make eval_string return -1 */
+ var = true;
+ break;
+ }
+
+ dest = new_buf;
memcpy(dest + len, cur, cur_len);
len += cur_len;
}