h_GetHost_r cleanup cases
authorDerrick Brashear <shadow@dementia.org>
Fri, 25 Sep 2009 09:19:33 +0000 (05:19 -0400)
committerJeffrey Altman <jaltman|account-1000011@unknown>
Fri, 25 Sep 2009 16:51:54 +0000 (09:51 -0700)
avoid potentially leaking a cb_in or a capabilities blob;
use a common exit function and free when these were left set.

Reviewed-on: http://gerrit.openafs.org/496
Tested-by: Alistair Ferguson <alistair.ferguson@mac.com>
Reviewed-by: Alistair Ferguson <alistair.ferguson@mac.com>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>

src/viced/host.c

index 877c3f6..53089bc 100644 (file)
@@ -1560,7 +1560,8 @@ h_GetHost_r(struct rx_connection *tcon)
            h_threadquota(host->lock.num_waiting)) {
            if (!held)
                h_Release_r(host);
-           return 0;
+           host = NULL;
+           goto gethost_out;
        }
        h_Lock_r(host);
        if (!(host->hostFlags & ALTADDR)) {
@@ -1772,7 +1773,8 @@ h_GetHost_r(struct rx_connection *tcon)
                     h_Release_r(host);
                 host = NULL;
                 rx_DestroyConnection(cb_in);
-                return 0;
+               cb_in = NULL;
+               goto gethost_out;
            } else {
                ViceLog(0,
                        ("CB: WhoAreYou failed for host %" AFS_PTR_FMT " (%s:%d), error %d\n",
@@ -2060,10 +2062,16 @@ h_GetHost_r(struct rx_connection *tcon)
        host->hostFlags &= ~HWHO_INPROGRESS;
        h_Unlock_r(host);
     }
+
+ gethost_out:
     if (caps.Capabilities_val)
        free(caps.Capabilities_val);
     caps.Capabilities_val = NULL;
     caps.Capabilities_len = 0;
+    if (cb_in) {
+        rx_DestroyConnection(cb_in);
+        cb_in = NULL;
+    }
     return host;
 
 }                              /*h_GetHost_r */