Use xdr_alloc and xdr_free within ptuser
authorJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 17 Aug 2009 16:30:44 +0000 (12:30 -0400)
committerJeffrey Altman <jaltman|account-1000011@unknown>
Thu, 3 Dec 2009 16:26:42 +0000 (08:26 -0800)
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 <jaltman@openafs.org>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>

src/fsint/afsaux.c
src/libuafs/Makefile.common.in
src/ptserver/ptuser.c
src/rx/xdr.c
src/rx/xdr.h

index 9e143a1..b5f85bd 100644 (file)
@@ -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.
index ea4fea6..b8aeed6 100644 (file)
@@ -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
index a90fe84..c1384c2 100644 (file)
@@ -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;
 }
 
index ad8897e..103bf4c 100644 (file)
@@ -48,7 +48,7 @@
 
 #ifndef        NeXT
 
-#ifdef KERNEL
+#if defined(KERNEL) && !defined(UKERNEL)
 #include <sys/param.h>
 #ifndef AFS_LINUX20_ENV
 #include <sys/systm.h>
index 858a0b2..677952e 100644 (file)
@@ -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