From: Simon Wilkinson Date: Wed, 27 Jan 2010 02:30:09 +0000 (+0000) Subject: XDR memory management fixes X-Git-Tag: openafs-devel-1_5_71~18 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=f02f2e80267fb45c22ab199dee0e0c15425674b6;p=packages%2Fo%2Fopenafs.git XDR memory management fixes 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 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- diff --git a/src/WINNT/afsd/cm_server.c b/src/WINNT/afsd/cm_server.c index fa7802869..3619dcf77 100644 --- a/src/WINNT/afsd/cm_server.c +++ b/src/WINNT/afsd/cm_server.c @@ -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 { diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index f14ef4361..878626086 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -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; diff --git a/src/afs/afs_volume.c b/src/afs/afs_volume.c index 43bf72f8c..5c3775f3f 100644 --- a/src/afs/afs_volume.c +++ b/src/afs/afs_volume.c @@ -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; diff --git a/src/libadmin/adminutil/afs_utilAdmin.c b/src/libadmin/adminutil/afs_utilAdmin.c index 7049a46e1..f13294e00 100644 --- a/src/libadmin/adminutil/afs_utilAdmin.c +++ b/src/libadmin/adminutil/afs_utilAdmin.c @@ -2018,7 +2018,7 @@ ListCellsRPC(void *rpc_specific, int slot, int *last_item, for (n=0; ncell[slot].serverAddr[n] = sl.serverList_val[n]; } - xdr_free(sl.serverList_val, sl.serverList_len); + xdr_free((xdrproc_t) xdr_serverList, &sl); } /* diff --git a/src/ptserver/ptuser.c b/src/ptserver/ptuser.c index c1384c2e5..59a0f0216 100644 --- a/src/ptserver/ptuser.c +++ b/src/ptserver/ptuser.c @@ -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; } diff --git a/src/rx/xdr.c b/src/rx/xdr.c index 103bf4cb2..4481c3951 100644 --- a/src/rx/xdr.c +++ b/src/rx/xdr.c @@ -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 */ diff --git a/src/rx/xdr_prototypes.h b/src/rx/xdr_prototypes.h index 769fe22fe..d000aee40 100644 --- a/src/rx/xdr_prototypes.h +++ b/src/rx/xdr_prototypes.h @@ -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 */