uci: tighten uci reorder operation error handling
authorJo-Philipp Wich <jo@mein.io>
Wed, 8 Aug 2018 21:28:34 +0000 (23:28 +0200)
committerJo-Philipp Wich <jo@mein.io>
Wed, 8 Aug 2018 22:07:27 +0000 (00:07 +0200)
- Return UBUS_STATUS_INVALID_ARGUMENT for invalid section names
- Return UBUS_STATUS_NOT_FOUND if a section name could not be resolved

uci.c

diff --git a/uci.c b/uci.c
index e23c95657a22396ef2921a68f01b6677b07a2d4c..1587a197a2bd6eb07345c7d21803b15143fa58e2 100644 (file)
--- a/uci.c
+++ b/uci.c
@@ -1131,7 +1131,7 @@ rpc_uci_order(struct ubus_context *ctx, struct ubus_object *obj,
        struct blob_attr *cur;
        struct uci_package *p = NULL;
        struct uci_ptr ptr = { 0 };
-       int rem, i = 0;
+       int rem, i = 0, err = 0;
 
        blobmsg_parse(rpc_uci_order_policy, __RPC_O_MAX, tb,
                      blob_data(msg), blob_len(msg));
@@ -1150,21 +1150,33 @@ rpc_uci_order(struct ubus_context *ctx, struct ubus_object *obj,
        blobmsg_for_each_attr(cur, tb[RPC_O_SECTIONS], rem)
        {
                if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING)
+               {
+                       if (!err)
+                               err = UBUS_STATUS_INVALID_ARGUMENT;
+
                        continue;
+               }
 
                ptr.s = NULL;
                ptr.section = blobmsg_data(cur);
 
                if (uci_lookup_ptr(cursor, &ptr, NULL, true) || !ptr.s)
+               {
+                       if (!err)
+                               err = UBUS_STATUS_NOT_FOUND;
+
                        continue;
+               }
 
                uci_reorder_section(cursor, ptr.s, i++);
        }
 
-       uci_save(cursor, p);
+       if (!err)
+               uci_save(cursor, p);
+
        uci_unload(cursor, p);
 
-       return rpc_uci_status();
+       return err ? err : rpc_uci_status();
 }
 
 static void