Here are a few bug fixes for OpenAFS.  Diffs are based on 5/1/2001 snapshot.
Changes:

1) Fixed bug allowing user with only lookup permission on a dir. to stat
files in the dir. if the stat information was already in the cache.

2) Fixed race condition with RX connections by adding RX_CONN_BUSY status.

3) Fixed bug checking open mode in uafs_open.


Jeff Riegel
[EMAIL PROTECTED]


diff -Nur --exclude-from=exclude orig-src/afs/UKERNEL/afs_usrops.c 
src/afs/UKERNEL/afs_usrops.c
--- orig-src/afs/UKERNEL/afs_usrops.c   Sat Apr 14 10:27:43 2001
+++ src/afs/UKERNEL/afs_usrops.c        Thu May 24 17:07:58 2001
@@ -2678,6 +2678,7 @@
            if (flags & (O_WRONLY|O_RDWR)) {
                fileMode |= VWRITE;
            }
+         if (!fileMode) fileMode = VREAD;  /* since O_RDONLY is 0 */
            code = afs_access(fileP, fileMode, u.u_cred);
            if (code != 0) {
                VN_RELE(fileP);
diff -Nur --exclude-from=exclude orig-src/afs/VNOPS/afs_vnop_create.c 
src/afs/VNOPS/afs_vnop_create.c
--- orig-src/afs/VNOPS/afs_vnop_create.c        Mon Mar 26 23:06:38 2001
+++ src/afs/VNOPS/afs_vnop_create.c     Fri Jun  1 20:04:30 2001
@@ -177,6 +177,10 @@
                if ((amode & VWRITE) || len != 0xffffffff) 
 #endif
                  {
+              /* these lines are needed for write access check */
+              tvc->parentVnode = adp->fid.Fid.Vnode;
+              tvc->parentUnique = adp->fid.Fid.Unique;
+
                    /* need write mode for these guys */
                    if (!afs_AccessOK(tvc, PRSFS_WRITE, &treq, CHECK_MODE_BITS)) {
                        afs_PutVCache(tvc, READ_LOCK);
diff -Nur --exclude-from=exclude orig-src/afs/VNOPS/afs_vnop_lookup.c 
src/afs/VNOPS/afs_vnop_lookup.c
--- orig-src/afs/VNOPS/afs_vnop_lookup.c        Sat Feb 24 07:35:05 2001
+++ src/afs/VNOPS/afs_vnop_lookup.c     Thu May 24 17:01:40 2001
@@ -883,6 +883,7 @@
     extern afs_int32 afs_mariner;                      /*Writing activity to log?*/
     OSI_VC_CONVERT(adp)
     afs_hyper_t versionNo;
+    int no_read_access = 0;
 
     AFS_STATCNT(afs_lookup);
 #ifdef AFS_OSF_ENV
@@ -990,6 +991,10 @@
        else adp->last_looker = treq.uid;
     } 
 
+    /* Check for read access as well.  We need read access in order to
+       stat files, but not to stat subdirectories. */
+    if (!afs_AccessOK(adp, PRSFS_READ, &treq, CHECK_MODE_BITS))
+      no_read_access = 1;
 
     /* special case lookup of ".".  Can we check for it sooner in this code,
      * for instance, way up before "redo:" ??
@@ -1011,8 +1016,15 @@
 
     tvc = osi_dnlc_lookup (adp, tname, WRITE_LOCK);
     *avcp = tvc;  /* maybe wasn't initialized, but it is now */
-#ifdef AFS_LINUX22_ENV
     if (tvc) {
+      if (no_read_access && vType(tvc) != VDIR) {
+        /* need read access on dir to stat non-directory */
+        afs_PutVCache(tvc, WRITE_LOCK);
+        *avcp = (struct vcache *)0;
+        code = EACCES;
+        goto done;
+      }
+#ifdef AFS_LINUX22_ENV
       if (tvc->mvstat == 2) { /* we don't trust the dnlc for root vcaches */
        AFS_RELE(tvc);
        *avcp = 0;
@@ -1022,14 +1034,12 @@
        hit = 1;
        goto done;
       }
-    }
 #else /* non - LINUX */
-    if (tvc) {
       code = 0;
       hit = 1;
       goto done;
-    }
 #endif /* linux22 */
+    }
 
     {
     register struct dcache *tdc;
diff -Nur --exclude-from=exclude orig-src/afs/afs_pioctl.c src/afs/afs_pioctl.c
--- orig-src/afs/afs_pioctl.c   Mon Apr 30 15:08:40 2001
+++ src/afs/afs_pioctl.c        Fri Jun  1 20:00:47 2001
@@ -1845,6 +1845,13 @@
            afs_ResetUserConns(tu);
            tu->refCount--;
            ObtainWriteLock(&afs_xuser,228);
+#ifdef UKERNEL
+            /* set the expire times to 0, causes
+             * afs_GCUserData to remove this entry
+             */
+            tu->ct.EndTimestamp = 0;
+            tu->tokenTime = 0;
+#endif  /* UKERNEL */
        }
     }
     ReleaseWriteLock(&afs_xuser);
