r22749: fix memory leak of nbt_name_request structure which are used to send replies
authorStefan Metzmacher <metze@samba.org>
Mon, 7 May 2007 15:27:50 +0000 (15:27 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:52:09 +0000 (14:52 -0500)
and never have an async callback that could free it.

we only had the memory leak in the error path the
standard path was ok.

metze

source/libcli/nbt/nbtsocket.c

index c1e30fc2457c38f4424ae7a9d20b13c918b215bf..0931de63c81730a4f429f155272489bcb4c4a094 100644 (file)
@@ -45,6 +45,7 @@ static int nbt_name_request_destructor(struct nbt_name_request *req)
                req->name_trn_id = 0;
        }
        if (req->te) {
+               talloc_free(req->te);
                req->te = NULL;
        }
        if (req->nbtsock->send_queue == NULL) {
@@ -102,6 +103,8 @@ failed:
        talloc_free(tmp_ctx);
        if (req->async.fn) {
                req->async.fn(req);
+       } else if (req->is_reply) {
+               talloc_free(req);
        }
        return;
 }
@@ -140,6 +143,8 @@ static void nbt_name_socket_timeout(struct event_context *ev, struct timed_event
        }
        if (req->async.fn) {
                req->async.fn(req);
+       } else if (req->is_reply) {
+               talloc_free(req);
        }
 }
 
@@ -462,9 +467,7 @@ NTSTATUS nbt_name_request_recv(struct nbt_name_request *req)
                if (event_loop_once(req->nbtsock->event_ctx) != 0) {
                        req->state = NBT_REQUEST_ERROR;
                        req->status = NT_STATUS_UNEXPECTED_NETWORK_ERROR;
-                       if (req->async.fn) {
-                               req->async.fn(req);
-                       }
+                       break;
                }
        }
        return req->status;