git-svn: trunk@2450
Tomasz Kojm authored on 2006/10/29 22:34:49... | ... |
@@ -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); |