Browse code

c4w: fix leaked handles in INITIAL, uify object vs objectid logic

aCaB authored on 2011/02/03 19:32:08
Showing 1 changed files
... ...
@@ -903,7 +903,8 @@ int CLAMAPI Scan_ScanObjectByHandle(CClamAVScanner *pScanner, HANDLE object, int
903 903
 	    si.pThreatName = NULL;
904 904
 	logg("*in final_cb with clamav context %p, instance %p, fd %d, result %d, virusname %S)\n", &sctx, inst, fd, res, si.pThreatName);
905 905
 	si.pThreatType = threat_type(virname);
906
-	si.object = duphdl;
906
+	si.object = INVALID_HANDLE_VALUE;
907
+	si.objectId = INVALID_HANDLE_VALUE;
907 908
 	si.pInnerObjectPath = NULL;
908 909
 	lo = SetFilePointer(duphdl, 0, &hi, FILE_CURRENT);
909 910
 	SetFilePointer(duphdl, 0, &hi2, FILE_BEGIN);
... ...
@@ -941,6 +942,8 @@ int CLAMAPI Scan_ScanObjectByHandle(CClamAVScanner *pScanner, HANDLE object, int
941 941
 	    scaninfo->scanPhase = SCAN_PHASE_FINAL;
942 942
 	    scaninfo->errorCode = CLAMAPI_SUCCESS;
943 943
 	    scaninfo->pThreatType = threat_type(virname);
944
+	    scaninfo->object = INVALID_HANDLE_VALUE;
945
+	    scaninfo->objectId = INVALID_HANDLE_VALUE;
944 946
 	    wvirname = (wchar_t *)(scaninfo + 1);
945 947
 	    scaninfo->pThreatName = wvirname;
946 948
 	    memcpy(wvirname, L"Clam.", 10);
... ...
@@ -990,8 +993,6 @@ cl_error_t prescan_cb(int fd, void *context) {
990 990
     CLAM_ACTION act;
991 991
     HANDLE fdhdl;
992 992
     DWORD perf;
993
-    long fpos;
994
-    int rsz;
995 993
 
996 994
     if(!context) {
997 995
 	logg("!prescan_cb called with NULL clamav context\n");
... ...
@@ -1007,46 +1008,53 @@ cl_error_t prescan_cb(int fd, void *context) {
1007 1007
     si.pThreatName = NULL;
1008 1008
     si.pInnerObjectPath = NULL;
1009 1009
 
1010
-    while(1) {
1011
-	static int tmpn;
1012
-	snprintf(tmpf, sizeof(tmpf), "%s\\%08x.tmp", tmpdir, ++tmpn);
1013
-	tmpf[sizeof(tmpf)-1] = '\0';
1014
-	fdhdl = CreateFile(tmpf, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL);
1015
-	if(fdhdl != INVALID_HANDLE_VALUE) {
1016
-	    logg("*prescan_cb: dumping content to tempfile %s (handle %p)\n", tmpf, fdhdl);
1017
-	    break;
1018
-	}
1019
-	if((perf = GetLastError()) != ERROR_FILE_EXISTS) {
1020
-	    logg("!prescan_cb: failed to create tempfile %s - error %u\n", tmpf, perf);
1021
-	    return CL_CLEAN;
1010
+    if(si.scanPhase == SCAN_PHASE_PRESCAN) {
1011
+	long fpos;
1012
+	int rsz;
1013
+	while(1) {
1014
+	    static int tmpn;
1015
+	    snprintf(tmpf, sizeof(tmpf), "%s\\%08x.tmp", tmpdir, ++tmpn);
1016
+	    tmpf[sizeof(tmpf)-1] = '\0';
1017
+	    fdhdl = CreateFile(tmpf, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL);
1018
+	    if(fdhdl != INVALID_HANDLE_VALUE) {
1019
+		logg("*prescan_cb: dumping content to tempfile %s (handle %p)\n", tmpf, fdhdl);
1020
+		break;
1021
+	    }
1022
+	    if((perf = GetLastError()) != ERROR_FILE_EXISTS) {
1023
+		logg("!prescan_cb: failed to create tempfile %s - error %u\n", tmpf, perf);
1024
+		return CL_CLEAN;
1025
+	    }
1022 1026
 	}
1023
-    }
1024 1027
 
1025
-    fpos = lseek(fd, 0, SEEK_CUR);
1026
-    lseek(fd, 0, SEEK_SET);
1027
-    while((rsz = read(fd, tmpf, sizeof(tmpf))) > 0) {
1028
-	int wsz = 0;
1029
-	while(wsz != rsz) {
1030
-	    DWORD rwsz;
1031
-	    if(!WriteFile(fdhdl, &tmpf[wsz], rsz - wsz, &rwsz, NULL)) {
1032
-		logg("!prescan_cb: failed to write to tempfile %s - error %u\n", GetLastError());
1033
-		lseek(fd, fpos, SEEK_SET);
1034
-		CloseHandle(fdhdl);
1035
-		return CL_CLEAN;
1028
+	fpos = lseek(fd, 0, SEEK_CUR);
1029
+	lseek(fd, 0, SEEK_SET);
1030
+	while((rsz = read(fd, tmpf, sizeof(tmpf))) > 0) {
1031
+	    int wsz = 0;
1032
+	    while(wsz != rsz) {
1033
+		DWORD rwsz;
1034
+		if(!WriteFile(fdhdl, &tmpf[wsz], rsz - wsz, &rwsz, NULL)) {
1035
+		    logg("!prescan_cb: failed to write to tempfile %s - error %u\n", GetLastError());
1036
+		    lseek(fd, fpos, SEEK_SET);
1037
+		    CloseHandle(fdhdl);
1038
+		    return CL_CLEAN;
1039
+		}
1040
+		wsz += rwsz;
1036 1041
 	    }
1037
-	    wsz += rwsz;
1038 1042
 	}
1039
-    }
1040
-    if(rsz) {
1041
-	logg("!prescan_cb: failed to read from clamav tempfile - errno = %d\n", errno);
1043
+	if(rsz) {
1044
+	    logg("!prescan_cb: failed to read from clamav tempfile - errno = %d\n", errno);
1045
+	    lseek(fd, fpos, SEEK_SET);
1046
+	    CloseHandle(fdhdl);
1047
+	    return CL_CLEAN;
1048
+	}
1042 1049
 	lseek(fd, fpos, SEEK_SET);
1043
-	CloseHandle(fdhdl);
1044
-	return CL_CLEAN;
1050
+	SetFilePointer(fdhdl, 0, NULL, FILE_BEGIN);
1051
+	si.object = fdhdl;
1052
+	si.objectId = (HANDLE)_get_osfhandle(fd);
1053
+    } else { /* SCAN_PHASE_INITIAL */
1054
+	si.object = INVALID_HANDLE_VALUE;
1055
+	si.objectId = INVALID_HANDLE_VALUE;
1045 1056
     }
1046
-    lseek(fd, fpos, SEEK_SET);
1047
-    SetFilePointer(fdhdl, 0, NULL, FILE_BEGIN);
1048
-    si.object = fdhdl;
1049
-    si.objectId = (HANDLE)_get_osfhandle(fd);
1050 1057
     logg("*prescan_cb (clamav context %p, instance %p) invoking callback %p with context %p\n", context, inst, inst->scancb, inst->scancb_ctx);
1051 1058
     perf = GetTickCount();
1052 1059
     inst->scancb(&si, &act, inst->scancb_ctx);