From b40b60650cf91f005990bc2e55185a4af7e2cd4b Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 17 Aug 2009 12:30:44 -0400 Subject: [PATCH] Use xdr_alloc and xdr_free within ptuser If the memory allocation routines for libafsauthent and libafsrpc differ, callers of the ptuser routines in libafsauthent will crash. Use xdr_alloc and xdr_free in ptuser to ensure that the memory allocation routines are always consistent. LICENSE MIT Change-Id: I20fa1e1fc0677917e47e2ed9f0eaec83f23b699b Change-Id: Id31bf20b482e9502a5af79f4d86319fe530aa5a5 Reviewed-on: http://gerrit.openafs.org/319 Tested-by: Jeffrey Altman Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear Reviewed-by: Jeffrey Altman --- src/fsint/afsaux.c | 34 ------------------------------ src/libuafs/Makefile.common.in | 9 ++++++++ src/ptserver/ptuser.c | 38 +++++++++++++++++----------------- src/rx/xdr.c | 2 +- src/rx/xdr.h | 2 +- 5 files changed, 30 insertions(+), 55 deletions(-) diff --git a/src/fsint/afsaux.c b/src/fsint/afsaux.c index 9e143a191..b5f85bd28 100644 --- a/src/fsint/afsaux.c +++ b/src/fsint/afsaux.c @@ -61,40 +61,6 @@ static afs_int32 bslosers = 0; #ifdef AFS_AIXNFS11 #define AUTH_DES 1 #endif -#if (defined(AFS_AIX_ENV) && !defined(AUTH_DES)) || (!defined(AFS_SUN_ENV)) && !defined(AFS_SGI_ENV) && !defined(AFS_OSF_ENV) && !defined(AFS_SUN5_ENV) -#ifndef AFS_AIX32_ENV -#if !defined(AFS_HPUX110_ENV) && !defined(AFS_LINUX20_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_XBSD_ENV) -/* - * XDR chars; from user mode xdr package. - */ -bool_t -xdr_char(register XDR * xdrs, char *sp) -{ - afs_int32 l; - - switch (xdrs->x_op) { - - case XDR_ENCODE: - l = (afs_int32) * sp; - return (XDR_PUTINT32(xdrs, &l)); - - case XDR_DECODE: - if (!XDR_GETINT32(xdrs, &l)) { - return (FALSE); - } - *sp = (char)l; - return (TRUE); - - case XDR_FREE: - return (TRUE); - } - return (FALSE); -} -#endif /* AFS_HPUX110_ENV && AFS_LINUX20_ENV */ -#endif -#endif /* defined(AFS_AIX_ENV) && !defined(AUTH_DES) */ - - /* * Wrapper for xdr_string that can be called directly from * routines like clnt_call; from user-mode xdr package. diff --git a/src/libuafs/Makefile.common.in b/src/libuafs/Makefile.common.in index ea4fea6d8..b8aeed6a8 100644 --- a/src/libuafs/Makefile.common.in +++ b/src/libuafs/Makefile.common.in @@ -137,6 +137,7 @@ UAFSOBJ = \ $(UOBJ)/afs_pioctl.o \ $(UOBJ)/osi_vfsops.o \ $(UOBJ)/afs_usrops.o \ + $(UOBJ)/xdr.o \ $(UOBJ)/xdr_afsuuid.o \ $(UOBJ)/afs_uuid.o \ $(UOBJ)/assert.o \ @@ -266,6 +267,7 @@ AFSWEBOBJ = \ $(WEBOBJ)/afs_pioctl.o \ $(WEBOBJ)/osi_vfsops.o \ $(WEBOBJ)/afs_usrops.o \ + $(WEBOBJ)/xdr.o \ $(WEBOBJ)/xdr_afsuuid.o \ $(WEBOBJ)/afs_uuid.o \ $(WEBOBJ)/assert.o \ @@ -521,6 +523,7 @@ JUAFSOBJ = \ $(JUAFS)/afs_pioctl.o \ $(JUAFS)/osi_vfsops.o \ $(JUAFS)/afs_usrops.o \ + $(JUAFS)/xdr.o \ $(JUAFS)/xdr_afsuuid.o \ $(JUAFS)/afs_uuid.o \ $(JUAFS)/assert.o \ @@ -749,6 +752,8 @@ $(UOBJ)/assert.o: $(TOP_SRCDIR)/util/assert.c $(CRULE1) $(UOBJ)/xdr_afsuuid.o: $(TOP_SRCDIR)/rx/xdr_afsuuid.c $(CRULE1) +$(UOBJ)/xdr.o: $(TOP_SRCDIR)/rx/xdr.c + $(CRULE1) $(UOBJ)/osi_vnodeops.o: $(TOP_SRC_AFS)/UKERNEL/osi_vnodeops.c $(CRULE1) $(UOBJ)/osi_vm.o: $(TOP_SRC_AFS)/UKERNEL/osi_vm.c @@ -1010,6 +1015,8 @@ $(WEBOBJ)/assert.o: $(TOP_SRCDIR)/util/assert.c $(CRULE1) $(WEBOBJ)/xdr_afsuuid.o: $(TOP_SRCDIR)/rx/xdr_afsuuid.c $(CRULE2) +$(WEBOBJ)/xdr.o: $(TOP_SRCDIR)/rx/xdr.c + $(CRULE2) $(WEBOBJ)/osi_vnodeops.o: $(TOP_SRC_AFS)/UKERNEL/osi_vnodeops.c $(CRULE2) $(WEBOBJ)/osi_vm.o: $(TOP_SRC_AFS)/UKERNEL/osi_vm.c @@ -1281,6 +1288,8 @@ $(JUAFS)/assert.o: $(TOP_SRCDIR)/util/assert.c $(CRULE1) $(JUAFS)/xdr_afsuuid.o: $(TOP_SRCDIR)/rx/xdr_afsuuid.c $(CRULE1) +$(JUAFS)/xdr.o: $(TOP_SRCDIR)/rx/xdr.c + $(CRULE1) $(JUAFS)/osi_vnodeops.o: $(TOP_SRC_AFS)/UKERNEL/osi_vnodeops.c $(CRULE1) $(JUAFS)/osi_vm.o: $(TOP_SRC_AFS)/UKERNEL/osi_vm.c diff --git a/src/ptserver/ptuser.c b/src/ptserver/ptuser.c index a90fe84c6..c1384c2e5 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 *) malloc(2 * PR_MAXNAMELEN); + lnames.namelist_val = (prname *) xdr_alloc(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) - free(lnames.namelist_val); + xdr_free(lnames.namelist_val, 2 * PR_MAXNAMELEN); if (lids.idlist_val) - free(lids.idlist_val); + xdr_free(lids.idlist_val, lids.idlist_len * sizeof(lids.idlist_val[0])); return code; } @@ -371,7 +371,7 @@ pr_RemoveUserFromGroup(char *user, char *group) idlist lids; lnames.namelist_len = 2; - lnames.namelist_val = (prname *) malloc(2 * PR_MAXNAMELEN); + lnames.namelist_val = (prname *) xdr_alloc(2 * PR_MAXNAMELEN); strncpy(lnames.namelist_val[0], user, PR_MAXNAMELEN); strncpy(lnames.namelist_val[1], group, PR_MAXNAMELEN); lids.idlist_val = 0; @@ -390,9 +390,9 @@ pr_RemoveUserFromGroup(char *user, char *group) lids.idlist_val[1]); done: if (lnames.namelist_val) - free(lnames.namelist_val); + xdr_free(lnames.namelist_val, 2 * PR_MAXNAMELEN); if (lids.idlist_val) - free(lids.idlist_val); + xdr_free(lids.idlist_val, lids.idlist_len * sizeof(lids.idlist_val[0])); return code; } @@ -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 *) malloc(PR_MAXNAMELEN); + lnames.namelist_val = (prname *) xdr_alloc(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; - free(lids.idlist_val); + xdr_free(lids.idlist_val, lids.idlist_len * sizeof(lids.idlist_val[0])); } if (lnames.namelist_val) - free(lnames.namelist_val); + xdr_free(lnames.namelist_val, PR_MAXNAMELEN); return code; } @@ -449,17 +449,17 @@ pr_SIdToName(afs_int32 id, char name[PR_MAXNAMELEN]) register afs_int32 code; lids.idlist_len = 1; - lids.idlist_val = (afs_int32 *) malloc(sizeof(afs_int32)); + lids.idlist_val = (afs_int32 *) xdr_alloc(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) { strncpy(name, lnames.namelist_val[0], PR_MAXNAMELEN); - free(lnames.namelist_val); + xdr_free(lnames.namelist_val, PR_MAXNAMELEN); } if (lids.idlist_val) - free(lids.idlist_val); + xdr_free(lids.idlist_val, lids.idlist_len * sizeof(lids.idlist_val[0])); return code; } @@ -559,7 +559,7 @@ pr_ListOwned(afs_int32 oid, namelist *lnames, afs_int32 *moreP) if (code) return code; if (alist.prlist_val) - free(alist.prlist_val); + xdr_free(alist.prlist_val, alist.prlist_len * sizeof(alist.prlist_val[0])); return PRSUCCESS; } @@ -585,7 +585,7 @@ pr_IDListMembers(afs_int32 gid, namelist *lnames) if (code) return code; if (alist.prlist_val) - free(alist.prlist_val); + xdr_free(alist.prlist_val, alist.prlist_len * sizeof(alist.prlist_val[0])); return PRSUCCESS; } @@ -704,7 +704,7 @@ pr_IsAMemberOf(char *uname, char *gname, afs_int32 *flag) stolower(uname); stolower(gname); lnames.namelist_len = 2; - lnames.namelist_val = (prname *) malloc(2 * PR_MAXNAMELEN); + lnames.namelist_val = (prname *) xdr_alloc(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 +712,18 @@ pr_IsAMemberOf(char *uname, char *gname, afs_int32 *flag) code = pr_NameToId(&lnames, &lids); if (code) { if (lnames.namelist_val) - free(lnames.namelist_val); + xdr_free(lnames.namelist_val, 2 * PR_MAXNAMELEN); if (lids.idlist_val) - free(lids.idlist_val); + xdr_free(lids.idlist_val, lids.idlist_len * sizeof(lids.idlist_val[0])); return code; } code = ubik_PR_IsAMemberOf(pruclient, 0, lids.idlist_val[0], lids.idlist_val[1], flag); if (lnames.namelist_val) - free(lnames.namelist_val); + xdr_free(lnames.namelist_val, 2 * PR_MAXNAMELEN); if (lids.idlist_val) - free(lids.idlist_val); + xdr_free(lids.idlist_val, lids.idlist_len * sizeof(lids.idlist_val[0])); return code; } diff --git a/src/rx/xdr.c b/src/rx/xdr.c index ad8897e22..103bf4cb2 100644 --- a/src/rx/xdr.c +++ b/src/rx/xdr.c @@ -48,7 +48,7 @@ #ifndef NeXT -#ifdef KERNEL +#if defined(KERNEL) && !defined(UKERNEL) #include #ifndef AFS_LINUX20_ENV #include diff --git a/src/rx/xdr.h b/src/rx/xdr.h index 858a0b25a..677952e62 100644 --- a/src/rx/xdr.h +++ b/src/rx/xdr.h @@ -63,7 +63,7 @@ #define mem_free(ptr, bsize) free(ptr) #endif -#if defined(AFS_AMD64_LINUX24_ENV) || defined(AFS_DARWIN_ENV) || (defined(KERNEL) && !defined(UKERNEL)) +#if defined(AFS_AMD64_LINUX24_ENV) || defined(AFS_DARWIN_ENV) #define xdr_alloc afs_xdr_alloc #define xdr_free afs_xdr_free #define xdr_void afs_xdr_void -- 2.39.5