lua: avoid truncation of large numeric values master
authorAlin Nastac <alin.nastac@gmail.com>
Mon, 3 Feb 2020 12:58:04 +0000 (13:58 +0100)
committerJo-Philipp Wich <jo@mein.io>
Sun, 15 Mar 2020 19:49:27 +0000 (20:49 +0100)
If the Lua number exceeds the maximum value representable by an
unsigned 32bit integer, store it in an unsigned 64bit integer
field instead.

Signed-off-by: Alin Nastac <alin.nastac@gmail.com>
[align code style, reword commit message]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
lua/ubus.c

index 86dcc5007b3a2776a611bf6c0a9255b7c5d0b946..e2bb0817fc8eda0b24aabb0a31801c224b8e3f29 100644 (file)
@@ -196,7 +196,10 @@ ubus_lua_format_blob(lua_State *L, struct blob_buf *b, bool table)
        case LUA_TINT:
 #endif
        case LUA_TNUMBER:
        case LUA_TINT:
 #endif
        case LUA_TNUMBER:
-               blobmsg_add_u32(b, key, (uint32_t)lua_tointeger(L, -1));
+               if ((uint64_t)lua_tonumber(L, -1) > INT_MAX)
+                       blobmsg_add_u64(b, key, (uint64_t)lua_tonumber(L, -1));
+               else
+                       blobmsg_add_u32(b, key, (uint32_t)lua_tointeger(L, -1));
                break;
 
        case LUA_TSTRING:
                break;
 
        case LUA_TSTRING: