]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE14-windows-todays-bugs-20060203
authorJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 3 Feb 2006 23:05:26 +0000 (23:05 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 3 Feb 2006 23:05:26 +0000 (23:05 +0000)
* cell names must be treated as case insensitive

* smb logoff messages do not mean the user is logging off the machine.
  do not use as an indication that tokens should be destroyed

* use the correct lock and avoid a deadlock when handling dead VCs

(cherry picked from commit 22b02189ecc70a94410fb1648da987d0964ddcaf)

src/WINNT/afsd/cm_cell.c
src/WINNT/afsd/smb.c
src/WINNT/afsd/smb3.c

index 65bfa58fa1dbb980ed1a8a19fa835a140ffe31bc..a23e3b140ecc9751d8a945e4d0252844436d84ab 100644 (file)
@@ -134,7 +134,7 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, long flags)
 
     lock_ObtainWrite(&cm_cellLock);
     for (cp = cm_data.allCellsp; cp; cp=cp->nextp) {
-        if (strcmp(namep, cp->name) == 0) {
+        if (stricmp(namep, cp->name) == 0) {
             strcpy(fullname, cp->name);
             break;
         }
index 9cc6eead5914d7931ec50641e76e3151553946e7..b60474a6a9fd4fcffa1e55492d57b63bf51857f7 100644 (file)
@@ -2485,11 +2485,11 @@ void smb_SendPacket(smb_vc_t *vcp, smb_packet_t *inp)
        osi_Log2(smb_logp, "marking dead vcp 0x%x, user struct 0x%x",
                  vcp, vcp->usersp);
 
-       lock_ObtainWrite(&smb_globalLock);
        lock_ObtainMutex(&vcp->mx);
        vcp->flags |= SMB_VCFLAG_ALREADYDEAD;
-       dead_sessions[vcp->session] = TRUE;
        lock_ReleaseMutex(&vcp->mx);
+       lock_ObtainWrite(&smb_globalLock);
+       dead_sessions[vcp->session] = TRUE;
        lock_ReleaseWrite(&smb_globalLock);
        smb_CleanupDeadVC(vcp);
     }
@@ -7731,19 +7731,21 @@ void smb_Server(VOID *parmp)
             /* Client closed session */
             vcp = smb_FindVC(ncbp->ncb_lsn, 0, lanas[idx_session]);
             if (vcp) {
-               lock_ObtainWrite(&smb_globalLock);
+               lock_ObtainMutex(&vcp->mx);
                if (!(vcp->flags & SMB_VCFLAG_ALREADYDEAD)) {
                     osi_Log2(smb_logp, "marking dead vcp 0x%x, user struct 0x%x",
                              vcp, vcp->usersp);
-                   lock_ObtainMutex(&vcp->mx);
                     vcp->flags |= SMB_VCFLAG_ALREADYDEAD;
-                   dead_sessions[vcp->session] = TRUE;
                    lock_ReleaseMutex(&vcp->mx);
+                   lock_ObtainWrite(&smb_globalLock);
+                   dead_sessions[vcp->session] = TRUE;
                    lock_ReleaseWrite(&smb_globalLock);
                    smb_CleanupDeadVC(vcp);
                    smb_ReleaseVC(vcp);
                    vcp = NULL;
-                }
+                } else {
+                   lock_ReleaseMutex(&vcp->mx);
+               }
             }
             goto doneWithNCB;
 
@@ -7785,24 +7787,29 @@ void smb_Server(VOID *parmp)
         default:
             /* A weird error code.  Log it, sleep, and continue. */
            vcp = smb_FindVC(ncbp->ncb_lsn, 0, lanas[idx_session]);
+           if (vcp)
+               lock_ObtainMutex(&vcp->mx);
             if (vcp && vcp->errorCount++ > 3) {
                 osi_Log2(smb_logp, "session [ %d ] closed, vcp->errorCount = %d", idx_session, vcp->errorCount);
-               lock_ObtainWrite(&smb_globalLock);
                if (!(vcp->flags & SMB_VCFLAG_ALREADYDEAD)) {
                    osi_Log2(smb_logp, "marking dead vcp 0x%x, user struct 0x%x",
                               vcp, vcp->usersp);
-                   lock_ObtainMutex(&vcp->mx);
                    vcp->flags |= SMB_VCFLAG_ALREADYDEAD;
-                   dead_sessions[vcp->session] = TRUE;
                    lock_ReleaseMutex(&vcp->mx);
+                   lock_ObtainWrite(&smb_globalLock);
+                   dead_sessions[vcp->session] = TRUE;
                    lock_ReleaseWrite(&smb_globalLock);
                    smb_CleanupDeadVC(vcp);
                    smb_ReleaseVC(vcp);
                    vcp = NULL;
+               } else {
+                   lock_ReleaseMutex(&vcp->mx);
                }
                goto doneWithNCB;
             }
             else {
+               if (vcp)
+                   lock_ReleaseMutex(&vcp->mx);
                 thrd_Sleep(1000);
                 thrd_SetEvent(SessionEvents[idx_session]);
             }
index a7805e6a1c7e9a2cbe32fbe686ab514479765f38..f570216b2410f0e53b7986cd7ab58cddadaf33be 100644 (file)
@@ -950,12 +950,19 @@ long smb_ReceiveV3UserLogoffX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou
        unp = uidp->unp;
         lock_ReleaseMutex(&uidp->mx);
 
+#ifdef COMMENT
+       /* we can't do this.  we get logoff messages prior to a session
+        * disconnect even though it doesn't mean the user is logging out.
+        * we need to create a new pioctl and EventLogoff handler to set
+        * SMB_USERNAMEFLAG_LOGOFF.
+        */
        if (unp && smb_LogoffTokenTransfer) {
            lock_ObtainMutex(&unp->mx);
            unp->flags |= SMB_USERNAMEFLAG_LOGOFF;
            unp->last_logoff_t = osi_Time() + smb_LogoffTransferTimeout;
            lock_ReleaseMutex(&unp->mx);
        }
+#endif
 
        smb_ReleaseUID(uidp);
     }
@@ -1167,7 +1174,7 @@ smb_tran2Packet_t *smb_GetTran2ResponsePacket(smb_vc_t *vcp,
     return tp;
 }       
 
-/* free a tran2 packet; must be called with smb_globalLock held */
+/* free a tran2 packet */
 void smb_FreeTran2Packet(smb_tran2Packet_t *t2p)
 {
     if (t2p->vcp) {
@@ -1409,9 +1416,7 @@ long smb_ReceiveV3Trans(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
         }
 
         /* free the input tran 2 packet */
-        lock_ObtainWrite(&smb_globalLock);
         smb_FreeTran2Packet(asp);
-        lock_ReleaseWrite(&smb_globalLock);
     }
     else if (firstPacket) {
         /* the first packet in a multi-packet request, we need to send an
@@ -2047,9 +2052,7 @@ long smb_ReceiveV3Tran2A(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
         }
 
         /* free the input tran 2 packet */
-        lock_ObtainWrite(&smb_globalLock);
         smb_FreeTran2Packet(asp);
-        lock_ReleaseWrite(&smb_globalLock);
     }
     else if (firstPacket) {
         /* the first packet in a multi-packet request, we need to send an