From 2d21fe079fb57e55d9bac0c69d8527013bf4fbc7 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 22 Jul 2011 14:55:32 +1000 Subject: s4-messaging: fixed the removal of messaging sockets in child tasks when a child task exits we were firing a destructor on any inherited messaging contexts, which could trigger a removal of the parents message socket and messaging database entry. This adds a new auto_remove flag to imessaging_init(), and exposes the cleanup code for use by the stream service. Pair-Programmed-With: Andrew Bartlett Autobuild-User: Andrew Tridgell Autobuild-Date: Fri Jul 22 08:09:06 CEST 2011 on sn-devel-104 --- source4/lib/messaging/messaging.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'source4/lib/messaging/messaging.c') diff --git a/source4/lib/messaging/messaging.c b/source4/lib/messaging/messaging.c index 484f22b2ee..ccc60032a6 100644 --- a/source4/lib/messaging/messaging.c +++ b/source4/lib/messaging/messaging.c @@ -541,10 +541,11 @@ NTSTATUS imessaging_send_ptr(struct imessaging_context *msg, struct server_id se /* - destroy the messaging context + remove our messaging socket and database entry */ -static int imessaging_destructor(struct imessaging_context *msg) +int imessaging_cleanup(struct imessaging_context *msg) { + DEBUG(5,("imessaging: cleaning up %s\n", msg->path)); unlink(msg->path); while (msg->names && msg->names[0]) { irpc_remove_name(msg, msg->names[0]); @@ -554,11 +555,17 @@ static int imessaging_destructor(struct imessaging_context *msg) /* create the listening socket and setup the dispatcher + + use temporary=true when you want a destructor to remove the + associated messaging socket and database entry on talloc free. Don't + use this in processes that may fork and a child may talloc free this + memory */ struct imessaging_context *imessaging_init(TALLOC_CTX *mem_ctx, - const char *dir, - struct server_id server_id, - struct tevent_context *ev) + const char *dir, + struct server_id server_id, + struct tevent_context *ev, + bool auto_remove) { struct imessaging_context *msg; NTSTATUS status; @@ -622,7 +629,9 @@ struct imessaging_context *imessaging_init(TALLOC_CTX *mem_ctx, EVENT_FD_READ, imessaging_handler, msg); tevent_fd_set_auto_close(msg->event.fde); - talloc_set_destructor(msg, imessaging_destructor); + if (auto_remove) { + talloc_set_destructor(msg, imessaging_cleanup); + } imessaging_register(msg, NULL, MSG_PING, ping_message); imessaging_register(msg, NULL, MSG_IRPC, irpc_handler); @@ -641,7 +650,7 @@ struct imessaging_context *imessaging_client_init(TALLOC_CTX *mem_ctx, struct server_id id; ZERO_STRUCT(id); id.pid = random() % 0x10000000; - return imessaging_init(mem_ctx, dir, id, ev); + return imessaging_init(mem_ctx, dir, id, ev, true); } /* a list of registered irpc server functions -- cgit