Merge branch 'security-master' into HEAD 99/10999/1
authorSimon Wilkinson <sxw@your-file-system.com>
Wed, 9 Apr 2014 13:10:09 +0000 (14:10 +0100)
committerSimon Wilkinson <sxw@your-file-system.com>
Wed, 9 Apr 2014 14:08:49 +0000 (15:08 +0100)
Merge fix for OpenAFS-SA-2014-001 into master, along with the fix
for the RX denial of service issue.

Change-Id: I499e7202c9278d21f2d8628d497755e6c593abb2

23 files changed:
doc/man-pages/pod8/ptserver.pod
src/BUILDNOTES [deleted file]
src/afs/AIX/osi_vfsops.c
src/afs/DARWIN/osi_vfsops.c
src/afs/FBSD/osi_vfsops.c
src/afs/HPUX/osi_vfsops.c
src/afs/IRIX/osi_vfsops.c
src/afs/LINUX/osi_vfsops.c
src/afs/LINUX24/osi_vfsops.c
src/afs/NBSD/osi_vfsops.c
src/afs/OBSD/osi_vfsops.c
src/afs/SOLARIS/osi_vfsops.c
src/afs/UKERNEL/osi_vfsops.c
src/afs/VNOPS/afs_vnop_create.c
src/afs/VNOPS/afs_vnop_dirops.c
src/afs/VNOPS/afs_vnop_link.c
src/afs/VNOPS/afs_vnop_rename.c
src/afs/VNOPS/afs_vnop_symlink.c
src/afs/afs.h
src/ptserver/ptprocs.c
src/ptserver/pts.c
src/ptserver/ptserver.c
src/rx/rx.c

