XDR memory management fixes
authorSimon Wilkinson <sxw@inf.ed.ac.uk>
Wed, 27 Jan 2010 02:30:09 +0000 (02:30 +0000)
committerDerrick Brashear <shadow|account-1000005@unknown>
Wed, 27 Jan 2010 17:14:11 +0000 (09:14 -0800)
Change the xdr_free function so that it matches in signature and
behaviour the xdr_free that is available in other xdr packages, and
update all callers.

Don't use xdr_alloc where the data we're allocating isn't freed by
xdr. The only place where xdr_alloc is required is in server stubs
when filling OUT parameters.

Change-Id: Ice231f163726afc374cb25a89302e3d82fa1e093
Reviewed-on: http://gerrit.openafs.org/1168
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/WINNT/afsd/cm_server.c
src/WINNT/afsd/cm_volume.c
src/afs/afs_volume.c
src/libadmin/adminutil/afs_utilAdmin.c
src/ptserver/ptuser.c
src/rx/xdr.c
src/rx/xdr_prototypes.h

index fa78028..3619dcf 100644 (file)
@@ -181,7 +181,7 @@ cm_PingServer(cm_server_t *tsp)
        /* we currently handle 32-bits of capabilities */
        if (caps.Capabilities_len > 0) {
            tsp->capabilities = caps.Capabilities_val[0];
-           xdr_free(caps.Capabilities_val, caps.Capabilities_len);
+           xdr_free((xdrproc_t) xdr_Capabilities, &caps);
            caps.Capabilities_len = 0;
            caps.Capabilities_val = 0;
        } else {
@@ -470,7 +470,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
                 /* we currently handle 32-bits of capabilities */
                 if (caps[i].Capabilities_len > 0) {
                     tsp->capabilities = caps[i].Capabilities_val[0];
-                    xdr_free(caps[i].Capabilities_val, caps[i].Capabilities_len);
+                    xdr_free((xdrproc_t) xdr_Capabilities, &caps[i]);
                     caps[i].Capabilities_len = 0;
                     caps[i].Capabilities_val = 0;
                 } else {
index f14ef43..8786260 100644 (file)
@@ -415,7 +415,7 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *
                         serverUUID[j] = uuid;
                     }
 
-                    xdr_free(addrs.bulkaddrs_val, addrs.bulkaddrs_len * sizeof(*addrs.bulkaddrs_val));
+                    xdr_free((xdrproc_t) xdr_bulkaddrs, &addrs);
 
                     if (nentries == 0)
                         code = CM_ERROR_INVAL;
index 43bf72f..5c3775f 100644 (file)
@@ -1100,8 +1100,7 @@ InstallUVolumeEntry(struct volume *av, struct uvldbentry *ve, int acell,
                ts = afs_GetServer(addrp, nentries, acell, cellp->fsport,
                                   WRITE_LOCK, &ve->serverNumber[i],
                                   ve->serverUnique[i]);
-               xdr_free(addrs.bulkaddrs_val,
-                        addrs.bulkaddrs_len * sizeof(*addrp));
+               xdr_free((xdrproc_t) xdr_bulkaddrs, &addrs);
            }
        }
        av->serverHost[j] = ts;
