From 74872b775f56e675ee5074d1f6ca9e25c9befd44 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sun, 8 Oct 2006 21:35:53 +0000 Subject: [PATCH] STABLE14-windows-scache-ref-leak-20061008 plug two more scache refcount leaks (cherry picked from commit 7231e2efe650b004168d443a290c4fed8b2db0a5) --- src/WINNT/afsd/afsd_init.c | 7 +++++++ src/WINNT/afsd/afsd_init.h | 1 + src/WINNT/afsd/afsd_service.c | 4 +++- src/WINNT/afsd/cm_ioctl.c | 30 ++++++++++++++++++++++++------ 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/WINNT/afsd/afsd_init.c b/src/WINNT/afsd/afsd_init.c index fbb012d47..c5a3471ef 100644 --- a/src/WINNT/afsd/afsd_init.c +++ b/src/WINNT/afsd/afsd_init.c @@ -1187,6 +1187,13 @@ int afsd_InitCM(char **reasonP) return 0; } +int afsd_ShutdownCM(void) +{ + cm_ReleaseSCache(&cm_data.rootSCachep); + + return 0; +} + int afsd_InitDaemons(char **reasonP) { long code; diff --git a/src/WINNT/afsd/afsd_init.h b/src/WINNT/afsd/afsd_init.h index 6465341a5..67c5646f6 100644 --- a/src/WINNT/afsd/afsd_init.h +++ b/src/WINNT/afsd/afsd_init.h @@ -19,6 +19,7 @@ int afsd_InitCM(char **reasonP, struct cmd_syndesc *as, char *arock); int afsd_InitSMB(char **reasonP); #endif /* !DJGPP */ int afsd_InitDaemons(char **reasonP); +int afsd_ShutdownCM(void); void afsd_ForceTrace(BOOL flush); void afsd_SetUnhandledExceptionFilter(); diff --git a/src/WINNT/afsd/afsd_service.c b/src/WINNT/afsd/afsd_service.c index d3abc009a..1e38d4fec 100644 --- a/src/WINNT/afsd/afsd_service.c +++ b/src/WINNT/afsd/afsd_service.c @@ -1345,7 +1345,9 @@ afsd_Main(DWORD argc, LPTSTR *argv) cm_DaemonShutdown(); afsi_log("Daemon shutdown complete"); - + + afsd_ShutdownCM(); + buf_Shutdown(); afsi_log("Buffer shutdown complete"); diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index 06d0412d1..d03d68f11 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -256,13 +256,17 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, sharePath, reqp, &substRootp); free(sharePath); - if (code) + if (code) { + osi_Log1(afsd_logp,"cm_ParseIoctlPath [1] code 0x%x", code); return code; + } code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, scpp); - if (code) + if (code) { + osi_Log1(afsd_logp,"cm_ParseIoctlPath [2] code 0x%x", code); return code; + } } else { /* otherwise, treat the name as a cellname mounted off the afs root. * This requires that we reconstruct the shareName string with @@ -284,25 +288,35 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, shareName, reqp, &substRootp); - if (code) + if (code) { + osi_Log1(afsd_logp,"cm_ParseIoctlPath [3] code 0x%x", code); return code; + } code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, scpp); - if (code) + if (code) { + cm_ReleaseSCache(substRootp); + osi_Log1(afsd_logp,"cm_ParseIoctlPath code [4] 0x%x", code); return code; + } } } else { code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->data, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, ioctlp->tidPathp, reqp, &substRootp); - if (code) + if (code) { + osi_Log1(afsd_logp,"cm_ParseIoctlPath [6] code 0x%x", code); return code; + } code = cm_NameI(substRootp, relativePath, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, scpp); - if (code) + if (code) { + cm_ReleaseSCache(substRootp); + osi_Log1(afsd_logp,"cm_ParseIoctlPath [7] code 0x%x", code); return code; + } } /* # of bytes of path */ @@ -312,7 +326,11 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, /* This is usually nothing, but for StatMountPoint it is the file name. */ TranslateExtendedChars(ioctlp->inDatap); + if (substRootp) + cm_ReleaseSCache(substRootp); + /* and return success */ + osi_Log1(afsd_logp,"cm_ParseIoctlPath [8] code 0x%x", code); return 0; } -- 2.39.5