diff --git a/clamav-devel/ChangeLog b/clamav-devel/ChangeLog index 736a7e828..82b58f799 100644 --- a/clamav-devel/ChangeLog +++ b/clamav-devel/ChangeLog @@ -1,3 +1,8 @@ +Sun Oct 29 16:33:01 CET 2006 (tk) +--------------------------------- + * shared/cdiff.c: make cdiff_apply() compatible with old zlib versions + (closes bug#76), patch from Ian Abbott + Sun Oct 29 16:10:08 CET 2006 (tk) --------------------------------- * clamd/others.c: fix compilation error under w32 (closes bug#68) diff --git a/clamav-devel/shared/cdiff.c b/clamav-devel/shared/cdiff.c index 394008e68..588c895bc 100644 --- a/clamav-devel/shared/cdiff.c +++ b/clamav-devel/shared/cdiff.c @@ -766,7 +766,8 @@ int cdiff_apply(int fd, unsigned short mode) gzFile *gzh; char line[1024], buff[FILEBUFF], *dsig = NULL; unsigned int lines = 0, cmds = 0; - int end, i; + unsigned int difflen, diffremain; + int end, i, n; struct stat sb; int desc; #ifdef HAVE_GMP @@ -859,12 +860,15 @@ int cdiff_apply(int fd, unsigned short mode) } i = 0; - while(read(desc, buff, 1) > 0) - if(buff[0] == ':') + n = 0; + while(n < FILEBUFF - 1 && read(desc, &buff[n], 1) > 0) { + if(buff[n++] == ':') if(++i == 3) break; + } + buff[n] = 0; - if(i != 3) { + if(sscanf(buff, "ClamAV-Diff:%*u:%u:", &difflen) != 1) { logg("!cdiff_apply: Incorrect file format\n"); close(desc); return -1; @@ -876,7 +880,17 @@ int cdiff_apply(int fd, unsigned short mode) return -1; } - while(gzgets(gzh, line, sizeof(line))) { + diffremain = difflen; + while(diffremain) { + unsigned int bufsize = diffremain < sizeof(line) ? diffremain + 1 : sizeof(line); + + if(!gzgets(gzh, line, bufsize)) { + logg("!cdiff_apply: Premature EOF at line %d\n", lines + 1); + cdiff_ctx_free(&ctx); + gzclose(gzh); + return -1; + } + diffremain -= strlen(line); lines++; cli_chomp(line);