Browse code

improve error handling

git-svn: trunk@2450

Tomasz Kojm authored on 2006/10/29 22:34:49
Showing 2 changed files
... ...
@@ -1,3 +1,7 @@
1
+Sun Oct 29 14:34:01 CET 2006 (tk)
2
+---------------------------------
3
+  * libclamav/unzip.c: improve error handling
4
+
1 5
 Sun Oct 29 00:00:10 CEST 2006 (tk)
2 6
 ----------------------------------
3 7
   * clamd: new directive ScanELF
... ...
@@ -109,7 +109,7 @@ int __zip_find_disk_trailer(int fd, off_t filesize, struct zip_disk_trailer *tra
109 109
 	    return CL_EIO;
110 110
 	}
111 111
 
112
-        if(read(fd, buf, (size_t) bufsize) < (ssize_t) bufsize) {
112
+        if(cli_readn(fd, buf, (size_t) bufsize) < (ssize_t) bufsize) {
113 113
 	    cli_errmsg("Unzip: __zip_find_disk_trailer: Can't read %d bytes\n", bufsize);
114 114
 	    free(buf);
115 115
 	    return CL_EIO;
... ...
@@ -140,7 +140,7 @@ int __zip_find_disk_trailer(int fd, off_t filesize, struct zip_disk_trailer *tra
140 140
 			    return CL_EIO;
141 141
 			}
142 142
 
143
-			if(read(fd, &dirent, sizeof(dirent)) < __sizeof(dirent)) {
143
+			if(cli_readn(fd, &dirent, sizeof(dirent)) < __sizeof(dirent)) {
144 144
 			    cli_errmsg("Unzip: __zip_find_disk_trailer: Can't read %d bytes\n", bufsize);
145 145
 			    free(buf);
146 146
 			    return CL_EIO;
... ...
@@ -202,7 +202,7 @@ int __zip_parse_root_directory(int fd, struct zip_disk_trailer *trailer, zip_dir
202 202
             return CL_EIO;
203 203
 	}
204 204
 
205
-        if(read(fd, &dirent, sizeof(dirent)) < __sizeof(dirent)) {
205
+        if(cli_readn(fd, &dirent, sizeof(dirent)) < __sizeof(dirent)) {
206 206
 	    if(entries != u_entries) {
207 207
 		entries = 0;
208 208
 		break;
... ...
@@ -221,7 +221,13 @@ int __zip_parse_root_directory(int fd, struct zip_disk_trailer *trailer, zip_dir
221 221
 
222 222
         u_extras  = EC16(d->z_extras); 
223 223
         u_comment = EC16(d->z_comment); 
224
+
224 225
         u_namlen  = EC16(d->z_namlen); 
226
+	if(u_namlen > 1024) {
227
+	    cli_dbgmsg("Unzip: __zip_parse_root_directory: Entry %d name too long\n", entries);
228
+	    break;
229
+	}
230
+
225 231
 	u_flags   = EC16(d->z_flags);
226 232
 
227 233
         hdr->d_crc32 = EC32(d->z_crc32);
... ...
@@ -247,7 +253,11 @@ int __zip_parse_root_directory(int fd, struct zip_disk_trailer *trailer, zip_dir
247 247
 	    break;
248 248
 	}
249 249
 
250
-	read(fd, hdr->d_name, u_namlen);
250
+	if(cli_readn(fd, hdr->d_name, u_namlen) != u_namlen) {
251
+	    cli_dbgmsg("Unzip: __zip_parse_root_directory: Can't read name of entry %d\n", entries);
252
+	    break;
253
+	}
254
+
251 255
         hdr->d_name[u_namlen] = '\0'; 
252 256
         hdr->d_namlen = u_namlen;
253 257
 
... ...
@@ -513,7 +523,7 @@ zip_file *zip_file_open(zip_dir *dir, const char *name, int d_off)
513 513
 	    }
514 514
 
515 515
 	    hp = (void *) fp->buf32k;
516
-	    dataoff = read(dir->fd, (void *) hp, sizeof(struct zip_file_header));
516
+	    dataoff = cli_readn(dir->fd, (void *) hp, sizeof(struct zip_file_header));
517 517
 
518 518
 	    if(dataoff < __sizeof(struct zip_file_header)) {
519 519
 		cli_errmsg("Unzip: zip_file_open: Can't read zip header (only read %d bytes)\n", dataoff);
... ...
@@ -578,7 +588,7 @@ ssize_t zip_file_read(zip_file *fp, char *buf, size_t len)
578 578
     switch(fp->method) {
579 579
 
580 580
 	case ZIP_METHOD_STORED:
581
-	    bread = read(dir->fd, buf, l);
581
+	    bread = cli_readn(dir->fd, buf, l);
582 582
 	    if(bread > 0) {
583 583
 		fp->restlen -= bread;
584 584
 	    } else if(bread < 0) {
... ...
@@ -596,7 +606,7 @@ ssize_t zip_file_read(zip_file *fp, char *buf, size_t len)
596 596
 
597 597
 		if(fp->crestlen > 0 && fp->d_stream.avail_in == 0) {
598 598
 		    size_t cl = (fp->crestlen < ZIP32K ? fp->crestlen : ZIP32K);
599
-		    ssize_t i = read(dir->fd, fp->buf32k, cl);
599
+		    ssize_t i = cli_readn(dir->fd, fp->buf32k, cl);
600 600
 		    if(i <= 0) {
601 601
 			dir->errcode = CL_EIO;
602 602
 			cli_errmsg("Unzip: zip_file_read: Can't read %d bytes (read %d)\n", cl, i);