libadmin: Be sure to free the server list in ListCellsRPC 90/14690/2
authorMichael Meffie <mmeffie@sinenomine.net>
Fri, 2 Jul 2021 00:14:12 +0000 (20:14 -0400)
committerBenjamin Kaduk <kaduk@mit.edu>
Sat, 3 Jul 2021 15:34:58 +0000 (11:34 -0400)
Commit 0d6b9defb36cb94f3d34b058f00055e9e99d85fc added a check to avoid
overrunning a buffer when the cell name returned by RXAFSCB_GetCellServDB
is too large for the libadmin buffer, but in that case missed freeing
the server list returned in the same rpc.

Move the xdr_free() of the server list under the cleanup label so the
server list returned by the RPC will always be freed.

Thanks to Mark Vitale for finding this bug.

Change-Id: I4c7228f8c8d48e267f6fbb01cb89fdf5232de97e
Reviewed-on: https://gerrit.openafs.org/14690
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/libadmin/adminutil/afs_utilAdmin.c

index 390af4a..335ad07 100644 (file)
@@ -2027,7 +2027,6 @@ ListCellsRPC(void *rpc_specific, int slot, int *last_item,
         for (n=0; n<sl.serverList_len && n<UTIL_MAX_CELL_HOSTS; n++) {
             t->cell[slot].serverAddr[n] = sl.serverList_val[n];
         }
-        xdr_free((xdrproc_t) xdr_serverList, &sl);
     }
 
     /*
@@ -2042,6 +2041,7 @@ ListCellsRPC(void *rpc_specific, int slot, int *last_item,
     rc = 1;
 
   fail_ListCellsRPC:
+    xdr_free((xdrproc_t) xdr_serverList, &sl);
     xdr_free((xdrproc_t) xdr_string, &name);
 
     if (st != NULL) {