index 7049a46..f13294e 100644 (file)
@@ -2018,7 +2018,7 @@ 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(sl.serverList_val, sl.serverList_len);
+        xdr_free((xdrproc_t) xdr_serverList, &sl);
     }
 
     /*
index c1384c2..59a0f02 100644 (file)
@@ -338,7 +338,7 @@ pr_AddToGroup(char *user, char *group)
     idlist lids;
 
     lnames.namelist_len = 2;
-    lnames.namelist_val = (prname *) xdr_alloc(2 * PR_MAXNAMELEN);
+    lnames.namelist_val = malloc(2 * PR_MAXNAMELEN);
     strncpy(lnames.namelist_val[0], user, PR_MAXNAMELEN);
     strncpy(lnames.namelist_val[1], group, PR_MAXNAMELEN);
     lids.idlist_val = 0;
@@ -357,9 +357,9 @@ pr_AddToGroup(char *user, char *group)
                  lids.idlist_val[1]);
   done:
     if (lnames.namelist_val)
-       xdr_free(lnames.namelist_val, 2 * PR_MAXNAMELEN);
-    if (lids.idlist_val)
-       xdr_free(lids.idlist_val, lids.idlist_len * sizeof(lids.idlist_val[0]));
+       free(lnames.namelist_val);
+
+    xdr_free((xdrproc_t) xdr_idlist, &lids);
     return code;
 }
 
@@ -371,7 +371,7 @@ pr_RemoveUserFromGroup(char *user, char *group)
     idlist lids;
 
     lnames.namelist_len = 2;
-    lnames.namelist_val = (prname *) xdr_alloc(2 * PR_MAXNAMELEN);
+    lnames.namelist_val = malloc(2 * PR_MAXNAMELEN);
     strncpy(lnames.namelist_val[0], user, PR_MAXNAMELEN);
     strncpy(lnames.namelist_val[1], group, PR_MAXNAMELEN);
     lids.idlist_val = 0;
@@ -390,11 +390,11 @@ pr_RemoveUserFromGroup(char *user, char *group)
                  lids.idlist_val[1]);
   done:
     if (lnames.namelist_val)
-       xdr_free(lnames.namelist_val, 2 * PR_MAXNAMELEN);
-    if (lids.idlist_val)
-       xdr_free(lids.idlist_val, lids.idlist_len * sizeof(lids.idlist_val[0]));
-    return code;
+       free(lnames.namelist_val);
+
+    xdr_free((xdrproc_t) xdr_idlist, &lids);
 
+    return code;
 }
 
 int
@@ -419,16 +419,16 @@ pr_SNameToId(char name[PR_MAXNAMELEN], afs_int32 *id)
     lids.idlist_len = 0;
     lids.idlist_val = 0;
     lnames.namelist_len = 1;
-    lnames.namelist_val = (prname *) xdr_alloc(PR_MAXNAMELEN);
+    lnames.namelist_val = malloc(PR_MAXNAMELEN);
     stolower(name);
     strncpy(lnames.namelist_val[0], name, PR_MAXNAMELEN);
     code = ubik_PR_NameToID(pruclient, 0, &lnames, &lids);
     if (lids.idlist_val) {
        *id = *lids.idlist_val;
-       xdr_free(lids.idlist_val, lids.idlist_len * sizeof(lids.idlist_val[0]));
+       xdr_free((xdrproc_t) xdr_idlist, &lids);
     }
     if (lnames.namelist_val)
-       xdr_free(lnames.namelist_val, PR_MAXNAMELEN);
+       free(lnames.namelist_val);
     return code;
 }
 
@@ -449,17 +449,20 @@ pr_SIdToName(afs_int32 id, char name[PR_MAXNAMELEN])
     register afs_int32 code;
 
     lids.idlist_len = 1;
-    lids.idlist_val = (afs_int32 *) xdr_alloc(sizeof(afs_int32));
+    lids.idlist_val = malloc(sizeof(afs_int32));
     *lids.idlist_val = id;
     lnames.namelist_len = 0;
     lnames.namelist_val = 0;
     code = ubik_PR_IDToName(pruclient, 0, &lids, &lnames);
-    if (lnames.namelist_val) {
+
+    if (lnames.namelist_val)
        strncpy(name, lnames.namelist_val[0], PR_MAXNAMELEN);
-       xdr_free(lnames.namelist_val, PR_MAXNAMELEN);
-    }
+
     if (lids.idlist_val)
-       xdr_free(lids.idlist_val, lids.idlist_len * sizeof(lids.idlist_val[0]));
+       free(lids.idlist_val);
+
+    xdr_free((xdrproc_t) xdr_namelist, &lnames);
+
     return code;
 }
 
@@ -554,12 +557,14 @@ pr_ListOwned(afs_int32 oid, namelist *lnames, afs_int32 *moreP)
                oid);
        *moreP = 0;
     }
-    lids = (idlist *) & alist;
+    lids = (idlist *) &alist;
     code = pr_IdToName(lids, lnames);
+
+    xdr_free((xdrproc_t) xdr_prlist, &alist);
+
     if (code)
        return code;
-    if (alist.prlist_val)
-       xdr_free(alist.prlist_val, alist.prlist_len * sizeof(alist.prlist_val[0]));
+
     return PRSUCCESS;
 }
 
@@ -580,12 +585,13 @@ pr_IDListMembers(afs_int32 gid, namelist *lnames)
        fprintf(stderr, "membership list for id %d exceeds display limit\n",
                gid);
     }
-    lids = (idlist *) & alist;
+    lids = (idlist *) &alist;
     code = pr_IdToName(lids, lnames);
+
+    xdr_free((xdrproc_t) xdr_prlist, &alist);
+
     if (code)
        return code;
-    if (alist.prlist_val)
-       xdr_free(alist.prlist_val, alist.prlist_len * sizeof(alist.prlist_val[0]));
     return PRSUCCESS;
 }
 
@@ -704,7 +710,7 @@ pr_IsAMemberOf(char *uname, char *gname, afs_int32 *flag)
     stolower(uname);
     stolower(gname);
     lnames.namelist_len = 2;
-    lnames.namelist_val = (prname *) xdr_alloc(2 * PR_MAXNAMELEN);
+    lnames.namelist_val = malloc(2 * PR_MAXNAMELEN);
     strncpy(lnames.namelist_val[0], uname, PR_MAXNAMELEN);
     strncpy(lnames.namelist_val[1], gname, PR_MAXNAMELEN);
     lids.idlist_val = 0;
@@ -712,18 +718,16 @@ pr_IsAMemberOf(char *uname, char *gname, afs_int32 *flag)
     code = pr_NameToId(&lnames, &lids);
     if (code) {
        if (lnames.namelist_val)
-           xdr_free(lnames.namelist_val, 2 * PR_MAXNAMELEN);
-       if (lids.idlist_val)
-           xdr_free(lids.idlist_val, lids.idlist_len * sizeof(lids.idlist_val[0]));
+           free(lnames.namelist_val);
+       xdr_free((xdrproc_t) xdr_idlist, &lids);
        return code;
     }
     code =
        ubik_PR_IsAMemberOf(pruclient, 0, lids.idlist_val[0],
                  lids.idlist_val[1], flag);
     if (lnames.namelist_val)
-       xdr_free(lnames.namelist_val, 2 * PR_MAXNAMELEN);
-    if (lids.idlist_val)
-       xdr_free(lids.idlist_val, lids.idlist_len * sizeof(lids.idlist_val[0]));
+       free(lnames.namelist_val);
+    xdr_free((xdrproc_t) xdr_idlist, &lids);
     return code;
 }
 
index 103bf4c..4481c39 100644 (file)
@@ -589,8 +589,11 @@ xdr_alloc(afs_int32 size)
 }
 
 void
-xdr_free(void *x, afs_int32 size)
+xdr_free(xdrproc_t proc, void *obj)
 {
-    osi_free(x, size);
+    XDR x;
+
+    x.x_op = XDR_FREE;
+    (*proc)(&x, obj);
 }
 #endif /* NeXT */
index 769fe22..d000aee 100644 (file)
@@ -59,7 +59,7 @@ extern bool_t xdr_union(XDR * xdrs, enum_t * dscmp, caddr_t unp,
 extern bool_t xdr_string(XDR * xdrs, char **cpp, u_int maxsize);
 extern bool_t xdr_wrapstring(XDR * xdrs, char **cpp);
 extern void * xdr_alloc(afs_int32 size);
-extern void   xdr_free(void *x, afs_int32 size);
+extern void   xdr_free(xdrproc_t proc, void *obj);
 
 
 /* xdr_float.c */