messaging: Fix a memleak (master only..)
authorVolker Lendecke <vl@samba.org>
Wed, 8 Jan 2014 15:32:39 +0000 (16:32 +0100)
committerJeremy Allison <jra@samba.org>
Fri, 10 Jan 2014 00:20:03 +0000 (01:20 +0100)
Immediate tevents don't free themselves as timed events do :-)

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Fri Jan 10 01:20:04 CET 2014 on sn-devel-104

source3/lib/messages.c

index e6681b54d8c65e339b2ad28aebdcfc11e3e35f8c..ba473ae8ae284b35f7a9d0cbc71e0e50801230d3 100644 (file)
@@ -376,15 +376,10 @@ NTSTATUS messaging_send(struct messaging_context *msg_ctx,
                struct messaging_selfsend_state *state;
                struct tevent_immediate *im;
 
-               im = tevent_create_immediate(msg_ctx);
-               if (im == NULL) {
-                       return NT_STATUS_NO_MEMORY;
-               }
-
                state = talloc_pooled_object(
-                       im, struct messaging_selfsend_state, 1, data->length);
+                       msg_ctx, struct messaging_selfsend_state,
+                       1, data->length);
                if (state == NULL) {
-                       TALLOC_FREE(im);
                        return NT_STATUS_NO_MEMORY;
                }
                state->msg = msg_ctx;
@@ -397,6 +392,12 @@ NTSTATUS messaging_send(struct messaging_context *msg_ctx,
                state->rec.buf = data_blob_talloc(
                        state, data->data, data->length);
 
+               im = tevent_create_immediate(state);
+               if (im == NULL) {
+                       TALLOC_FREE(state);
+                       return NT_STATUS_NO_MEMORY;
+               }
+
                tevent_schedule_immediate(im, msg_ctx->event_ctx,
                                          messaging_trigger_self, state);
                return NT_STATUS_OK;
@@ -413,6 +414,7 @@ static void messaging_trigger_self(struct tevent_context *ev,
        struct messaging_selfsend_state *state = talloc_get_type_abort(
                private_data, struct messaging_selfsend_state);
        messaging_dispatch_rec(state->msg, &state->rec);
+       TALLOC_FREE(state);
 }
 
 NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx,