From 85caa4d1ded464b2d89eb8d2a14a6cedf93de08c Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sun, 29 Feb 2004 02:38:26 +0000 Subject: [PATCH] win32-name-event-objects-20040228 This is a very bad leak of Event Objects. Name all of our event objects in an attempt to identify the source of the leak. Apparently, the leak is not coming from any Event Objects we are creating directly. Did find a misallocation of event objects in the smb code for the initial session object. Fixed. --- src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.cpp | 2 +- src/WINNT/afsd/NTMakefile | 1 - src/WINNT/afsd/afsd_flushvol.c | 16 ++++- src/WINNT/afsd/afsd_service.c | 4 +- src/WINNT/afsd/smb.c | 101 ++++++++++++++++++--------- src/WINNT/afssvrmgr/alert.cpp | 2 +- src/WINNT/bosctlsvc/bosctlsvc.c | 4 +- src/WINNT/pthread/pthread.c | 11 +++- 8 files changed, 97 insertions(+), 44 deletions(-) diff --git a/src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.cpp b/src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.cpp index 54431d1..2c7df7d 100644 --- a/src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.cpp +++ b/src/WINNT/afsadmsvr/TaAfsAdmSvrCallback.cpp @@ -54,7 +54,7 @@ void AfsAdmSvr_CallbackManager (void) AfsAdmSvr_Enter(); if ((++l.cManagers) == 1) { - l.heCallback = CreateEvent (NULL, TRUE, FALSE, NULL); + l.heCallback = CreateEvent (NULL, TRUE, FALSE, TEXT("AfsAdmSvr_CallbackManager Event")); l.pListCallbacks = New (HASHLIST); } AfsAdmSvr_Leave(); diff --git a/src/WINNT/afsd/NTMakefile b/src/WINNT/afsd/NTMakefile index adec9be..a27894d 100644 --- a/src/WINNT/afsd/NTMakefile +++ b/src/WINNT/afsd/NTMakefile @@ -308,7 +308,6 @@ AFSD_EXELIBS =\ $(DESTDIR)\lib\afs\mtafsint.lib \ $(DESTDIR)\lib\libafsconf.lib \ $(DESTDIR)\lib\afs\afsreg.lib \ - $(DESTDIR)\lib\libosi.lib \ rpcrt4.lib \ user32.lib \ Dbghelp.lib diff --git a/src/WINNT/afsd/afsd_flushvol.c b/src/WINNT/afsd/afsd_flushvol.c index 4ba3971..d0dce41 100644 --- a/src/WINNT/afsd/afsd_flushvol.c +++ b/src/WINNT/afsd/afsd_flushvol.c @@ -399,24 +399,34 @@ PowerNotificationThreadCreate() { BOOL bSuccess = FALSE; DWORD dwThreadId = 0; + char eventName[MAX_PATH]; do { // create power event notification event // bManualReset=TRUE, bInitialState=FALSE - gThreadInfo.hEventPowerEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + gThreadInfo.hEventPowerEvent = CreateEvent(NULL, TRUE, FALSE, + TEXT("afsd_flushvol_EventPowerEvent")); + if ( GetLastError() == ERROR_ALREADY_EXISTS ) + afsi_log("Event Object Already Exists: %s", eventName); if (gThreadInfo.hEventPowerEvent == NULL) break; // create mainline resume event // bManualReset=FALSE, bInitialState=FALSE - gThreadInfo.hEventResumeMain = CreateEvent(NULL, FALSE, FALSE, NULL); + gThreadInfo.hEventResumeMain = CreateEvent(NULL, FALSE, FALSE, + TEXT("afsd_flushvol_EventResumeMain")); + if ( GetLastError() == ERROR_ALREADY_EXISTS ) + afsi_log("Event Object Already Exists: %s", eventName); if (gThreadInfo.hEventResumeMain == NULL) break; // create thread terminate event // bManualReset=FALSE, bInitialState=FALSE - gThreadInfo.hEventTerminate = CreateEvent(NULL, FALSE, FALSE, NULL); + gThreadInfo.hEventTerminate = CreateEvent(NULL, FALSE, FALSE, + TEXT("afsd_flushvol_EventTerminate")); + if ( GetLastError() == ERROR_ALREADY_EXISTS ) + afsi_log("Event Object Already Exists: %s", eventName); if (gThreadInfo.hEventTerminate == NULL) break; diff --git a/src/WINNT/afsd/afsd_service.c b/src/WINNT/afsd/afsd_service.c index 6ee75a5..7dcb4a2 100644 --- a/src/WINNT/afsd/afsd_service.c +++ b/src/WINNT/afsd/afsd_service.c @@ -327,7 +327,9 @@ void afsd_Main(DWORD argc, LPTSTR *argv) GlobalStatus = 0; - WaitToTerminate = CreateEvent(NULL, TRUE, FALSE, NULL); + WaitToTerminate = CreateEvent(NULL, TRUE, FALSE, TEXT("afsd_service_WaitToTerminate")); + if ( GetLastError() == ERROR_ALREADY_EXISTS ) + afsi_log("Event Object Already Exists: %s", TEXT("afsd_service_WaitToTerminate")); #ifndef NOTSERVICE StatusHandle = RegisterServiceCtrlHandlerEx(AFS_DAEMON_SERVICE_NAME, diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index dfac000..2f1e971 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -985,30 +985,34 @@ retry: if (fid == fidp->fid) { if (newFid) { fid++; - if (fid == 0) fid = 1; - goto retry; - } + if (fid == 0) fid = 1; + goto retry; + } fidp->refCount++; - break; + break; } - } - if (!fidp && (flags & SMB_FLAG_CREATE)) { + } + if (!fidp && (flags & SMB_FLAG_CREATE)) { + char eventName[MAX_PATH]; + sprintf(eventName,"fid_t event fid=%d", fid); fidp = malloc(sizeof(*fidp)); - memset(fidp, 0, sizeof(*fidp)); + memset(fidp, 0, sizeof(*fidp)); osi_QAdd((osi_queue_t **)&vcp->fidsp, &fidp->q); - fidp->refCount = 1; - fidp->vcp = vcp; - lock_InitializeMutex(&fidp->mx, "fid_t mutex"); - fidp->fid = fid; + fidp->refCount = 1; + fidp->vcp = vcp; + lock_InitializeMutex(&fidp->mx, "fid_t mutex"); + fidp->fid = fid; fidp->curr_chunk = fidp->prev_chunk = -2; - fidp->raw_write_event = thrd_CreateEvent(NULL, FALSE, TRUE, NULL); - if (newFid) { + fidp->raw_write_event = thrd_CreateEvent(NULL, FALSE, TRUE, eventName); + if ( GetLastError() == ERROR_ALREADY_EXISTS ) + afsi_log("Event Object Already Exists: %s", eventName); + if (newFid) { vcp->fidCounter = fid+1; - if (vcp->fidCounter == 0) vcp->fidCounter = 1; - } + if (vcp->fidCounter == 0) vcp->fidCounter = 1; } - lock_ReleaseWrite(&smb_rctLock); - return fidp; + } + lock_ReleaseWrite(&smb_rctLock); + return fidp; } void smb_ReleaseFID(smb_fid_t *fidp) @@ -1624,7 +1628,7 @@ unsigned int smb_GetSMBParm(smb_packet_t *smbp, int parm) if (parm >= parmCount) { #ifndef DJGPP - HANDLE h; + HANDLE h; char *ptbuf[1]; char s[100]; h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); @@ -6145,9 +6149,13 @@ void smb_Server(VOID *parmp) /* Special handling for Write Raw */ raw_write_cont_t rwc; EVENT_HANDLE rwevent; - smb_DispatchPacket(vcp, bufp, outbufp, ncbp, &rwc); + char eventName[MAX_PATH]; + + smb_DispatchPacket(vcp, bufp, outbufp, ncbp, &rwc); if (rwc.code == 0) { - rwevent = thrd_CreateEvent(NULL, FALSE, FALSE, NULL); + rwevent = thrd_CreateEvent(NULL, FALSE, FALSE, TEXT("smb_Server() rwevent")); + if ( GetLastError() == ERROR_ALREADY_EXISTS ) + afsi_log("Event Object Already Exists: %s", eventName); ncbp->ncb_command = NCBRECV | ASYNCH; ncbp->ncb_lsn = (unsigned char) vcp->lsn; ncbp->ncb_lana_num = vcp->lana; @@ -6159,14 +6167,12 @@ void smb_Server(VOID *parmp) #else Netbios(ncbp, dos_ncb); #endif /* !DJGPP */ - rcode = thrd_WaitForSingleObject_Event(rwevent, - RAWTIMEOUT); + rcode = thrd_WaitForSingleObject_Event(rwevent, RAWTIMEOUT); thrd_CloseHandle(rwevent); } thrd_SetEvent(SessionEvents[idx_session]); if (rwc.code == 0) - smb_CompleteWriteRaw(vcp, bufp, outbufp, ncbp, - &rwc); + smb_CompleteWriteRaw(vcp, bufp, outbufp, ncbp, &rwc); } else if (smbp->com == 0xa0) { /* * Serialize the handling for NT Transact @@ -6231,15 +6237,25 @@ void InitNCBslot(int idx) struct smb_packet *bufp; EVENT_HANDLE retHandle; int i; + char eventName[MAX_PATH]; osi_assert( idx < (sizeof(NCBs) / sizeof(NCBs[0])) ); NCBs[idx] = GetNCB(); - NCBavails[idx] = thrd_CreateEvent(NULL, FALSE, TRUE, NULL); + sprintf(eventName,"NCBavails[%d]", idx); + NCBavails[idx] = thrd_CreateEvent(NULL, FALSE, TRUE, eventName); + if ( GetLastError() == ERROR_ALREADY_EXISTS ) + afsi_log("Event Object Already Exists: %s", eventName); #ifndef DJGPP - NCBevents[idx] = thrd_CreateEvent(NULL, TRUE, FALSE, NULL); + sprintf(eventName,"NCBevents[%d]", idx); + NCBevents[idx] = thrd_CreateEvent(NULL, TRUE, FALSE, eventName); + if ( GetLastError() == ERROR_ALREADY_EXISTS ) + afsi_log("Event Object Already Exists: %s", eventName); #endif /* !DJGPP */ - retHandle = thrd_CreateEvent(NULL, FALSE, FALSE, NULL); + sprintf(eventName,"NCBReturns[0<=ievent = CreateEvent((LPSECURITY_ATTRIBUTES) 0, FALSE, - FALSE, (LPCTSTR) 0); + FALSE, (LPCTSTR) eventName); if (new->event == NULL) { free(new); new = NULL; -- 1.7.1