index f926bae..7318900 100644 (file)
@@ -12,7 +12,7 @@ ptserver S<<< [B<-database> | B<-db> <I<db path>>] >>>
     S<<< [B<-d> <I<debug level>>] >>>
     S<<< [B<-groupdepth> | B<-depth> <I<# of nested groups>>] >>>
     S<<< [B<-default_access> <I<user access mask>> <I<group access mask>>] >>>
-    [B<-restricted>] [B<-enable_peer_stats>]
+    [B<-restricted>] [B<-restrict_anonymous>] [B<-enable_peer_stats>]
     [B<-enable_process_stats>] [B<-allow-dotted-principals>]
     [B<-rxbind>] S<<< [B<-auditlog> <I<file path>>] >>>
     S<<< [B<-audit-interface> (file | sysvmq)] >>>
@@ -113,6 +113,11 @@ information on the flags.
 Run the PT Server in restricted mode. While in restricted mode, only
 members of the system:administrators PTS group may make any PTS changes.
 
+=item B<-restrict_anonymous>
+
+Run the PT Server in restricted anonymous access mode. While in this mode,
+only authenticated users will be able to access the PTS database.
+
 =item B<-enable_peer_stats>
 
 Activates the collection of Rx statistics and allocates memory for their
diff --git a/src/BUILDNOTES b/src/BUILDNOTES
deleted file mode 100644 (file)
index d1e19f2..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-In this file you'll find notes to help you build OpenAFS on various platforms.
-
-Redhat 7.0 (i386_linux22): 
-       src/venus/kdump.c may fail to compile with the gcc included with 
-       RedHat 7.0; You'll need to use kgcc to compile it.  You should 
-       be able to use kgcc to compile all of AFS. Just add CC=kgcc 
-       to your make arguments.
-
-       When building for multiple kernels in one dest tree,
-       if the kernel version string which UTS_RELEASE is defined to in 
-       include/linux/version.h matches the last kernel you built for, 
-        the previous kernel module will be overwritten.
-
-Redhat 7.1 (i386_linux24): 
-       src/venus/kdump.c may fail to compile.
-
-       You will need pam-devel installed to compile the included
-       PAM module.
-
-       When building for multiple kernels in one dest tree,
-       if the kernel version string which UTS_RELEASE is defined to in 
-       include/linux/version.h matches the last kernel you built for, 
-        the previous kernel module will be overwritten.
-
-HPUX 11.0 (hp_ux110):
-       Does not currently build libafs, which means no afs client support,
-       however, the client tools, and all of the server code does get built.
-       
-       For future kernel development, the KernDevKit package from the CoreOS
-       media is required.
-
-HPUX 10.2 (hp_ux102):
-       Does not currently build libafs, which means no afs client support,
-       however, the client tools, and all of the server code does get built.
-       
-       Requires that the DCE-CoreTools and possible the KernDevKit package
-       from CoreOS media be installed.
index c24fc6e..32fbbf5 100644 (file)
@@ -174,7 +174,7 @@ afs_statfs(struct vfs *afsp, struct statfs *abp, struct ucred *credp)
     abp->f_type = 0;
     abp->f_bsize = afsp->vfs_bsize;
     abp->f_blocks = abp->f_bfree = abp->f_bavail = abp->f_files =
-       abp->f_ffree = 9000000;
+       abp->f_ffree = AFS_VFS_FAKEFREE;
     abp->f_vfstype = AFS_VFSFSID;
     abp->f_vfsnumber = afsp->vfs_number;
     abp->f_vfsoff = abp->f_vfslen = abp->f_vfsvers = -1;
index d0efb8c..22cfeba 100644 (file)
@@ -361,12 +361,8 @@ afs_statfs(struct mount *mp, STATFS_TYPE *abp, CTX_TYPE ctx)
     abp->f_type = MOUNT_AFS;
 #endif
 
-    /* Fake a high number below to satisfy programs that use the statfs call
-     * to make sure that there's enough space in the device partition before
-     * storing something there.
-     */
     abp->f_blocks = abp->f_bfree = abp->f_bavail = abp->f_files =
-      abp->f_ffree = 0x7fffffff;
+      abp->f_ffree = AFS_VFS_FAKEFREE;
 
     if (abp != sysstat) {
         abp->f_fsid.val[0] = sysstat->f_fsid.val[0];
index 0878e65..54d3366 100644 (file)
@@ -338,12 +338,8 @@ afs_statfs(struct mount *mp, struct statfs *abp, struct thread *p)
     abp->f_bsize = mp->vfs_bsize;
     abp->f_iosize = mp->vfs_bsize;
 
-    /* Fake a high number below to satisfy programs that use the statfs call
-     * to make sure that there's enough space in the device partition before
-     * storing something there.
-     */
     abp->f_blocks = abp->f_bfree = abp->f_bavail = abp->f_files =
-       abp->f_ffree = 2000000;
+       abp->f_ffree = AFS_VFS_FAKEFREE;
 
     abp->f_fsid.val[0] = mp->mnt_stat.f_fsid.val[0];
     abp->f_fsid.val[1] = mp->mnt_stat.f_fsid.val[1];
index acb601b..ca5de57 100644 (file)
@@ -165,7 +165,7 @@ afs_statfs(struct vfs *afsp, struct k_statvfs *abp)
      * before storing something there.
      */
     abp->f_blocks = abp->f_bfree = abp->f_bavail = abp->f_files =
-       abp->f_ffree = abp->f_favail = 9000000;
+       abp->f_ffree = abp->f_favail = AFS_VFS_FAKEFREE;
     abp->f_fsid = (AFS_VFSMAGIC << 16) || AFS_VFSFSID;
 
     AFS_GUNLOCK();
index b876f3f..bc129d6 100644 (file)
@@ -313,7 +313,7 @@ afs_statfs(OSI_VFS_ARG(afsp), abp, avp)
      * before storing something there.
      */
     abp->f_blocks = abp->f_bfree = abp->f_bavail = abp->f_files =
-       abp->f_ffree = abp->f_favail = 900000;
+       abp->f_ffree = abp->f_favail = AFS_VFS_FAKEFREE;
 
     abp->f_fsid = AFS_VFSMAGIC;        /* magic */
     strcpy(abp->f_basetype, AFS_MOUNT_AFS);
index cad22a1..cad4555 100644 (file)
@@ -371,7 +371,7 @@ afs_statfs(struct super_block *sbp, struct kstatfs *statp)
     statp->f_bsize = sbp->s_blocksize;
 #endif
     statp->f_blocks = statp->f_bfree = statp->f_bavail = statp->f_files =
-       statp->f_ffree = 9000000;
+       statp->f_ffree = AFS_VFS_FAKEFREE;
     statp->f_fsid.val[0] = AFS_VFSMAGIC;
     statp->f_fsid.val[1] = AFS_VFSFSID;
     statp->f_namelen = 256;
index 77b821b..6c8d29e 100644 (file)
@@ -345,7 +345,7 @@ afs_statfs(struct super_block *sbp, struct statfs *__statp, int size)
     statp->f_bsize = sbp->s_blocksize;
 #endif
     statp->f_blocks = statp->f_bfree = statp->f_bavail = statp->f_files =
-       statp->f_ffree = 9000000;
+       statp->f_ffree = AFS_VFS_FAKEFREE;
     statp->f_fsid.val[0] = AFS_VFSMAGIC;
     statp->f_fsid.val[1] = AFS_VFSFSID;
     statp->f_namelen = 256;
index c11d6af..3e41847 100644 (file)
@@ -422,14 +422,8 @@ afs_statvfs(struct mount *mp, struct statvfs *abp)
     abp->f_frsize = mp->osi_vfs_bsize;
     abp->f_iosize = mp->osi_vfs_bsize;
 
-    /*
-     * Fake a high number below to satisfy programs that use the ustat (for
-     * * AIX), or statfs (for the rest) call to make sure that there's
-     * enough * space in the device partition before storing something there
-     * (like * ed(1))
-     */
     abp->f_blocks = abp->f_bfree = abp->f_bavail = abp->f_files =
-       abp->f_ffree = 9000000;
+       abp->f_ffree = AFS_VFS_FAKEFREE;
 
     return (0);
 }
index 3db75e2..aa2ccb4 100644 (file)
@@ -375,14 +375,8 @@ afs_statfs(struct osi_vfs *afsp, struct statfs *abp)
     AFS_STATCNT(afs_statfs);
     abp->f_bsize = afsp->osi_vfs_bsize;
 
-    /*
-     * Fake a high number below to satisfy programs that use the ustat (for
-     * * AIX), or statfs (for the rest) call to make sure that there's
-     * enough * space in the device partition before storing something there
-     * (like * ed(1))
-     */
     abp->f_blocks = abp->f_bfree = abp->f_bavail = abp->f_files =
-       abp->f_ffree = 9000000;
+       abp->f_ffree = AFS_VFS_FAKEFREE;
     abp->f_fsid.val[0] = AFS_VFSMAGIC; /* magic */
     abp->f_fsid.val[1] = (int)AFS_VFSFSID;
     return 0;
index ebb5012..ca2553b 100644 (file)
@@ -229,10 +229,9 @@ afs_statvfs(struct vfs *afsp, struct statvfs64 *abp)
     AFS_STATCNT(afs_statfs);
 
     abp->f_frsize = 1024;
-    abp->f_favail = 9000000;
     abp->f_bsize = afsp->vfs_bsize;
     abp->f_blocks = abp->f_bfree = abp->f_bavail = abp->f_files =
-       abp->f_ffree = 9000000;
+       abp->f_favail = abp->f_ffree = AFS_VFS_FAKEFREE;
     abp->f_fsid = (AFS_VFSMAGIC << 16) || AFS_VFSFSID;
 
     AFS_GUNLOCK();
index 53dd5ef..42d25ab 100644 (file)
@@ -121,10 +121,9 @@ afs_statvfs(struct vfs *afsp, struct statvfs *abp)
     AFS_STATCNT(afs_statfs);
 
     abp->f_frsize = 1024;
-    abp->f_favail = 9000000;
     abp->f_bsize = afsp->vfs_bsize;
     abp->f_blocks = abp->f_bfree = abp->f_bavail = abp->f_files =
-      abp->f_ffree = 9000000;
+      abp->f_favail = abp->f_ffree = AFS_VFS_FAKEFREE;
 
 #ifdef AFS_USR_AIX_ENV
     abp->f_fsid.val[0] = AFS_VFSMAGIC;
index 304987f..daaa9f0 100644 (file)
@@ -46,7 +46,7 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
     struct afs_conn *tc;
     struct VenusFid newFid;
     struct AFSStoreStatus InStatus;
-    struct AFSFetchStatus OutFidStatus, OutDirStatus;
+    struct AFSFetchStatus *OutFidStatus, *OutDirStatus;
     struct AFSVolSync tsync;
     struct AFSCallBack CallBack;
     afs_int32 now;
@@ -60,8 +60,11 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
     XSTATS_DECLS;
     OSI_VC_CONVERT(adp);
 
-
     AFS_STATCNT(afs_create);
+
+    OutFidStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+    OutDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+
     if ((code = afs_InitReq(&treq, acred)))
        goto done2;
 
@@ -307,7 +310,7 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
                code =
                    RXAFS_CreateFile(rxconn, (struct AFSFid *)&adp->f.fid.Fid,
                                 aname, &InStatus, (struct AFSFid *)
-                                &newFid.Fid, &OutFidStatus, &OutDirStatus,
+                                &newFid.Fid, OutFidStatus, OutDirStatus,
                                 &CallBack, &tsync);
                RX_AFS_GLOCK();
                XSTATS_END_TIME;
@@ -372,7 +375,7 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
     /* otherwise, we should see if we can make the change to the dir locally */
     if (tdc)
        UpgradeSToWLock(&tdc->lock, 631);
-    if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, &OutDirStatus, 1)) {
+    if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, OutDirStatus, 1)) {
        /* we can do it locally */
        ObtainWriteLock(&afs_xdcache, 291);
        code = afs_dir_Create(tdc, aname, &newFid.Fid);
@@ -454,7 +457,7 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
                afs_DisconAddDirty(tvc, VDisconCreate, 0);
                afs_GenDisconStatus(adp, tvc, &newFid, attrs, &treq, VREG);
            } else {
-               afs_ProcessFS(tvc, &OutFidStatus, &treq);
+               afs_ProcessFS(tvc, OutFidStatus, &treq);
            }
 
            tvc->f.parent.vnode = adp->f.fid.Fid.Vnode;
