Re: [PATCH] LMAIL: preventing of excessive hdd access

Davide Libenzi <[email protected]>
Newsgroups gmane.mail.xmail.general
Message-ID <[email protected]>
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
[email protected]
http://xmailserver.org/mailman/listinfo/xmail
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.