Index: compress.1 --- compress.1.orig 1992-08-31 16:46:53 +0200 +++ compress.1 2006-08-12 14:09:31 +0200 @@ -1,7 +1,7 @@ .PU .TH COMPRESS 1 local .SH NAME -compress, uncompress, zcat \- compress and expand data (version 4.1) +compress, uncompress \- compress and expand data (version 4.2) .SH SYNOPSIS .ll +8 .B compress @@ -36,12 +36,6 @@ .I "name \&..." ] .br -.B zcat -[ -.B \-V -] [ -.I "name \&..." -] .SH DESCRIPTION .I Compress reduces the size of the named files using adaptive Lempel-Ziv coding. @@ -68,9 +62,7 @@ the user is prompted as to whether an existing file should be overwritten. .PP Compressed files can be restored to their original form using -.I uncompress -or -.I zcat. +.I uncompress. .PP .I uncompress takes a list of files on its command line and replaces each @@ -88,19 +80,6 @@ .I compress/uncompress write to the standard output; no files are changed. .PP -.I zcat -is identical to -.I uncompress -.B \-c. -.I zcat -uncompresses either a list of files on the command line or its -standard input and writes the uncompressed data on standard output. -.I zcat -will uncompress files that have the correct magic number whether -they have a -.B "\&.Z" -suffix or not. -.PP If the .B \-r flag is specified, @@ -175,13 +154,13 @@ option, a message is printed yielding the percentage of reduction for each file compressed. -.PP -Exit status is normally 0; -if the last file is larger after (attempted) compression, the status is 2; -if an error occurs, exit status is 1. .SH "SEE ALSO" pack(1), compact(1) .SH "DIAGNOSTICS" +Exit status is normally 0; +if the last file is larger after (attempted) compression, the status is 2; +if an error occurs, exit status is 1. +.PP Usage: compress [\-dfvcVr] [\-b maxbits] [file ...] .in +8 Invalid options were specified on the command line. @@ -272,13 +251,14 @@ a small process data space (64KB or less, as exhibited by the DEC PDP series, the Intel 80286, etc.) .PP -Invoking compress with a \-r +Invoking compress with a +.BR \-r flag will occasionally cause it to produce spurious error warnings of the form .PP .in 8 ".Z already has .Z suffix - ignored" .in -8 .PP -These warnings can be ignored. See the comments in compress.c:compdir() -for an explanation. +These warnings can be ignored. See the comments in compress42.c:compdir() +in the source distribution for an explanation. Index: compress42.c --- compress42.c.orig 1992-10-28 12:10:53 +0100 +++ compress42.c 2006-08-12 14:10:40 +0200 @@ -131,6 +131,8 @@ * */ #include +#include +#include #include #include #include @@ -230,6 +232,8 @@ #define INIT_BITS 9 /* initial number of bits/code */ +#define MIN_MAXBITS 10 /* min value for -b maxbits (smaller causes corruption) */ + #ifndef SACREDMEM /* * SACREDMEM is the amount of physical memory saved for others; compress @@ -638,13 +642,13 @@ } ; #endif -void main ARGS((int,char **)); +int main ARGS((int,char **)); void Usage ARGS((void)); void comprexx ARGS((char **)); void compdir ARGS((char *)); void compress ARGS((int,int)); void decompress ARGS((int,int)); -char *rindex ARGS((char *,int)); +char *my_rindex ARGS((char *,int)); void read_error ARGS((void)); void write_error ARGS((void)); void abort_compress ARGS((void)); @@ -691,7 +695,7 @@ * deterministic, and can be done on the fly. Thus, the decompression * procedure needs no input table, but tracks the way the table was built. */ -void +int main(argc, argv) REG1 int argc; REG2 char *argv[]; @@ -714,7 +718,7 @@ filelist = fileptr = (char **)malloc(argc*sizeof(char *)); *filelist = NULL; - if((progname = rindex(argv[0], '/')) != 0) + if((progname = my_rindex(argv[0], '/')) != 0) progname++; else progname = argv[0]; @@ -819,7 +823,7 @@ nextarg: continue; } - if (maxbits < INIT_BITS) maxbits = INIT_BITS; + if (maxbits < MIN_MAXBITS) maxbits = MIN_MAXBITS; if (maxbits > BITS) maxbits = BITS; if (*filelist != NULL) @@ -883,6 +887,10 @@ int fdout; char tempname[MAXPATHLEN]; + if (strlen(*fileptr) > (MAXPATHLEN - 1)) { + fprintf(stderr, "Pathname too long: %s\n", *fileptr); + return; + } strcpy(tempname,*fileptr); errno = 0; @@ -1737,7 +1745,7 @@ code = oldcode; } - while ((cmp_code_int)code >= (cmp_code_int)256) + while ((cmp_code_int)code >= (cmp_code_int)256 && stackp > (char_type *)&htabof(0) /* CVE-2006-1168 */) { /* Generate output characters in reverse order */ *--stackp = tab_suffixof(code); code = tab_prefixof(code); @@ -1799,7 +1807,7 @@ } char * -rindex(s, c) /* For those who don't have it in libc.a */ +my_rindex(s, c) /* For those who don't have it in libc.a */ REG1 char *s; REG2 int c; {