@@ -498,6 +501,8 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
     code = afs_CheckCode(code, &treq, 20);
 
   done2:
+    osi_FreeSmallSpace(OutFidStatus);
+    osi_FreeSmallSpace(OutDirStatus);
     return code;
 }
 
index f4e4e45..47c71a7 100644 (file)
@@ -47,7 +47,7 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
     afs_size_t offset, len;
     struct vcache *tvc;
     struct AFSStoreStatus InStatus;
-    struct AFSFetchStatus OutFidStatus, OutDirStatus;
+    struct AFSFetchStatus *OutFidStatus, *OutDirStatus;
     struct AFSCallBack CallBack;
     struct AFSVolSync tsync;
     afs_int32 now;
@@ -59,6 +59,9 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
     afs_Trace2(afs_iclSetp, CM_TRACE_MKDIR, ICL_TYPE_POINTER, adp,
               ICL_TYPE_STRING, aname);
 
+    OutFidStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+    OutDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+
     if ((code = afs_InitReq(&treq, acred)))
        goto done2;
     afs_InitFakeStat(&fakestate);
@@ -115,8 +118,8 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
                                aname,
                                &InStatus,
                                (struct AFSFid *)&newFid.Fid,
-                               &OutFidStatus,
-                               &OutDirStatus,
+                               OutFidStatus,
+                               OutDirStatus,
                                &CallBack,
                                &tsync);
                RX_AFS_GLOCK();
