mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
ldb: Ensure we can open a new LDB after a fork()
Based on work for an mdb-specific test by Gary Lockyer Signed-off-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Garming Sam <garming@catalyst.net.nz> Autobuild-User(master): Andrew Bartlett <abartlet@samba.org> Autobuild-Date(master): Wed May 9 07:27:24 CEST 2018 on sn-devel-144
This commit is contained in:
parent
f891b8dc32
commit
ba33d90ed6
@ -4025,6 +4025,66 @@ static void test_lock_read_across_fork(void **state)
|
||||
}
|
||||
}
|
||||
|
||||
static void test_multiple_opens_across_fork(void **state)
|
||||
{
|
||||
struct ldb_context *ldb1 = NULL;
|
||||
struct ldb_context *ldb2 = NULL;
|
||||
int ret;
|
||||
struct ldbtest_ctx *test_ctx = NULL;
|
||||
int pipes[2];
|
||||
char buf[2];
|
||||
int wstatus;
|
||||
pid_t pid, child_pid;
|
||||
|
||||
test_ctx = talloc_get_type_abort(*state, struct ldbtest_ctx);
|
||||
|
||||
/*
|
||||
* Open the database again
|
||||
*/
|
||||
ldb1 = ldb_init(test_ctx, test_ctx->ev);
|
||||
ret = ldb_connect(ldb1, test_ctx->dbpath, LDB_FLG_RDONLY, NULL);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
ldb2 = ldb_init(test_ctx, test_ctx->ev);
|
||||
ret = ldb_connect(ldb2, test_ctx->dbpath, 0, NULL);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
ret = pipe(pipes);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
child_pid = fork();
|
||||
if (child_pid == 0) {
|
||||
struct ldb_context *ldb3 = NULL;
|
||||
|
||||
close(pipes[0]);
|
||||
ldb3 = ldb_init(test_ctx, test_ctx->ev);
|
||||
ret = ldb_connect(ldb3, test_ctx->dbpath, 0, NULL);
|
||||
if (ret != 0) {
|
||||
print_error(__location__": ldb_connect returned (%d)\n",
|
||||
ret);
|
||||
exit(ret);
|
||||
}
|
||||
ret = write(pipes[1], "GO", 2);
|
||||
if (ret != 2) {
|
||||
print_error(__location__
|
||||
" write returned (%d)",
|
||||
ret);
|
||||
exit(LDB_ERR_OPERATIONS_ERROR);
|
||||
}
|
||||
exit(LDB_SUCCESS);
|
||||
}
|
||||
close(pipes[1]);
|
||||
ret = read(pipes[0], buf, 2);
|
||||
assert_int_equal(ret, 2);
|
||||
|
||||
pid = waitpid(child_pid, &wstatus, 0);
|
||||
assert_int_equal(pid, child_pid);
|
||||
|
||||
assert_true(WIFEXITED(wstatus));
|
||||
|
||||
assert_int_equal(WEXITSTATUS(wstatus), 0);
|
||||
}
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
@ -4200,6 +4260,10 @@ int main(int argc, const char **argv)
|
||||
test_lock_read_across_fork,
|
||||
ldbtest_setup,
|
||||
ldbtest_teardown),
|
||||
cmocka_unit_test_setup_teardown(
|
||||
test_multiple_opens_across_fork,
|
||||
ldbtest_setup,
|
||||
ldbtest_teardown),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
|
Loading…
Reference in New Issue
Block a user