X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubus.git;a=blobdiff_plain;f=lua%2Fubus.c;h=86e34b7c0739f6c568925bfb5feeb4d34ca0d570;hp=45ea3bb20c07d7b47cd1aca624d2343b61668abd;hb=5dfd3c16fa1cc9e288c41ef6e3e4c3bc63acf612;hpb=b356773921a89b370f8ccb34c9ea5f21148115ea diff --git a/lua/ubus.c b/lua/ubus.c index 45ea3bb..86e34b7 100644 --- a/lua/ubus.c +++ b/lua/ubus.c @@ -285,10 +285,13 @@ ubus_method_handler(struct ubus_context *ctx, struct ubus_object *obj, struct blob_attr *msg) { struct ubus_lua_object *o = container_of(obj, struct ubus_lua_object, o); + int rv = 0; lua_getglobal(state, "__ubus_cb"); lua_rawgeti(state, -1, o->r); lua_getfield(state, -1, method); + lua_remove(state, -2); + lua_remove(state, -2); if (lua_isfunction(state, -1)) { lua_pushlightuserdata(state, req); @@ -296,9 +299,14 @@ ubus_method_handler(struct ubus_context *ctx, struct ubus_object *obj, lua_pushnil(state); else ubus_lua_parse_blob_array(state, blob_data(msg), blob_len(msg), true); - lua_call(state, 2, 0); + lua_call(state, 2, 1); + if (lua_isnumber(state, -1)) + rv = lua_tonumber(state, -1); } - return 0; + + lua_pop(state, 1); + + return rv; } static int lua_gettablelen(lua_State *L, int index) @@ -349,12 +357,11 @@ static int ubus_lua_load_methods(lua_State *L, struct ubus_method *m) /* get the policy table */ lua_pushinteger(L, 2); lua_gettable(L, -3); - plen = lua_gettablelen(L, -1); /* check if the method table is valid */ if ((lua_type(L, -2) != LUA_TFUNCTION) || (lua_type(L, -1) != LUA_TTABLE) || - lua_objlen(L, -1) || !plen) { + lua_objlen(L, -1)) { lua_pop(L, 2); return 1; } @@ -363,8 +370,22 @@ static int ubus_lua_load_methods(lua_State *L, struct ubus_method *m) lua_pushvalue(L, -2); lua_setfield(L, -6, lua_tostring(L, -5)); + m->name = lua_tostring(L, -4); + m->handler = ubus_method_handler; + + plen = lua_gettablelen(L, -1); + + /* exit if policy table is empty */ + if (!plen) { + lua_pop(L, 2); + return 0; + } + /* setup the policy pointers */ p = malloc(sizeof(struct blobmsg_policy) * plen); + if (!p) + return 1; + memset(p, 0, sizeof(struct blobmsg_policy) * plen); m->policy = p; lua_pushnil(L); @@ -386,8 +407,6 @@ static int ubus_lua_load_methods(lua_State *L, struct ubus_method *m) } m->n_policy = pidx; - m->name = lua_tostring(L, -4); - m->handler = ubus_method_handler; lua_pop(L, 2); return 0; @@ -402,6 +421,9 @@ static struct ubus_object* ubus_lua_load_object(lua_State *L) /* setup object pointers */ obj = malloc(sizeof(struct ubus_lua_object)); + if (!obj) + return NULL; + memset(obj, 0, sizeof(struct ubus_lua_object)); obj->o.name = lua_tostring(L, -2); @@ -412,6 +434,11 @@ static struct ubus_object* ubus_lua_load_object(lua_State *L) /* setup type pointers */ obj->o.type = malloc(sizeof(struct ubus_object_type)); + if (!obj->o.type) { + free(obj); + return NULL; + } + memset(obj->o.type, 0, sizeof(struct ubus_object_type)); obj->o.type->name = lua_tostring(L, -2); obj->o.type->id = 0; @@ -514,10 +541,11 @@ ubus_lua_call_cb(struct ubus_request *req, int type, struct blob_attr *msg) { lua_State *L = (lua_State *)req->priv; - if (!msg) + if (!msg && L) lua_pushnil(L); - ubus_lua_parse_blob_array(L, blob_data(msg), blob_len(msg), true); + if (msg && L) + ubus_lua_parse_blob_array(L, blob_data(msg), blob_len(msg), true); } static int @@ -570,10 +598,13 @@ ubus_event_handler(struct ubus_context *ctx, struct ubus_event_handler *ev, lua_getglobal(state, "__ubus_cb_event"); lua_rawgeti(state, -1, listener->r); + lua_remove(state, -2); if (lua_isfunction(state, -1)) { ubus_lua_parse_blob_array(state, blob_data(msg), blob_len(msg), true); lua_call(state, 1, 0); + } else { + lua_pop(state, 1); } } @@ -583,6 +614,9 @@ ubus_lua_load_event(lua_State *L) struct ubus_lua_event* event = NULL; event = malloc(sizeof(struct ubus_lua_event)); + if (!event) + return NULL; + memset(event, 0, sizeof(struct ubus_lua_event)); event->e.cb = ubus_event_handler; @@ -651,6 +685,7 @@ ubus_lua__gc(lua_State *L) { struct ubus_lua_connection *c = luaL_checkudata(L, 1, METANAME); + blob_buf_free(&c->buf); if (c->ctx != NULL) { ubus_free(c->ctx);