@@ -163,7 +166,7 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
     /* otherwise, we should see if we can make the change to the dir locally */
     if (tdc)
        ObtainWriteLock(&tdc->lock, 632);
-    if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, &OutDirStatus, 1)) {
+    if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, OutDirStatus, 1)) {
        /* we can do it locally */
        ObtainWriteLock(&afs_xdcache, 294);
        code = afs_dir_Create(tdc, aname, &newFid.Fid);
@@ -182,7 +185,7 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
        /* We will have to settle with the local link count. */
        adp->f.m.LinkCount++;
     else
-       adp->f.m.LinkCount = OutDirStatus.LinkCount;
+       adp->f.m.LinkCount = OutDirStatus->LinkCount;
     newFid.Cell = adp->f.fid.Cell;
     newFid.Fid.Volume = adp->f.fid.Fid.Volume;
     ReleaseWriteLock(&adp->lock);
@@ -242,6 +245,8 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
     afs_PutFakeStat(&fakestate);
     code = afs_CheckCode(code, &treq, 26);
   done2:
+    osi_FreeSmallSpace(OutFidStatus);
+    osi_FreeSmallSpace(OutDirStatus);
     return code;
 }
 
index 26b6c71..3457998 100644 (file)
@@ -43,7 +43,7 @@ afs_link(struct vcache *avc, OSI_VC_DECL(adp), char *aname,
     afs_int32 code;
     struct afs_conn *tc;
     afs_size_t offset, len;
-    struct AFSFetchStatus OutFidStatus, OutDirStatus;
+    struct AFSFetchStatus *OutFidStatus, *OutDirStatus;
     struct AFSVolSync tsync;
     struct afs_fakestat_state vfakestate, dfakestate;
     struct rx_connection *rxconn;
@@ -53,13 +53,17 @@ afs_link(struct vcache *avc, OSI_VC_DECL(adp), char *aname,
     AFS_STATCNT(afs_link);
     afs_Trace3(afs_iclSetp, CM_TRACE_LINK, ICL_TYPE_POINTER, adp,
               ICL_TYPE_POINTER, avc, ICL_TYPE_STRING, aname);
+
+    OutFidStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+    OutDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+
     /* create a hard link; new entry is aname in dir adp */
     if ((code = afs_InitReq(&treq, acred)))
        goto done2;
 
     afs_InitFakeStat(&vfakestate);
     afs_InitFakeStat(&dfakestate);
-    
+
     AFS_DISCON_LOCK();
 
     code = afs_EvalFakeStat(&avc, &vfakestate, &treq);
@@ -89,7 +93,7 @@ afs_link(struct vcache *avc, OSI_VC_DECL(adp), char *aname,
        code = EROFS;
        goto done;
     }
-    
+
     if (AFS_IS_DISCONNECTED) {
         code = ENETDOWN;
         goto done;
@@ -104,8 +108,8 @@ afs_link(struct vcache *avc, OSI_VC_DECL(adp), char *aname,
            RX_AFS_GUNLOCK();
            code =
                RXAFS_Link(rxconn, (struct AFSFid *)&adp->f.fid.Fid, aname,
-                          (struct AFSFid *)&avc->f.fid.Fid, &OutFidStatus,
-                          &OutDirStatus, &tsync);
+                          (struct AFSFid *)&avc->f.fid.Fid, OutFidStatus,
+                          OutDirStatus, &tsync);
            RX_AFS_GLOCK();
            XSTATS_END_TIME;
 
@@ -130,7 +134,7 @@ afs_link(struct vcache *avc, OSI_VC_DECL(adp), char *aname,
     }
     if (tdc)
        ObtainWriteLock(&tdc->lock, 635);
-    if (afs_LocalHero(adp, tdc, &OutDirStatus, 1)) {
+    if (afs_LocalHero(adp, tdc, OutDirStatus, 1)) {
        /* we can do it locally */
        ObtainWriteLock(&afs_xdcache, 290);
        code = afs_dir_Create(tdc, aname, &avc->f.fid.Fid);
@@ -168,5 +172,7 @@ afs_link(struct vcache *avc, OSI_VC_DECL(adp), char *aname,
     afs_PutFakeStat(&dfakestate);
     AFS_DISCON_UNLOCK();
   done2:
+    osi_FreeSmallSpace(OutFidStatus);
+    osi_FreeSmallSpace(OutDirStatus);
     return code;
 }
index 72c3598..cc3f1f5 100644 (file)
@@ -42,7 +42,7 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp,
     struct VenusFid unlinkFid, fileFid;
     struct vcache *tvc;
     struct dcache *tdc1, *tdc2;
-    struct AFSFetchStatus OutOldDirStatus, OutNewDirStatus;
+    struct AFSFetchStatus *OutOldDirStatus, *OutNewDirStatus;
     struct AFSVolSync tsync;
     struct rx_connection *rxconn;
     XSTATS_DECLS;
@@ -51,6 +51,9 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp,
               ICL_TYPE_STRING, aname1, ICL_TYPE_POINTER, andp,
               ICL_TYPE_STRING, aname2);
 
+    OutOldDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+    OutNewDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+
     if (strlen(aname1) > AFSNAMEMAX || strlen(aname2) > AFSNAMEMAX) {
        code = ENAMETOOLONG;
        goto done;
@@ -179,8 +182,8 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp,
                                        aname1,
                                        (struct AFSFid *)&andp->f.fid.Fid,
                                        aname2,
-                                       &OutOldDirStatus,
-                                       &OutNewDirStatus,
+                                       OutOldDirStatus,
+                                       OutNewDirStatus,
                                        &tsync);
                RX_AFS_GLOCK();
                XSTATS_END_TIME;
@@ -246,14 +249,14 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp,
        if (!AFS_IS_DISCON_RW) {
            if (oneDir) {
                /* number increases by 1 for whole rename operation */
-               if (!afs_LocalHero(aodp, tdc1, &OutOldDirStatus, 1)) {
+               if (!afs_LocalHero(aodp, tdc1, OutOldDirStatus, 1)) {
                    doLocally = 0;
                }
            } else {
                /* two separate dirs, each increasing by 1 */
-               if (!afs_LocalHero(aodp, tdc1, &OutOldDirStatus, 1))
+               if (!afs_LocalHero(aodp, tdc1, OutOldDirStatus, 1))
                    doLocally = 0;
-               if (!afs_LocalHero(andp, tdc2, &OutNewDirStatus, 1))
+               if (!afs_LocalHero(andp, tdc2, OutNewDirStatus, 1))
                    doLocally = 0;
                if (!doLocally) {
                    if (tdc1) {
@@ -307,9 +310,9 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp,
            }
            /* If we're in the same directory, link count doesn't change */
        } else {
-           aodp->f.m.LinkCount = OutOldDirStatus.LinkCount;
+           aodp->f.m.LinkCount = OutOldDirStatus->LinkCount;
            if (!oneDir)
-               andp->f.m.LinkCount = OutNewDirStatus.LinkCount;
+               andp->f.m.LinkCount = OutNewDirStatus->LinkCount;
        }
 
     } else {                   /* operation failed (code != 0) */
@@ -436,6 +439,8 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp,
     }
     code = returnCode;
   done:
+    osi_FreeSmallSpace(OutOldDirStatus);
+    osi_FreeSmallSpace(OutNewDirStatus);
     return code;
 }
 
index dfb9e4c..8d4c17a 100644 (file)
@@ -79,7 +79,7 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
     struct server *hostp = 0;
     struct vcache *tvc;
     struct AFSStoreStatus InStatus;
-    struct AFSFetchStatus OutFidStatus, OutDirStatus;
+    struct AFSFetchStatus *OutFidStatus, *OutDirStatus;
     struct AFSCallBack CallBack;
     struct AFSVolSync tsync;
     struct volume *volp = 0;
@@ -92,6 +92,9 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
     afs_Trace2(afs_iclSetp, CM_TRACE_SYMLINK, ICL_TYPE_POINTER, adp,
               ICL_TYPE_STRING, aname);
 
+    OutFidStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+    OutDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+
     if ((code = afs_InitReq(&treq, acred)))
        goto done2;
 
@@ -169,7 +172,7 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
                                         (struct AFSFid *)&adp->f.fid.Fid,
                                         aname, atargetName, &InStatus,
                                         (struct AFSFid *)&newFid.Fid,
-                                        &OutFidStatus, &OutDirStatus, 
+                                        OutFidStatus, OutDirStatus,
                                         &CallBack, &tsync);
                    RX_AFS_GLOCK();
                } else {
@@ -178,7 +181,7 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
                        RXAFS_Symlink(rxconn, (struct AFSFid *)&adp->f.fid.Fid,
                                      aname, atargetName, &InStatus,
                                      (struct AFSFid *)&newFid.Fid, 
-                                     &OutFidStatus, &OutDirStatus, &tsync);
+                                     OutFidStatus, OutDirStatus, &tsync);
                    RX_AFS_GLOCK();
                }
                XSTATS_END_TIME;
@@ -211,7 +214,7 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
        goto done;
     }
     /* otherwise, we should see if we can make the change to the dir locally */
-    if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, &OutDirStatus, 1)) {
+    if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, OutDirStatus, 1)) {
        /* we can do it locally */
        ObtainWriteLock(&afs_xdcache, 293);
        /* If the following fails because the name has been created in the meantime, the
@@ -273,7 +276,7 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
        }
        afs_DisconAddDirty(tvc, VDisconCreate, 0);
     } else {
-       afs_ProcessFS(tvc, &OutFidStatus, &treq);
+       afs_ProcessFS(tvc, OutFidStatus, &treq);
     }
 
     if (!tvc->linkData) {
@@ -296,6 +299,8 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
     AFS_DISCON_UNLOCK();
     code = afs_CheckCode(code, &treq, 31);
   done2:
+    osi_FreeSmallSpace(OutFidStatus);
+    osi_FreeSmallSpace(OutDirStatus);
     return code;
 }
 
index fd1c54d..fbd542d 100644 (file)
@@ -48,6 +48,12 @@ extern int afs_shuttingdown;
 #define        AFS_VFSFSID             AFS_MOUNT_AFS
 #endif
 #endif
+/* use this value for reporting total space, free space, etc.
+ * fake a high number to satisfy programs that use the statfs call to make sure
+ * that there's enough space in the device partition before storing something
+ * there. keep it just under 2^31, to try and be safe about not breaking
+ * stuff that looks at the amount of free space. */
+#define AFS_VFS_FAKEFREE (2147483647)
 
 /* Moved from VNOPS/afs_vnop_flocks so can be used in prototypes */
 #if     defined(AFS_HPUX102_ENV)
index d97f334..06fbdb3 100644 (file)
@@ -71,6 +71,7 @@
 #include "afs/audit.h"
 
 extern int restricted;
+extern int restrict_anonymous;
 extern struct ubik_dbase *dbase;
 extern int pr_noAuth;
 extern int prp_group_default;
@@ -88,7 +89,7 @@ static afs_int32 dumpEntry(struct rx_call *call, afs_int32 apos,
 static afs_int32 addToGroup(struct rx_call *call, afs_int32 aid, afs_int32 gid,
                            afs_int32 *cid);
 static afs_int32 nameToID(struct rx_call *call, namelist *aname, idlist *aid);
-static afs_int32 idToName(struct rx_call *call, idlist *aid, namelist *aname);
+static afs_int32 idToName(struct rx_call *call, idlist *aid, namelist *aname, afs_int32 *cid);
 static afs_int32 Delete(struct rx_call *call, afs_int32 aid, afs_int32 *cid);
 static afs_int32 UpdateEntry(struct rx_call *call, afs_int32 aid, char *name,
                             struct PrUpdateEntry *uentry, afs_int32 *cid);
@@ -99,8 +100,8 @@ static afs_int32 getCPS(struct rx_call *call, afs_int32 aid, prlist *alist,
 static afs_int32 getCPS2(struct rx_call *call, afs_int32 aid, afs_uint32 ahost,
                         prlist *alist, afs_int32 *over, afs_int32 *cid);
 static afs_int32 getHostCPS(struct rx_call *call, afs_uint32 ahost,
-                           prlist *alist, afs_int32 *over);
-static afs_int32 listMax(struct rx_call *call, afs_int32 *uid, afs_int32 *gid);
+                           prlist *alist, afs_int32 *over, afs_int32 *cid);
+static afs_int32 listMax(struct rx_call *call, afs_int32 *uid, afs_int32 *gid, afs_int32 *cid);
 static afs_int32 setMax(struct rx_call *call, afs_int32 aid, afs_int32 gflag,
                        afs_int32 *cid);
 static afs_int32 listEntry(struct rx_call *call, afs_int32 aid,
@@ -373,6 +374,8 @@ whereIsIt(struct rx_call *call, afs_int32 aid, afs_int32 *apos, afs_int32 *cid)
     code = WhoIsThis(call, tt, cid);
     if (code)
        ABORT_WITH(tt, PRPERM);
+    if (!pr_noAuth && restrict_anonymous && *cid == ANONYMOUSID)
+       ABORT_WITH(tt, PRPERM);
 
     temp = FindByID(tt, aid);
     if (!temp)
@@ -609,15 +612,16 @@ afs_int32
 SPR_IDToName(struct rx_call *call, idlist *aid, namelist *aname)
 {
     afs_int32 code;
+    afs_int32 cid = ANONYMOUSID;
 
-    code = idToName(call, aid, aname);
+    code = idToName(call, aid, aname, &cid);
     osi_auditU(call, PTS_IdToNmEvent, code, AUD_END);
     ViceLog(125, ("PTS_IDToName: code %d\n", code));
     return code;
 }
 
 static afs_int32
-idToName(struct rx_call *call, idlist *aid, namelist *aname)
+idToName(struct rx_call *call, idlist *aid, namelist *aname, afs_int32 *cid)
 {
     afs_int32 code;
     struct ubik_trans *tt;
@@ -644,6 +648,12 @@ idToName(struct rx_call *call, idlist *aid, namelist *aname)
     if (code)
        return code;
 
+    code = WhoIsThis(call, tt, cid);
+    if (code)
+       ABORT_WITH(tt, PRPERM);
+    if (!pr_noAuth && restrict_anonymous && *cid == ANONYMOUSID)
+       ABORT_WITH(tt, PRPERM);
+
     for (i = 0; i < aid->idlist_len; i++) {
        code = IDToName(tt, aid->idlist_val[i], aname->namelist_val[i]);
        if (code != PRSUCCESS)
@@ -1088,6 +1098,12 @@ getCPS(struct rx_call *call, afs_int32 aid, prlist *alist, afs_int32 *over,
     if (code)
        return code;
 
+    code = WhoIsThis(call, tt, cid);
+    if (code)
+       ABORT_WITH(tt, PRPERM);
+    if (!pr_noAuth && restrict_anonymous && *cid == ANONYMOUSID)
+       ABORT_WITH(tt, PRPERM);
+
     temp = FindByID(tt, aid);
     if (!temp)
        ABORT_WITH(tt, PRNOENT);
@@ -1095,9 +1111,7 @@ getCPS(struct rx_call *call, afs_int32 aid, prlist *alist, afs_int32 *over,
     if (code)
        ABORT_WITH(tt, code);
 
-    /* afs does authenticate now */
-    code = WhoIsThis(call, tt, cid);
-    if (code || !AccessOK(tt, *cid, &tentry, PRP_MEMBER_MEM, PRP_MEMBER_ANY))
+    if (!AccessOK(tt, *cid, &tentry, PRP_MEMBER_MEM, PRP_MEMBER_ANY))
        ABORT_WITH(tt, PRPERM);
 
     code = GetList(tt, &tentry, alist, 1);
@@ -1204,8 +1218,9 @@ SPR_GetHostCPS(struct rx_call *call, afs_int32 ahost, prlist *alist,
               afs_int32 *over)
 {
     afs_int32 code;
+    afs_int32 cid = ANONYMOUSID;
 
-    code = getHostCPS(call, ahost, alist, over);
+    code = getHostCPS(call, ahost, alist, over, &cid);
     osi_auditU(call, PTS_GetHCPSEvent, code, AUD_HOST, htonl(ahost), AUD_END);
     ViceLog(125, ("PTS_GetHostCPS: code %d ahost %d\n", code, ahost));
     return code;
@@ -1213,7 +1228,7 @@ SPR_GetHostCPS(struct rx_call *call, afs_int32 ahost, prlist *alist,
 
 afs_int32
 getHostCPS(struct rx_call *call, afs_uint32 ahost, prlist *alist,
-          afs_int32 *over)
+          afs_int32 *over, afs_int32 *cid)
 {
     afs_int32 code, temp;
     struct ubik_trans *tt;
@@ -1231,6 +1246,12 @@ getHostCPS(struct rx_call *call, afs_uint32 ahost, prlist *alist,
     if (code)
        return code;
 
+    code = WhoIsThis(call, tt, cid);
+    if (code)
+       ABORT_WITH(tt, PRPERM);
+    if (!pr_noAuth && restrict_anonymous && *cid == ANONYMOUSID)
+       ABORT_WITH(tt, PRPERM);
+
     code = NameToID(tt, afs_inet_ntoa_r(iaddr.s_addr, hoststr), &hostid);
     if (code == PRSUCCESS && hostid != 0) {
        temp = FindByID(tt, hostid);
@@ -1259,15 +1280,16 @@ afs_int32
 SPR_ListMax(struct rx_call *call, afs_int32 *uid, afs_int32 *gid)
 {
     afs_int32 code;
+    afs_int32 cid = ANONYMOUSID;
 
-    code = listMax(call, uid, gid);
+    code = listMax(call, uid, gid, &cid);
     osi_auditU(call, PTS_LstMaxEvent, code, AUD_END);
     ViceLog(125, ("PTS_ListMax: code %d\n", code));
     return code;
 }
 
 afs_int32
-listMax(struct rx_call *call, afs_int32 *uid, afs_int32 *gid)
+listMax(struct rx_call *call, afs_int32 *uid, afs_int32 *gid, afs_int32 *cid)
 {
     afs_int32 code;
     struct ubik_trans *tt;
@@ -1276,6 +1298,12 @@ listMax(struct rx_call *call, afs_int32 *uid, afs_int32 *gid)
     if (code)
        return code;
 
+    code = WhoIsThis(call, tt, cid);
+    if (code)
+       ABORT_WITH(tt, PRPERM);
+    if (!pr_noAuth && restrict_anonymous && *cid == ANONYMOUSID)
+       ABORT_WITH(tt, PRPERM);
+
     code = GetMax(tt, uid, gid);
     if (code != PRSUCCESS)
        ABORT_WITH(tt, code);
@@ -1355,6 +1383,8 @@ listEntry(struct rx_call *call, afs_int32 aid, struct prcheckentry *aentry,
     code = WhoIsThis(call, tt, cid);
     if (code)
        ABORT_WITH(tt, PRPERM);
+    if (!pr_noAuth && restrict_anonymous && *cid == ANONYMOUSID)
+       ABORT_WITH(tt, PRPERM);
     temp = FindByID(tt, aid);
     if (!temp)
        ABORT_WITH(tt, PRNOENT);
@@ -1739,12 +1769,15 @@ listSuperGroups(struct rx_call *call, afs_int32 aid, prlist *alist,
     if (code)
        return code;
 
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
     code = WhoIsThis(call, tt, cid);
     if (code)
        ABORT_WITH(tt, PRPERM);
+    if (!pr_noAuth && restrict_anonymous && *cid == ANONYMOUSID)
+       ABORT_WITH(tt, PRPERM);
+
+    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
+    if (code)
+       ABORT_WITH(tt, code);
 
     temp = FindByID(tt, aid);
     if (!temp)
index 2fd4912..bd264e2 100644 (file)
@@ -539,12 +539,13 @@ GetNameOrId(struct cmd_syndesc *as, struct idlist *lids,
        code = pr_IdToName(&ids, &tnames);
        if (code)
            afs_com_err(whoami, code, "translating ids");
-       else
+       else {
            goodCount++;
-       if (lnames) {
-           for (x = 0; x < ids.idlist_len; x++)
-               strcpy(lnames->namelist_val[nd + x], tnames.namelist_val[x]);
-           lnames->namelist_len = nd + x;
+           if (lnames) {
+               for (x = 0; x < ids.idlist_len; x++)
+                   strcpy(lnames->namelist_val[nd + x], tnames.namelist_val[x]);
+               lnames->namelist_len = nd + x;
+           }
        }
     }
     /* treat things as working if any of the lookups worked */
index 8df4e3a..248b663 100644 (file)
@@ -147,6 +147,7 @@ extern afs_int32 depthsg;
 #endif
 
 int restricted = 0;
+int restrict_anonymous = 0;
 int rxMaxMTU = -1;
 int rxBind = 0;
 int rxkadDisableDotCheck = 0;
@@ -214,6 +215,7 @@ enum optionsList {
     OPT_access,
     OPT_groupdepth,
     OPT_restricted,
+    OPT_restrict_anonymous,
     OPT_auditlog,
     OPT_auditiface,
     OPT_config,
@@ -316,6 +318,8 @@ main(int argc, char **argv)
 #endif
     cmd_AddParmAtOffset(opts, OPT_restricted, "-restricted", CMD_FLAG,
                        CMD_OPTIONAL, "enable restricted mode");
+    cmd_AddParmAtOffset(opts, OPT_restrict_anonymous, "-restrict_anonymous",
+                       CMD_FLAG, CMD_OPTIONAL, "enable restricted anonymous mode");
 
     /* general server options */
     cmd_AddParmAtOffset(opts, OPT_auditlog, "-auditlog", CMD_SINGLE,
@@ -376,6 +380,7 @@ main(int argc, char **argv)
 #endif
 
     cmd_OptionAsFlag(opts, OPT_restricted, &restricted);
+    cmd_OptionAsFlag(opts, OPT_restrict_anonymous, &restrict_anonymous);
 
     /* general server options */
     cmd_OptionAsString(opts, OPT_auditlog, &auditFileName);
index 5fe3a16..8501081 100644 (file)
@@ -437,7 +437,6 @@ static int rxdb_fileID = RXDB_FILE_RX;
 #define CLEAR_CALL_QUEUE_LOCK(C)
 #endif /* RX_ENABLE_LOCKS */
 struct rx_serverQueueEntry *rx_waitForPacket = 0;
-struct rx_serverQueueEntry *rx_waitingForPacket = 0;
 
 /* ------------Exported Interfaces------------- */
 
@@ -2128,8 +2127,6 @@ rx_GetCall(int tno, struct rx_service *cur_service, osi_socket * socketp)
            opr_queue_Append(&rx_idleServerQueue, &sq->entry);
 #ifndef AFS_AIX41_ENV
            rx_waitForPacket = sq;
-#else
-           rx_waitingForPacket = sq;
 #endif /* AFS_AIX41_ENV */
            do {
                CV_WAIT(&sq->cv, &rx_serverPool_lock);