From c2a69a364ef857007e752aca11389149ffa4e589 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Wed, 23 Dec 2020 19:06:12 +0100 Subject: uci: manually clear uci_ptr flags after uci_delete() operations This is required to avoid potential use-after-free errors through the uci_set()->uci_delete()->uci_expand_ptr() call chain when passing zero-length strings as values. Ref: https://bugs.openwrt.org/index.php?do=details&task_id=3528 Suggested-by: olegio170 Signed-off-by: Jo-Philipp Wich (cherry picked from commit d3f2041f4363e76fda57dd6b581eb71cf1a0e114) --- uci.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/uci.c b/uci.c index 327b17f..e239433 100644 --- a/uci.c +++ b/uci.c @@ -831,8 +831,10 @@ rpc_uci_merge_set(struct blob_attr *opt, struct uci_ptr *ptr) if (blobmsg_type(opt) == BLOBMSG_TYPE_ARRAY) { - if (ptr->o) + if (ptr->o) { uci_delete(cursor, ptr); + ptr->flags = 0; + } rv = UBUS_STATUS_INVALID_ARGUMENT; @@ -850,6 +852,7 @@ rpc_uci_merge_set(struct blob_attr *opt, struct uci_ptr *ptr) else if (ptr->o && ptr->o->type == UCI_TYPE_LIST) { uci_delete(cursor, ptr); + ptr->flags = 0; if (!rpc_uci_format_blob(opt, &ptr->value)) return UBUS_STATUS_INVALID_ARGUMENT; @@ -981,6 +984,7 @@ rpc_uci_merge_delete(struct blob_attr *opt, struct uci_ptr *ptr) continue; uci_delete(cursor, ptr); + ptr->flags = 0; rv = 0; } -- cgit v1.2.1