r12247: - reject freeing the wrepl_socket inside of wrepl_socket_dead()
authorStefan Metzmacher <metze@samba.org>
Wed, 14 Dec 2005 21:27:29 +0000 (21:27 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:47:24 +0000 (13:47 -0500)
- free it at the end of wrepl_socket_dead() if needed

metze
(This used to be commit 58285115c83a3b7bbc9bf52a105cebd11831e9d8)

source4/libcli/wrepl/winsrepl.c
source4/libcli/wrepl/winsrepl.h

index adb2f094695fd587190812ddcb6702e822e916b4..ead83768344c9b2525cbabcd1abd806b6940ec04 100644 (file)
@@ -35,7 +35,6 @@ static struct wrepl_request *wrepl_request_finished(struct wrepl_request *req, N
 */
 static void wrepl_socket_dead(struct wrepl_socket *wrepl_socket, NTSTATUS status)
 {
-       talloc_set_destructor(wrepl_socket, NULL);
        wrepl_socket->dead = True;
 
        if (wrepl_socket->packet) {
@@ -62,6 +61,11 @@ static void wrepl_socket_dead(struct wrepl_socket *wrepl_socket, NTSTATUS status
                DLIST_REMOVE(wrepl_socket->recv_queue, req);
                wrepl_request_finished(req, status);
        }
+
+       talloc_set_destructor(wrepl_socket, NULL);
+       if (wrepl_socket->free_skipped) {
+               talloc_free(wrepl_socket);
+       }
 }
 
 static void wrepl_request_timeout_handler(struct event_context *ev, struct timed_event *te,
@@ -135,6 +139,10 @@ static void wrepl_error(void *private, NTSTATUS status)
 static int wrepl_socket_destructor(void *ptr)
 {
        struct wrepl_socket *sock = talloc_get_type(ptr, struct wrepl_socket);
+       if (sock->dead) {
+               sock->free_skipped = True;
+               return -1;
+       }
        wrepl_socket_dead(sock, NT_STATUS_LOCAL_DISCONNECT);
        return 0;
 }
index 9bedfe7548c88e1413cd39c92fdcc2389ae3f11a..e679bef6e630db03010bf7d59fd3498edaf248bf 100644 (file)
@@ -47,6 +47,9 @@ struct wrepl_socket {
 
        /* remember is the socket is dead */
        BOOL dead;
+
+       /* remember if we need to free the wrepl_socket at the end of wrepl_socket_dead() */
+       BOOL free_skipped;
 };
 
 struct wrepl_send_ctrl {