lua: avoid truncation of large numeric values
[project/ubus.git] / lua / ubus.c
index 4da3c80e07f52c6e3e234dc1534b22f37e9326b7..e2bb0817fc8eda0b24aabb0a31801c224b8e3f29 100644 (file)
@@ -52,11 +52,11 @@ static int
 ubus_lua_parse_blob(lua_State *L, struct blob_attr *attr, bool table);
 
 static int
-ubus_lua_parse_blob_array(lua_State *L, struct blob_attr *attr, int len, bool table)
+ubus_lua_parse_blob_array(lua_State *L, struct blob_attr *attr, size_t len, bool table)
 {
        int rv;
        int idx = 1;
-       int rem = len;
+       size_t rem = len;
        struct blob_attr *pos;
 
        lua_newtable(L);
@@ -196,7 +196,10 @@ ubus_lua_format_blob(lua_State *L, struct blob_buf *b, bool table)
        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:
@@ -557,8 +560,7 @@ static int ubus_lua_add(lua_State *L)
        /* verify top level object */
        if (lua_istable(L, 1)) {
                lua_pushstring(L, "you need to pass a table");
-               lua_error(L);
-               return 0;
+               return lua_error(L);
        }
 
        /* scan each object */
@@ -598,7 +600,7 @@ ubus_lua_notify( lua_State *L )
 
        if( !lua_islightuserdata( L, 2 ) ){
                lua_pushfstring( L, "Invald 2nd parameter, expected ubus obj ref" );
-               lua_error( L );
+               return lua_error( L );
        }
        obj = lua_touserdata( L, 2 );
 
@@ -606,7 +608,7 @@ ubus_lua_notify( lua_State *L )
        blob_buf_init(&c->buf, 0);
        if( !ubus_lua_format_blob_array( L, &c->buf, true ) ){
                lua_pushfstring( L, "Invalid 4th parameter, expected table of arguments" );
-               lua_error( L );
+               return lua_error( L );
        }
 
        ubus_notify( c->ctx, obj, method, c->buf.head, -1 );
@@ -812,7 +814,7 @@ ubus_sub_notify_handler(struct ubus_context *ctx, struct ubus_object *obj,
 
 
 
-static void
+static int
 ubus_lua_do_subscribe( struct ubus_context *ctx, lua_State *L, const char* target,
                         int idxnotify, int idxremove )
 {
@@ -822,13 +824,13 @@ ubus_lua_do_subscribe( struct ubus_context *ctx, lua_State *L, const char* targe
 
        if( ( status = ubus_lookup_id( ctx, target, &id ) ) ){
                lua_pushfstring( L, "Unable find target, status=%d", status );
-               lua_error( L );
+               return lua_error( L );
        }
 
        sub = calloc( 1, sizeof( struct ubus_lua_subscriber ) );
        if( !sub ){
                lua_pushstring( L, "Out of memory" );
-               lua_error( L );
+               return lua_error( L );
        }
 
        if( idxnotify ){
@@ -841,21 +843,23 @@ ubus_lua_do_subscribe( struct ubus_context *ctx, lua_State *L, const char* targe
 
        if( idxremove ){
                lua_getglobal(L, "__ubus_cb_subscribe");
-               lua_pushvalue(L, idxnotify);
-               sub->rnotify = luaL_ref(L, -2);
+               lua_pushvalue(L, idxremove);
+               sub->rremove = luaL_ref(L, -2);
                lua_pop(L, 1);
                sub->s.remove_cb = ubus_sub_remove_handler;
        }
 
        if( ( status = ubus_register_subscriber( ctx, &sub->s ) ) ){
                lua_pushfstring( L, "Failed to register subscriber, status=%d", status );
-               lua_error( L );
+               return lua_error( L );
        }
 
        if( ( status = ubus_subscribe( ctx, &sub->s, id) ) ){
                lua_pushfstring( L, "Failed to register subscriber, status=%d", status );
-               lua_error( L );
+               return lua_error( L );
        }
+
+       return 0;
 }
 
 static int