On Wed, 26 May 2010, Stephan Mueller wrote: > An update of the patch: I forgot to also close the directory file handle > which leads to a file descriptor leak. > > Furthermore, I removed the SysRemove() call as I think it is not > necessary any more - the file is never created if it is not needed. and > If it is needed, it should not be created.
Heh, it could have been 10 years that I do not touch LMAIL :) There is no need at all to create the temp file actually, although unless you're running LMAIL every 100 milliseconds, it does not really matter. - Davide diff --git a/LMAILSvr.cpp b/LMAILSvr.cpp index ab92383..cfaacd5 100644 --- a/LMAILSvr.cpp +++ b/LMAILSvr.cpp @@ -112,8 +112,8 @@ static int LMAILLogEnabled(SHB_HANDLE hShbLMAIL, LMAILConfig *pLMAILCfg) return (ulFlags & LMAILF_LOG_ENABLED) ? 1 : 0; } -static int LMAILGetFilesSnapShot(LMAILConfig *pLMAILCfg, long lThreadId, char *pszSSFileName, - int iMaxSSFileName) +static int LMAILGetFilesSnapShot(LMAILConfig *pLMAILCfg, long lThreadId, + SysListHead *pHead) { char szSpoolDir[SYS_MAX_PATH]; @@ -127,15 +127,7 @@ static int LMAILGetFilesSnapShot(LMAILConfig *pLMAILCfg, long lThreadId, char *p if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); - UsrGetTmpFile(NULL, pszSSFileName, iMaxSSFileName); - - FILE *pSSFile = fopen(pszSSFileName, "wb"); - - if (pSSFile == NULL) { - ErrorPush(); - RLckUnlockSH(hResLock); - return ErrorPop(); - } + SYS_INIT_LIST_HEAD(pHead); int iFileCount = 0; char szSpoolFileName[SYS_MAX_PATH]; @@ -149,27 +141,19 @@ static int LMAILGetFilesSnapShot(LMAILConfig *pLMAILCfg, long lThreadId, char *p if ((ulHashValue % (unsigned long) pLMAILCfg->lNumThreads) == (unsigned long) lThreadId) { - fprintf(pSSFile, "%s\r\n", szSpoolFileName); + MscLstDatumAddT(pHead, szSpoolFileName, + strlen(szSpoolFileName)); ++iFileCount; } } while (MscNextFile(hFileScan, szSpoolFileName, sizeof(szSpoolFileName))); MscCloseFindFile(hFileScan); } - fclose(pSSFile); RLckUnlockSH(hResLock); - if (iFileCount == 0) { - SysRemove(pszSSFileName); - SetEmptyString(pszSSFileName); - - ErrSetErrorCode(ERR_NO_LOCAL_SPOOL_FILES); - return ERR_NO_LOCAL_SPOOL_FILES; - } - - return 0; + return iFileCount; } -static int LMAILRemoveProcessed(LMAILConfig *pLMAILCfg, char const *pszListFileName) +static int LMAILRemoveProcessed(LMAILConfig *pLMAILCfg, SysListHead *pHead) { char szSpoolDir[SYS_MAX_PATH]; @@ -183,23 +167,17 @@ static int LMAILRemoveProcessed(LMAILConfig *pLMAILCfg, char const *pszListFileN if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); - FILE *pSSFile = fopen(pszListFileName, "rb"); - - if (pSSFile == NULL) { - ErrorPush(); - RLckUnlockEX(hResLock); - return ErrorPop(); - } + SysListHead *pPos; - char szSpoolFileName[SYS_MAX_PATH]; - - while (MscGetString(pSSFile, szSpoolFileName, sizeof(szSpoolFileName) - 1) != NULL) { + for (pPos = SYS_LIST_FIRST(pHead); pPos != NULL; + pPos = SYS_LIST_NEXT(pPos, pHead)) { + LstDatum *pLDm = SYS_LIST_ENTRY(pPos, LstDatum, LLnk); char szSpoolFilePath[SYS_MAX_PATH]; - sprintf(szSpoolFilePath, "%s%s%s", szSpoolDir, SYS_SLASH_STR, szSpoolFileName); + sprintf(szSpoolFilePath, "%s%s%s", szSpoolDir, SYS_SLASH_STR, + pLDm->Data.pData); CheckRemoveFile(szSpoolFilePath); } - fclose(pSSFile); RLckUnlockEX(hResLock); return 0; @@ -402,7 +380,8 @@ static int LMAILSubmitLocalFile(LMAILConfig *pLMAILCfg, const char *pszMailFile, return 0; } -static int LMAILProcessList(LMAILConfig *pLMAILCfg, long lThreadId, char const *pszSSFileName) +static int LMAILProcessList(LMAILConfig *pLMAILCfg, long lThreadId, + SysListHead *pHead) { char szSpoolDir[SYS_MAX_PATH]; @@ -423,15 +402,15 @@ static int LMAILProcessList(LMAILConfig *pLMAILCfg, long lThreadId, char const * } SvrReleaseConfigHandle(hSvrConfig); - FILE *pSSFile; - char szSpoolFileName[SYS_MAX_PATH]; + SysListHead *pPos; - if ((pSSFile = fopen(pszSSFileName, "rb")) == NULL) - return ErrGetErrorCode(); - while (MscGetString(pSSFile, szSpoolFileName, sizeof(szSpoolFileName) - 1) != NULL) { + for (pPos = SYS_LIST_FIRST(pHead); pPos != NULL; + pPos = SYS_LIST_NEXT(pPos, pHead)) { + LstDatum *pLDm = SYS_LIST_ENTRY(pPos, LstDatum, LLnk); char szSpoolFilePath[SYS_MAX_PATH]; - sprintf(szSpoolFilePath, "%s%s%s", szSpoolDir, SYS_SLASH_STR, szSpoolFileName); + sprintf(szSpoolFilePath, "%s%s%s", szSpoolDir, SYS_SLASH_STR, + pLDm->Data.pData); if (LMAILSubmitLocalFile(pLMAILCfg, szSpoolFilePath, lThreadId, szSMTPDomain) < 0) { SysLogMessage(LOG_LEV_ERROR, "LMAIL [%02ld] error (\"%s\"): %s\n", @@ -442,34 +421,36 @@ static int LMAILProcessList(LMAILConfig *pLMAILCfg, long lThreadId, char const * lThreadId, szSpoolFilePath); } } - fclose(pSSFile); return 0; } static int LMAILProcessLocalSpool(SHB_HANDLE hShbLMAIL, long lThreadId) { + int iFileCount; LMAILConfig *pLMAILCfg; - char szSSFileName[SYS_MAX_PATH]; + SysListHead SnapList; if ((pLMAILCfg = LMAILGetConfigCopy(hShbLMAIL)) == NULL) return ErrGetErrorCode(); - if (LMAILGetFilesSnapShot(pLMAILCfg, lThreadId, szSSFileName, - sizeof(szSSFileName)) < 0) { - ErrorPush(); - SysFree(pLMAILCfg); - return ErrorPop(); - } - if (LMAILProcessList(pLMAILCfg, lThreadId, szSSFileName) < 0) { + if ((iFileCount = LMAILGetFilesSnapShot(pLMAILCfg, lThreadId, + &SnapList)) < 0) { ErrorPush(); - SysRemove(szSSFileName); SysFree(pLMAILCfg); return ErrorPop(); } + if (iFileCount > 0) { + if (LMAILProcessList(pLMAILCfg, lThreadId, &SnapList) < 0) { + ErrorPush(); + MscFreeDatumList(&SnapList); + SysFree(pLMAILCfg); + return ErrorPop(); + } - LMAILRemoveProcessed(pLMAILCfg, szSSFileName); + LMAILRemoveProcessed(pLMAILCfg, &SnapList); - SysRemove(szSSFileName); + MscFreeDatumList(&SnapList); + } SysFree(pLMAILCfg); return 0; _______________________________________________ xmail mailing list xmail@xmailserver.org http://xmailserver.org/mailman/listinfo/xmail