From: Jo-Philipp Wich Date: Thu, 10 Mar 2022 12:22:25 +0000 (+0100) Subject: luci-compat: fix evaluating `or()` and `and()` datatype expressions X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=03bb0e2493840b155d91fb67b4d47385ec363127;p=project%2Fluci.git luci-compat: fix evaluating `or()` and `and()` datatype expressions Fixes: #5705 Signed-off-by: Jo-Philipp Wich --- diff --git a/modules/luci-compat/luasrc/cbi/datatypes.lua b/modules/luci-compat/luasrc/cbi/datatypes.lua index c1cf01f9cd..7ef12eaf32 100644 --- a/modules/luci-compat/luasrc/cbi/datatypes.lua +++ b/modules/luci-compat/luasrc/cbi/datatypes.lua @@ -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