diff -Nur --exclude-from=exclude orig-src/rx/rx.c src/rx/rx.c
--- orig-src/rx/rx.c    Mon Apr 30 00:03:55 2001
+++ src/rx/rx.c Thu May 24 17:16:51 2001
@@ -863,7 +863,7 @@
        MUTEX_EXIT(&rx_stats_mutex);
     }
 
-    if (conn->refCount > 0) {
+    if ((conn->refCount > 0) || (conn->flags & RX_CONN_BUSY)) {
        /* Busy; wait till the last guy before proceeding */
        MUTEX_EXIT(&conn->conn_data_lock);
        USERPRI;
@@ -1763,6 +1763,7 @@
        MUTEX_ENTER(&conn->conn_call_lock);
        MUTEX_ENTER(&call->lock);
        MUTEX_ENTER(&conn->conn_data_lock);
+       conn->flags |= RX_CONN_BUSY;
        if (conn->flags & RX_CONN_MAKECALL_WAITING) {
            conn->flags &= (~RX_CONN_MAKECALL_WAITING);
            MUTEX_EXIT(&conn->conn_data_lock);
@@ -1801,8 +1802,10 @@
 
     CALL_RELE(call, RX_CALL_REFCOUNT_BEGIN);
     MUTEX_EXIT(&call->lock);
-    if (conn->type == RX_CLIENT_CONNECTION)
+    if (conn->type == RX_CLIENT_CONNECTION) {
        MUTEX_EXIT(&conn->conn_call_lock);
+       conn->flags &= ~RX_CONN_BUSY;
+    }
     AFS_RXGUNLOCK();
     USERPRI;
     /*
@@ -6600,7 +6603,8 @@
      * queue.
      */
 
-    if ((rpc_stat == NULL) ||
+    if (queue_IsEnd(stats, rpc_stat) ||
+       (rpc_stat == NULL) ||
        (rpc_stat->stats[0].interfaceId != rxInterface) ||
        (rpc_stat->stats[0].remote_is_server != isServer)) {
        int i;
diff -Nur --exclude-from=exclude orig-src/rx/rx.h src/rx/rx.h
--- orig-src/rx/rx.h    Mon Mar 26 16:51:36 2001
+++ src/rx/rx.h Thu May 24 17:17:28 2001
@@ -481,6 +481,7 @@
 #define RX_CONN_USING_PACKET_CKSUM  4  /* non-zero header.spare field seen */
 #define RX_CONN_KNOW_WINDOW         8   /* window size negotiation works */
 #define RX_CONN_RESET             16   /* connection is reset, remove */
+#define RX_CONN_BUSY               32   /* connection is busy; don't delete */
 
 /* Type of connection, client or server */
 #define        RX_CLIENT_CONNECTION    0
_______________________________________________
OpenAFS-devel mailing list
[EMAIL PROTECTED]
https://lists.openafs.org/mailman/listinfo/openafs-devel

Reply via email to