luci-compat: fix evaluating `or()` and `and()` datatype expressions
authorJo-Philipp Wich <jo@mein.io>
Thu, 10 Mar 2022 12:22:25 +0000 (13:22 +0100)
committerJo-Philipp Wich <jo@mein.io>
Thu, 10 Mar 2022 12:31:11 +0000 (13:31 +0100)
Fixes: #5705
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-compat/luasrc/cbi/datatypes.lua

index c1cf01f9cdac26daab1dcdc97d050a43d2a1835a..7ef12eaf32d1b9d7691327a5807de0a434190847 100644 (file)
@@ -13,34 +13,49 @@ module "luci.cbi.datatypes"
 
 
 _M['or'] = function(v, ...)
-       local i
-       for i = 1, select('#', ...), 2 do
+       local i, n = 1, select('#', ...)
+       while i <= n do
                local f = select(i, ...)
-               local a = select(i+1, ...)
                if type(f) ~= "function" then
-                       if f == v then
+                       i = i + 1
+                       local c = v
+                       if type(f) == "number" then
+                               c = tonumber(c)
+                       end
+                       if f == c then
+                               return true
+                       end
+               else
+                       i = i + 2
+                       local a = select(i-1, ...)
+                       if f(v, unpack(a)) then
                                return true
                        end
-                       i = i - 1
-               elseif f(v, unpack(a)) then
-                       return true
                end
        end
        return false
 end
 
 _M['and'] = function(v, ...)
-       local i
-       for i = 1, select('#', ...), 2 do
+       local i, n = 1, select('#', ...)
+       while i <= n do
                local f = select(i, ...)
-               local a = select(i+1, ...)
                if type(f) ~= "function" then
-                       if f ~= v then
+                       i = i + 1
+                       local c = v
+                       if type(f) == "number" then
+                               c = tonumber(c)
+                       end
+                       if f ~= c then
                                return false
                        end
                        i = i - 1
-               elseif not f(v, unpack(a)) then
-                       return false
+               else
+                       i = i + 2
+                       local a = select(i-1, ...)
+                       if not f(v, unpack(a)) then
+                               return false
+                       end
                end
        end
        return true