lua: properly handle corner cases in changes
[project/uci.git] / lua / uci.c
index ac04c11..0667fc2 100644 (file)
--- a/lua/uci.c
+++ b/lua/uci.c
@@ -711,26 +711,38 @@ uci_lua_add_change(lua_State *L, struct uci_element *e)
        if (name) {
                lua_getfield(L, -1, name);
 
-               /* there seems to be no value yet so simply push it as string */
-               if (lua_isnil(L, -1)) {
-                       lua_pushstring(L, value);
-                       lua_setfield(L, -3, name);
+               /* this delta is a list add operation */
+               if (h->cmd == UCI_CMD_LIST_ADD) {
+                       /* there seems to be no table yet */
+                       if (!lua_istable(L, -1)) {
+                               lua_newtable(L);
+
+                               /* if there is a value on the stack already, add */
+                               if (!lua_isnil(L, -2)) {
+                                       lua_pushvalue(L, -2);
+                                       lua_rawseti(L, -2, 1);
+                                       lua_pushstring(L, value);
+                                       lua_rawseti(L, -2, 2);
+
+                               /* this is the first table item */
+                               } else {
+                                       lua_pushstring(L, value);
+                                       lua_rawseti(L, -2, 1);
+                               }
+
+                               lua_setfield(L, -3, name);
+
+                       /* a table is on the top of the stack and this is a subsequent,
+                        * list_add, append this value to table */
+                       } else {
+                               lua_pushstring(L, value);
+                               lua_rawseti(L, -2, lua_objlen(L, -2) + 1);
+                       }
 
-               /* there is already a value, so this change is a list_add,
-                * coerce string into one-element array and append new value */
-               } else if (lua_isstring(L, -1)) {
-                       lua_newtable(L);
-                       lua_pushvalue(L, -2);
-                       lua_rawseti(L, -2, 1);
+               /* non-list change, simply set/replace field */
+               } else {
                        lua_pushstring(L, value);
-                       lua_rawseti(L, -2, 2);
                        lua_setfield(L, -3, name);
-
-               /* a table is on the top of the stack so this is a subsequent,
-                * list_add, append this value to table */
-               } else if (lua_istable(L, -1)) {
-                       lua_pushstring(L, value);
-                       lua_rawseti(L, -2, lua_objlen(L, -2) + 1);
                }
 
                lua_pop(L, 1);