X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=json_script.c;h=73c25022e11c8d42e23077c8b08146b28ba30abd;hb=b8d9b382e39823850331edc2a92379173daf1be3;hp=9d5e9d2bf5a4287149e00284fc8924e01ac11978;hpb=d416bf66555c9398f81b4546c96084b1d311fd8d;p=project%2Flibubox.git diff --git a/json_script.c b/json_script.c index 9d5e9d2..73c2502 100644 --- a/json_script.c +++ b/json_script.c @@ -333,12 +333,16 @@ static int handle_expr_or(struct json_call *call, struct blob_attr *expr) static int handle_expr_not(struct json_call *call, struct blob_attr *expr) { struct blob_attr *tb[3]; + int ret; json_get_tuple(expr, tb, BLOBMSG_TYPE_ARRAY, 0); if (!tb[1]) return -1; - return json_process_expr(call, tb[1]); + ret = json_process_expr(call, tb[1]); + if (ret < 0) + return ret; + return !ret; } static const struct json_handler expr[] = { @@ -416,7 +420,7 @@ static int eval_string(struct json_call *call, struct blob_buf *buf, const char } if (cur_var) { - if (next > str) { + if (end > str) { cur = msg_find_var(call, str); if (!cur) continue; @@ -434,7 +438,7 @@ static int eval_string(struct json_call *call, struct blob_buf *buf, const char cur_len = end - str; } - dest = blobmsg_realloc_string_buffer(buf, cur_len + 1); + dest = blobmsg_realloc_string_buffer(buf, len + cur_len + 1); memcpy(dest + len, cur, cur_len); len += cur_len; } @@ -582,12 +586,17 @@ void json_script_run(struct json_script_ctx *ctx, const char *name, json_script_run_file(ctx, file, vars); } -static void __json_script_file_free(struct json_script_ctx *ctx, struct json_script_file *f) +static void __json_script_file_free(struct json_script_file *f) { struct json_script_file *next; - for (next = f->next; f; f = next, next = f->next) - free(f); + if (!f) + return; + + next = f->next; + free(f); + + __json_script_file_free(next); } void @@ -596,7 +605,7 @@ json_script_free(struct json_script_ctx *ctx) struct json_script_file *f, *next; avl_remove_all_elements(&ctx->files, f, avl, next) - __json_script_file_free(ctx, f); + __json_script_file_free(f); blob_buf_free(&ctx->buf); }