luci-lib-jsonc: store large JSON integer values as Lua doubles
authorJo-Philipp Wich <jo@mein.io>
Wed, 13 Nov 2019 08:03:38 +0000 (09:03 +0100)
committerJo-Philipp Wich <jo@mein.io>
Wed, 13 Nov 2019 08:12:30 +0000 (09:12 +0100)
Fixes: #3293
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 8da8f38bf97c925f6f113d3b4793edb23e7e0dc2)

libs/luci-lib-jsonc/src/jsonc.c

index ef1110166055a78bf32cf1a6fbbd3e356b2bce3f..03a5c621bedfe134ef9bfd26d090b8b92e5a6a2e 100644 (file)
@@ -17,6 +17,7 @@ limitations under the License.
 #define _GNU_SOURCE
 
 #include <math.h>
+#include <stdint.h>
 #include <stdbool.h>
 #include <json-c/json.h>
 
@@ -138,6 +139,7 @@ static int json_parse_chunk(lua_State *L)
 
 static void _json_to_lua(lua_State *L, struct json_object *obj)
 {
+       int64_t v;
        int n;
 
        switch (json_object_get_type(obj))
@@ -165,7 +167,12 @@ static void _json_to_lua(lua_State *L, struct json_object *obj)
                break;
 
        case json_type_int:
-               lua_pushinteger(L, json_object_get_int(obj));
+               v = json_object_get_int64(obj);
+               if (sizeof(lua_Integer) > sizeof(int32_t) ||
+                   (v >= INT32_MIN && v <= INT32_MAX))
+                       lua_pushinteger(L, (lua_Integer)v);
+               else
+                       lua_pushnumber(L, (lua_Number)v);
                break;
 
        case json_type_double: