From c21a070a4c6f10d79b355bffde050a0792b559a6 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 3 Feb 2006 23:05:26 +0000 Subject: [PATCH] STABLE14-windows-todays-bugs-20060203 * 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 | 2 +- src/WINNT/afsd/smb.c | 25 ++++++++++++++++--------- src/WINNT/afsd/smb3.c | 13 ++++++++----- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index 65bfa58fa..a23e3b140 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -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; } diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index 9cc6eead5..b60474a6a 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -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]); } diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index a7805e6a1..f570216b2 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -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 -- 2.39.5