int freeuserdata(lua_State *L, void *ptr) { ud_t *ud = userdata(ptr); if(!ud || !IsValid(ud)) return 0; /* already deleted */ CancelValid(ud); udata_free(L, ptr); return 1; }
static int test_alloc_free(void) { struct udata *udata; udata = udata_create_default(); EXPECT_NOT_ERRPTR(udata); udata_free(udata); return 0; }
static int test_pack(void) { uint32_t off, off2; char buf[32765]; struct udata *udata, *udata2; udata = udata_create_default(); EXPECT_NOT_ERRPTR(udata); EXPECT_ZERO(do_test_lookups(udata)); memset(buf, 0, sizeof(buf)); off = 0; EXPECT_EQ(pack_udata(udata, buf, &off, 1), -ENAMETOOLONG); EXPECT_ZERO(pack_udata(udata, buf, &off, sizeof(buf))); off2 = 0; udata2 = unpack_udata(buf, &off2, off / 2); EXPECT_ERRPTR(udata2); udata2 = unpack_udata(buf, &off2, off); EXPECT_NOT_ERRPTR(udata2); EXPECT_ZERO(do_test_lookups(udata2)); udata_free(udata); udata_free(udata2); return 0; }
static int test_lookups(void) { struct udata *udata; struct user *u; udata = udata_create_default(); EXPECT_NOT_ERRPTR(udata); EXPECT_ZERO(do_test_lookups(udata)); u = udata_lookup_user(udata, RF_NOBODY_NAME); if (IS_ERR(u)) return PTR_ERR(u); EXPECT_EQ(user_in_gid(u, RF_SUPERUSER_GID), 0); EXPECT_ZERO(user_add_segid(udata, RF_NOBODY_NAME, 0)); u = udata_lookup_user(udata, RF_NOBODY_NAME); if (IS_ERR(u)) return PTR_ERR(u); EXPECT_EQ(user_in_gid(u, RF_SUPERUSER_GID), 1); udata_free(udata); return 0; }