scan-build from clang-9 has reported following:
ubus.c:837:16: warning: Access to field 'rnotify' results in a dereference of a null pointer (loaded from variable 'sub')
sub->rnotify = luaL_ref(L, -2);
Which is false positive as the lua_error() does a long jump and
therefore never returns and this long jump probably confuses the static
analyzer. So this patch workarounds this false positive by helping
static analyzer by using common Lua idiom which is to return
lua_error()'s return value.
Ref: https://www.lua.org/manual/5.1/manual.html#lua_error
Addresses-Coverity-ID:
1412355 ("Dereference after null check")
Signed-off-by: Petr Štetiar <ynezz@true.cz>
/* verify top level object */
if (lua_istable(L, 1)) {
lua_pushstring(L, "you need to pass a table");
/* verify top level object */
if (lua_istable(L, 1)) {
lua_pushstring(L, "you need to pass a table");
- lua_error(L);
- return 0;
if( !lua_islightuserdata( L, 2 ) ){
lua_pushfstring( L, "Invald 2nd parameter, expected ubus obj ref" );
if( !lua_islightuserdata( L, 2 ) ){
lua_pushfstring( L, "Invald 2nd parameter, expected ubus obj ref" );
}
obj = lua_touserdata( L, 2 );
}
obj = lua_touserdata( L, 2 );
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" );
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" );
}
ubus_notify( c->ctx, obj, method, c->buf.head, -1 );
}
ubus_notify( c->ctx, obj, method, c->buf.head, -1 );
ubus_lua_do_subscribe( struct ubus_context *ctx, lua_State *L, const char* target,
int idxnotify, int idxremove )
{
ubus_lua_do_subscribe( struct ubus_context *ctx, lua_State *L, const char* target,
int idxnotify, int idxremove )
{
if( ( status = ubus_lookup_id( ctx, target, &id ) ) ){
lua_pushfstring( L, "Unable find target, status=%d", status );
if( ( status = ubus_lookup_id( ctx, target, &id ) ) ){
lua_pushfstring( L, "Unable find target, status=%d", status );
}
sub = calloc( 1, sizeof( struct ubus_lua_subscriber ) );
if( !sub ){
lua_pushstring( L, "Out of memory" );
}
sub = calloc( 1, sizeof( struct ubus_lua_subscriber ) );
if( !sub ){
lua_pushstring( L, "Out of memory" );
if( ( status = ubus_register_subscriber( ctx, &sub->s ) ) ){
lua_pushfstring( L, "Failed to register subscriber, status=%d", status );
if( ( status = ubus_register_subscriber( ctx, &sub->s ) ) ){
lua_pushfstring( L, "Failed to register subscriber, status=%d", status );
}
if( ( status = ubus_subscribe( ctx, &sub->s, id) ) ){
lua_pushfstring( L, "Failed to register subscriber, status=%d", status );
}
if( ( status = ubus_subscribe( ctx, &sub->s, id) ) ){
lua_pushfstring( L, "Failed to register subscriber, status=%d", status );