summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2010-06-10 13:17:35 -0700
committerJeremy Allison <jra@samba.org>2010-06-10 13:17:35 -0700
commitb5638a05601ce8206a85c2f3625f8894ed0e0a6f (patch)
treee8baf3ff8ceab674e54f5942784f2c8b70912484 /source3
parent405a0c558c023a752e88e52b7e40048d3b7090c5 (diff)
downloadsamba-b5638a05601ce8206a85c2f3625f8894ed0e0a6f.tar.gz
samba-b5638a05601ce8206a85c2f3625f8894ed0e0a6f.tar.bz2
samba-b5638a05601ce8206a85c2f3625f8894ed0e0a6f.zip
Don't use the autofree context for the globals. This causes child smbd's forked
by modules to crash due to destructors being called (found when using the vfs_aio_fork module with smb2). Jeremy.
Diffstat (limited to 'source3')
-rw-r--r--source3/smbd/globals.c14
-rw-r--r--source3/smbd/server.c7
-rw-r--r--source3/smbd/server_exit.c1
3 files changed, 19 insertions, 3 deletions
diff --git a/source3/smbd/globals.c b/source3/smbd/globals.c
index 30a306efbb..3150b9f67f 100644
--- a/source3/smbd/globals.c
+++ b/source3/smbd/globals.c
@@ -125,7 +125,12 @@ struct smbd_server_connection *smbd_server_conn = NULL;
struct messaging_context *smbd_messaging_context(void)
{
if (smbd_msg_ctx == NULL) {
- smbd_msg_ctx = messaging_init(talloc_autofree_context(),
+ /*
+ * Note we MUST use the NULL context here, not the
+ * autofree context, to avoid side effects in forked
+ * children exiting.
+ */
+ smbd_msg_ctx = messaging_init(NULL,
procid_self(),
smbd_event_context());
}
@@ -138,7 +143,12 @@ struct messaging_context *smbd_messaging_context(void)
struct memcache *smbd_memcache(void)
{
if (!smbd_memcache_ctx) {
- smbd_memcache_ctx = memcache_init(talloc_autofree_context(),
+ /*
+ * Note we MUST use the NULL context here, not the
+ * autofree context, to avoid side effects in forked
+ * children exiting.
+ */
+ smbd_memcache_ctx = memcache_init(NULL,
lp_max_stat_cache_size()*1024);
}
if (!smbd_memcache_ctx) {
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 184b613810..a7297d6863 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -50,7 +50,12 @@ int get_client_fd(void)
struct event_context *smbd_event_context(void)
{
if (!smbd_event_ctx) {
- smbd_event_ctx = event_context_init(talloc_autofree_context());
+ /*
+ * Note we MUST use the NULL context here, not the
+ * autofree context, to avoid side effects in forked
+ * children exiting.
+ */
+ smbd_event_ctx = event_context_init(NULL);
}
if (!smbd_event_ctx) {
smb_panic("Could not init smbd event context");
diff --git a/source3/smbd/server_exit.c b/source3/smbd/server_exit.c
index 868cd67b4f..3e0da3e1cf 100644
--- a/source3/smbd/server_exit.c
+++ b/source3/smbd/server_exit.c
@@ -121,6 +121,7 @@ static void exit_server_common(enum server_exit_reason how,
TALLOC_FREE(smbd_server_conn);
TALLOC_FREE(smbd_msg_ctx);
TALLOC_FREE(smbd_event_ctx);
+ TALLOC_FREE(smbd_memcache_ctx);
if (how != SERVER_EXIT_NORMAL) {
int oldlevel = DEBUGLEVEL;