From 12ab04431c06d9f8107b3596c768bf50b156ba88 Mon Sep 17 00:00:00 2001 From: rufustfirefly Date: Wed, 27 Jun 2001 14:53:16 +0000 Subject: [PATCH] FORCE_UIDGID fixes (it compiles properly now with that enabled, but untested) --- etc/afpd/directory.c | 100 ++++++++++++++++++++++--------------------- etc/afpd/uid.c | 20 ++++----- etc/afpd/uid.h | 8 ++-- 3 files changed, 65 insertions(+), 63 deletions(-) diff --git a/etc/afpd/directory.c b/etc/afpd/directory.c index 818e60f5..3b2a1ce8 100644 --- a/etc/afpd/directory.c +++ b/etc/afpd/directory.c @@ -1,5 +1,5 @@ /* - * $Id: directory.c,v 1.12 2001-06-20 18:33:04 rufustfirefly Exp $ + * $Id: directory.c,v 1.13 2001-06-27 14:53:16 rufustfirefly Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -821,14 +821,15 @@ int getdirparams(vol, bitmap, upath, dir, st, buf, buflen ) u_int32_t aint; u_int16_t ashort; #ifdef FORCE_UIDGID - uidgidset *uidgid; + uidgidset *uidgid; + memset(&uidgid, 0, sizeof(uidgid)); #endif /* FORCE_UIDGID */ memset(&ad, 0, sizeof(ad)); #ifdef FORCE_UIDGID - save_uidgid ( uidgid ); - set_uidgid ( vol ); + save_uidgid ( &uidgid ); + set_uidgid ( vol ); #endif /* FORCE_UIDGID */ if ( ad_open( upath, ADFLAGS_HF|ADFLAGS_DIR, O_RDONLY, @@ -996,7 +997,7 @@ int getdirparams(vol, bitmap, upath, dir, st, buf, buflen ) ad_close( &ad, ADFLAGS_HF ); } #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_BITMAP ); } @@ -1086,13 +1087,15 @@ int setdirparams(vol, path, bitmap, buf ) u_int16_t ashort, bshort; int err = AFP_OK; #ifdef FORCE_UIDGID - uidgidset *uidgid; + uidgidset *uidgid; + + memset(&uidgid, 0, sizeof(uidgid)); #endif /* FORCE_UIDGID */ upath = mtoupath(vol, path); memset(&ad, 0, sizeof(ad)); #ifdef FORCE_UIDGID - save_uidgid ( uidgid ); + save_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ if (ad_open( upath, vol_noadouble(vol)|ADFLAGS_HF|ADFLAGS_DIR, O_RDWR|O_CREAT, 0666, &ad) < 0) { @@ -1108,7 +1111,7 @@ int setdirparams(vol, path, bitmap, buf ) ~((1<d_parent == NULL ) { @@ -1590,8 +1592,8 @@ int deletecurdir( vol, path, pathlen ) fdir = curdir; #ifdef FORCE_UIDGID - save_uidgid ( uidgid ); - set_uidgid ( vol ); + save_uidgid ( &uidgid ); + set_uidgid ( vol ); #endif /* FORCE_UIDGID */ /* delete stray .AppleDouble files. this happens to get .Parent files @@ -1608,7 +1610,7 @@ int deletecurdir( vol, path, pathlen ) if (stat(de->d_name, &st) == 0) { closedir(dp); #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return AFPERR_DIRNEMPT; } @@ -1620,19 +1622,19 @@ int deletecurdir( vol, path, pathlen ) case EPERM: case EACCES : #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_ACCESS ); case EROFS: #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return AFPERR_VLOCK; case ENOENT : continue; default : #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_PARAM ); } @@ -1647,23 +1649,23 @@ int deletecurdir( vol, path, pathlen ) break; case ENOTEMPTY : #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_DIRNEMPT ); case EROFS: #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return AFPERR_VLOCK; case EPERM: case EACCES : #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_ACCESS ); default : #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_PARAM ); } @@ -1679,7 +1681,7 @@ int deletecurdir( vol, path, pathlen ) /* bail if it's not a symlink */ if ((lstat(de->d_name, &st) == 0) && !S_ISLNK(st.st_mode)) { #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return AFPERR_DIRNEMPT; } @@ -1689,19 +1691,19 @@ int deletecurdir( vol, path, pathlen ) case EPERM: case EACCES : #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_ACCESS ); case EROFS: #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return AFPERR_VLOCK; case ENOENT : continue; default : #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_PARAM ); } @@ -1712,7 +1714,7 @@ int deletecurdir( vol, path, pathlen ) if ( movecwd( vol, curdir->d_parent ) < 0 ) { #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_NOOBJ ); } @@ -1721,28 +1723,28 @@ int deletecurdir( vol, path, pathlen ) switch ( errno ) { case ENOENT : #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_NOOBJ ); case ENOTEMPTY : #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_DIRNEMPT ); case EPERM: case EACCES : #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_ACCESS ); case EROFS: #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return AFPERR_VLOCK; default : #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFPERR_PARAM ); } @@ -1755,7 +1757,7 @@ int deletecurdir( vol, path, pathlen ) dir_remove( vol, fdir ); #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return( AFP_OK ); } @@ -1908,9 +1910,9 @@ int afp_opendir(obj, ibuf, ibuflen, rbuf, rbuflen ) u_int32_t did; u_int16_t vid; #ifdef FORCE_UIDGID - uidgidset *uidgid; + uidgidset *uidgid; - uidgid = malloc(sizeof(uidgidset)); + memset(&uidgid, 0, sizeof(uidgid)); #endif /* FORCE_UIDGID */ *rbuflen = 0; @@ -1951,15 +1953,15 @@ int afp_opendir(obj, ibuf, ibuflen, rbuf, rbuflen ) } #ifdef FORCE_UIDGID - save_uidgid ( uidgid ); - set_uidgid ( vol ); + save_uidgid ( &uidgid ); + set_uidgid ( vol ); #endif /* FORCE_UIDGID */ /* we don't already have a did. add one in. */ if ((dir = adddir(vol, parentdir, path, strlen(path), upath, strlen(upath), &st)) == NULL) { #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return AFPERR_MISC; } @@ -1967,7 +1969,7 @@ int afp_opendir(obj, ibuf, ibuflen, rbuf, rbuflen ) memcpy(rbuf, &dir->d_did, sizeof(dir->d_did)); *rbuflen = sizeof(dir->d_did); #ifdef FORCE_UIDGID - restore_uidgid ( uidgid ); + restore_uidgid ( &uidgid ); #endif /* FORCE_UIDGID */ return AFP_OK; } diff --git a/etc/afpd/uid.c b/etc/afpd/uid.c index 2078de1d..9287d69f 100644 --- a/etc/afpd/uid.c +++ b/etc/afpd/uid.c @@ -1,5 +1,5 @@ /* - * $Id: uid.c,v 1.4 2001-06-20 18:33:04 rufustfirefly Exp $ + * $Id: uid.c,v 1.5 2001-06-27 14:53:16 rufustfirefly Exp $ * code: jeff@univrel.pr.uconn.edu * * These functions are abstracted here, so that all calls for resolving @@ -28,29 +28,29 @@ #endif /* HAVE_UNISTD_H */ void save_uidgid ( pair ) - uidgidset *pair; + uidgidset **pair; { /* allocate the memory */ pair = malloc ( sizeof ( uidgidset ) ); /* then assign the values */ - (pair)->uid = geteuid (); - (pair)->gid = getegid (); + (*pair)->uid = geteuid (); + (*pair)->gid = getegid (); } /* end function void save_uidgid ( pair ) */ void restore_uidgid ( pair ) - uidgidset *pair; + uidgidset **pair; { - if ( seteuid ( (pair)->uid ) < 0 ) + if ( seteuid ( (*pair)->uid ) < 0 ) syslog ( LOG_ERR, "restore_uidgid: unable to seteuid '%s': %m", - (pair)->uid ); - if ( setegid ( (pair)->gid ) < 0 ) + (*pair)->uid ); + if ( setegid ( (*pair)->gid ) < 0 ) syslog ( LOG_ERR, "restore_uidgid: unable to setegid '%s': %m", - (pair)->gid ); + (*pair)->gid ); } /* end function void restore_uidgid ( pair ) */ void set_uidgid ( this_volume ) - struct vol *this_volume; + const struct vol *this_volume; { int uid, gid; /* derived ones go in here */ diff --git a/etc/afpd/uid.h b/etc/afpd/uid.h index b0293328..8eb27e71 100644 --- a/etc/afpd/uid.h +++ b/etc/afpd/uid.h @@ -1,5 +1,5 @@ /* - * $Id: uid.h,v 1.2 2001-02-27 16:27:19 rufustfirefly Exp $ + * $Id: uid.h,v 1.3 2001-06-27 14:53:16 rufustfirefly Exp $ * code: jeff@univrel.pr.uconn.edu */ @@ -18,9 +18,9 @@ typedef struct uidgidset_t { } uidgidset; /* functions to save and restore uid/gid pairs */ -extern void save_uidgid ( uidgidset * ); -extern void restore_uidgid ( uidgidset * ); -extern void set_uidgid ( struct vol * ); +extern void save_uidgid ( uidgidset ** ); +extern void restore_uidgid ( uidgidset ** ); +extern void set_uidgid ( const struct vol * ); /* internal functions to convert user and group names to ids */ extern int user_to_uid ( char * ); -- 2.39.2