add a few missing null pointer checks, and fix check vs dereference order in some...
authorFelix Fietkau <nbd@openwrt.org>
Fri, 21 Oct 2011 13:13:32 +0000 (15:13 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 21 Oct 2011 13:17:06 +0000 (15:17 +0200)
cli.c
file.c
libuci.c
list.c
uci_internal.h
ucimap-example.c
ucimap.c

diff --git a/cli.c b/cli.c
index cfbf26171531bb5d35a6e0d74136c7d71d709da4..54f9484236d13fde5a0c1e0f5654c54c707b720c 100644 (file)
--- a/cli.c
+++ b/cli.c
@@ -450,7 +450,7 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv)
                ret = uci_add_list(ctx, &ptr);
                break;
        case CMD_REORDER:
-               if (!ptr.s) {
+               if (!ptr.s || !ptr.value) {
                        ctx->err = UCI_ERR_NOTFOUND;
                        cli_perror();
                        return 1;
diff --git a/file.c b/file.c
index 0530eb24b0055df24cd88c72f088288dd59b285d..4eb35b184ff84b9868b3b4ba1f8ddd08e1b6cc4e 100644 (file)
--- a/file.c
+++ b/file.c
@@ -619,7 +619,7 @@ int uci_import(struct uci_context *ctx, FILE *stream, const char *name, struct u
        uci_alloc_parse_context(ctx);
        pctx = ctx->pctx;
        pctx->file = stream;
-       if (*package && single) {
+       if (package && *package && single) {
                pctx->package = *package;
                pctx->merge = true;
        }
index 995d39dad7fdf952eec0aa49b6af92cfcb5ff8cc..4c2bf96f227ee427bce32266814d18178d8f4fc9 100644 (file)
--- a/libuci.c
+++ b/libuci.c
@@ -177,7 +177,7 @@ uci_get_errorstr(struct uci_context *ctx, char **dest, const char *prefix)
        if (dest) {
                err = asprintf(dest, format,
                        (prefix ? prefix : ""), (prefix ? ": " : ""),
-                       (ctx->func ? ctx->func : ""), (ctx->func ? ": " : ""),
+                       (ctx && ctx->func ? ctx->func : ""), (ctx && ctx->func ? ": " : ""),
                        uci_errstr[err],
                        error_info);
                if (err < 0)
@@ -186,7 +186,7 @@ uci_get_errorstr(struct uci_context *ctx, char **dest, const char *prefix)
                strcat(error_info, "\n");
                fprintf(stderr, format,
                        (prefix ? prefix : ""), (prefix ? ": " : ""),
-                       (ctx->func ? ctx->func : ""), (ctx->func ? ": " : ""),
+                       (ctx && ctx->func ? ctx->func : ""), (ctx && ctx->func ? ": " : ""),
                        uci_errstr[err],
                        error_info);
        }
diff --git a/list.c b/list.c
index fabad4d6e62daa622df23bd3143967e51c6500c9..cf6d9705e89af23f09f18112efde24d5e236bd63 100644 (file)
--- a/list.c
+++ b/list.c
@@ -485,7 +485,7 @@ static void uci_add_element_list(struct uci_context *ctx, struct uci_ptr *ptr, b
 int uci_rename(struct uci_context *ctx, struct uci_ptr *ptr)
 {
        /* NB: UCI_INTERNAL use means without delta tracking */
-       bool internal = ctx->internal;
+       bool internal = ctx && ctx->internal;
        struct uci_element *e;
        struct uci_package *p;
        char *n;
@@ -530,7 +530,7 @@ int uci_reorder_section(struct uci_context *ctx, struct uci_section *s, int pos)
 
 int uci_add_section(struct uci_context *ctx, struct uci_package *p, const char *type, struct uci_section **res)
 {
-       bool internal = ctx->internal;
+       bool internal = ctx && ctx->internal;
        struct uci_section *s;
 
        UCI_HANDLE_ERR(ctx);
@@ -547,7 +547,7 @@ int uci_add_section(struct uci_context *ctx, struct uci_package *p, const char *
 int uci_delete(struct uci_context *ctx, struct uci_ptr *ptr)
 {
        /* NB: pass on internal flag to uci_del_element */
-       bool internal = ctx->internal;
+       bool internal = ctx && ctx->internal;
        struct uci_package *p;
        struct uci_element *e;
 
@@ -574,7 +574,7 @@ int uci_delete(struct uci_context *ctx, struct uci_ptr *ptr)
 int uci_add_list(struct uci_context *ctx, struct uci_ptr *ptr)
 {
        /* NB: UCI_INTERNAL use means without delta tracking */
-       bool internal = ctx->internal;
+       bool internal = ctx && ctx->internal;
        struct uci_option *prev = NULL;
        const char *value2 = NULL;
 
@@ -615,7 +615,7 @@ int uci_add_list(struct uci_context *ctx, struct uci_ptr *ptr)
 int uci_set(struct uci_context *ctx, struct uci_ptr *ptr)
 {
        /* NB: UCI_INTERNAL use means without delta tracking */
-       bool internal = ctx->internal;
+       bool internal = ctx && ctx->internal;
 
        UCI_HANDLE_ERR(ctx);
        uci_expand_ptr(ctx, ptr, false);
index e0c4204e3f0039763b98fc310d4e9097f344f30d..02f81f52b8e6936483b1564215f0278fd62da0e2 100644 (file)
@@ -186,9 +186,9 @@ struct uci_backend _var = {         \
 #define UCI_HANDLE_ERR(ctx) do {       \
        DPRINTF("ENTER: %s\n", __func__); \
        int __val = 0;                  \
-       ctx->err = 0;                   \
        if (!ctx)                       \
                return UCI_ERR_INVAL;   \
+       ctx->err = 0;                   \
        if (!ctx->internal && !ctx->nested) \
                __val = setjmp(ctx->trap); \
        ctx->internal = false;          \
index e04c66ddcc6b647ffc704d3e47590634854424f0..18c3c1f05397bcb5137530226f817fbe373e1af9 100644 (file)
@@ -132,6 +132,8 @@ static struct ucimap_section_data *
 network_allocate(struct uci_map *map, struct uci_sectionmap *sm, struct uci_section *s)
 {
        struct uci_network *p = malloc(sizeof(struct uci_network));
+       if (!p)
+               return NULL;
        memset(p, 0, sizeof(struct uci_network));
        return &p->map;
 }
@@ -244,6 +246,8 @@ int main(int argc, char **argv)
 
        INIT_LIST_HEAD(&ifs);
        ctx = uci_alloc_context();
+       if (!ctx)
+               return -1;
        ucimap_init(&network_map);
 
        if ((argc >= 2) && !strcmp(argv[1], "-s")) {
index 6a5c11721bbc79e192d22785e8ce1c7997bdc342..0bc31c58601dbee9bbbfdc75dde2dc65c70b8fea 100644 (file)
--- a/ucimap.c
+++ b/ucimap.c
@@ -295,6 +295,9 @@ realloc:
                offset = (items - (*list)->size) * sizeof(union ucimap_data);
 
        a->ptr = realloc(a->ptr, size);
+       if (!a->ptr)
+               return -ENOMEM;
+
        if (offset)
                memset((char *) a->ptr + offset, 0, size - offset);
        new = a->ptr;