Browse code

c4w: error path handlers in prescan_cb

aCaB authored on 2011/02/03 10:33:10
Showing 1 changed files
... ...
@@ -1012,24 +1012,36 @@ cl_error_t prescan_cb(int fd, void *context) {
1012 1012
 	snprintf(tmpf, sizeof(tmpf), "%s\\%08x.tmp", tmpdir, ++tmpn);
1013 1013
 	tmpf[sizeof(tmpf)-1] = '\0';
1014 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) break;
1016
-	/* FIXME: handle non dup filename errors */
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;
1022
+	}
1017 1023
     }
1018 1024
 
1019 1025
     fpos = lseek(fd, 0, SEEK_CUR);
1020 1026
     lseek(fd, 0, SEEK_SET);
1021 1027
     while((rsz = read(fd, tmpf, sizeof(tmpf))) > 0) {
1022
-	    int wsz = 0;
1023
-	    while(wsz != rsz) {
1024
-		DWORD rwsz;
1025
-		if(!WriteFile(fdhdl, &tmpf[wsz], rsz - wsz, &rwsz, NULL)) {
1026
-		    /* FIXME: handle write fail here */
1027
-		}
1028
-		wsz += rwsz;
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;
1029 1036
 	    }
1037
+	    wsz += rwsz;
1038
+	}
1030 1039
     }
1031 1040
     if(rsz) {
1032
-	/* FIXME: handle read fail here */
1041
+	logg("!prescan_cb: failed to read from clamav tempfile - errno = %d\n", errno);
1042
+	lseek(fd, fpos, SEEK_SET);
1043
+	CloseHandle(fdhdl);
1044
+	return CL_CLEAN;
1033 1045
     }
1034 1046
     lseek(fd, fpos, SEEK_SET);
1035 1047
     SetFilePointer(fdhdl, 0, NULL, FILE_BEGIN);