doc/share/security/patches/SA-02:25/bzip2.patch
Bjoern A. Zeeb 3571e53040 Import FreeBSD Security Advisories and Errata Notices, as well as their
patches for easier mirroring, to eliminate a special copy, to make
www.freebsd.org/security a full copy of security.freebsd.org and be
eventually be the same.

For now files are just sitting there.   The symlinks are missing.

Discussed on:	www (repository location)
Discussed with:	simon (so)
2012-08-15 06:19:40 +00:00

1180 lines
37 KiB
Diff

Index: contrib/bzip2/blocksort.c
===================================================================
RCS file: /home/ncvs/src/contrib/bzip2/blocksort.c,v
retrieving revision 1.1.1.1.2.1
diff -u -r1.1.1.1.2.1 blocksort.c
--- contrib/bzip2/blocksort.c 1 Aug 2001 00:13:31 -0000 1.1.1.1.2.1
+++ contrib/bzip2/blocksort.c 22 Feb 2002 13:34:04 -0000
@@ -8,7 +8,7 @@
This file is a part of bzip2 and/or libbzip2, a program and
library for lossless, block-sorting data compression.
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -981,7 +981,14 @@
}
}
- AssertH ( copyStart[ss]-1 == copyEnd[ss], 1007 );
+ AssertH ( (copyStart[ss]-1 == copyEnd[ss])
+ ||
+ /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1.
+ Necessity for this case is demonstrated by compressing
+ a sequence of approximately 48.5 million of character
+ 251; 1.0.0/1.0.1 will then die here. */
+ (copyStart[ss] == 0 && copyEnd[ss] == nblock-1),
+ 1007 )
for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK;
Index: contrib/bzip2/bzip2.c
===================================================================
RCS file: /home/ncvs/src/contrib/bzip2/bzip2.c,v
retrieving revision 1.1.1.1.2.1
diff -u -r1.1.1.1.2.1 bzip2.c
--- contrib/bzip2/bzip2.c 1 Aug 2001 00:13:31 -0000 1.1.1.1.2.1
+++ contrib/bzip2/bzip2.c 22 Feb 2002 13:34:04 -0000
@@ -7,7 +7,7 @@
This file is a part of bzip2 and/or libbzip2, a program and
library for lossless, block-sorting data compression.
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -113,13 +113,16 @@
/*--
Generic 32-bit Unix.
Also works on 64-bit Unix boxes.
+ This is the default.
--*/
#define BZ_UNIX 1
/*--
Win32, as seen by Jacob Navia's excellent
port of (Chris Fraser & David Hanson)'s excellent
- lcc compiler.
+ lcc compiler. Or with MS Visual C.
+ This is selected automatically if compiled by a compiler which
+ defines _WIN32, not including the Cygwin GCC.
--*/
#define BZ_LCCWIN32 0
@@ -156,6 +159,7 @@
--*/
#if BZ_UNIX
+# include <fcntl.h>
# include <sys/types.h>
# include <utime.h>
# include <unistd.h>
@@ -164,8 +168,9 @@
# define PATH_SEP '/'
# define MY_LSTAT lstat
-# define MY_S_IFREG S_ISREG
# define MY_STAT stat
+# define MY_S_ISREG S_ISREG
+# define MY_S_ISDIR S_ISDIR
# define APPEND_FILESPEC(root, name) \
root=snocString((root), (name))
@@ -180,19 +185,23 @@
# else
# define NORETURN /**/
# endif
+
# ifdef __DJGPP__
# include <io.h>
# include <fcntl.h>
# undef MY_LSTAT
+# undef MY_STAT
# define MY_LSTAT stat
+# define MY_STAT stat
# undef SET_BINARY_MODE
# define SET_BINARY_MODE(fd) \
do { \
int retVal = setmode ( fileno ( fd ), \
- O_BINARY ); \
+ O_BINARY ); \
ERROR_IF_MINUS_ONE ( retVal ); \
} while ( 0 )
# endif
+
# ifdef __CYGWIN__
# include <io.h>
# include <fcntl.h>
@@ -200,11 +209,11 @@
# define SET_BINARY_MODE(fd) \
do { \
int retVal = setmode ( fileno ( fd ), \
- O_BINARY ); \
+ O_BINARY ); \
ERROR_IF_MINUS_ONE ( retVal ); \
} while ( 0 )
# endif
-#endif
+#endif /* BZ_UNIX */
@@ -217,46 +226,23 @@
# define PATH_SEP '\\'
# define MY_LSTAT _stat
# define MY_STAT _stat
-# define MY_S_IFREG(x) ((x) & _S_IFREG)
+# define MY_S_ISREG(x) ((x) & _S_IFREG)
+# define MY_S_ISDIR(x) ((x) & _S_IFDIR)
# define APPEND_FLAG(root, name) \
root=snocString((root), (name))
-# if 0
- /*-- lcc-win32 seems to expand wildcards itself --*/
-# define APPEND_FILESPEC(root, spec) \
- do { \
- if ((spec)[0] == '-') { \
- root = snocString((root), (spec)); \
- } else { \
- struct _finddata_t c_file; \
- long hFile; \
- hFile = _findfirst((spec), &c_file); \
- if ( hFile == -1L ) { \
- root = snocString ((root), (spec)); \
- } else { \
- int anInt = 0; \
- while ( anInt == 0 ) { \
- root = snocString((root), \
- &c_file.name[0]); \
- anInt = _findnext(hFile, &c_file); \
- } \
- } \
- } \
- } while ( 0 )
-# else
# define APPEND_FILESPEC(root, name) \
root = snocString ((root), (name))
-# endif
# define SET_BINARY_MODE(fd) \
do { \
int retVal = setmode ( fileno ( fd ), \
- O_BINARY ); \
+ O_BINARY ); \
ERROR_IF_MINUS_ONE ( retVal ); \
} while ( 0 )
-#endif
+#endif /* BZ_LCCWIN32 */
/*---------------------------------------------*/
@@ -338,6 +324,7 @@
struct { UChar b[8]; }
UInt64;
+
static
void uInt64_from_UInt32s ( UInt64* n, UInt32 lo32, UInt32 hi32 )
{
@@ -351,6 +338,7 @@
n->b[0] = (UChar) (lo32 & 0xFF);
}
+
static
double uInt64_to_double ( UInt64* n )
{
@@ -364,77 +352,6 @@
return sum;
}
-static
-void uInt64_add ( UInt64* src, UInt64* dst )
-{
- Int32 i;
- Int32 carry = 0;
- for (i = 0; i < 8; i++) {
- carry += ( ((Int32)src->b[i]) + ((Int32)dst->b[i]) );
- dst->b[i] = (UChar)(carry & 0xFF);
- carry >>= 8;
- }
-}
-
-static
-void uInt64_sub ( UInt64* src, UInt64* dst )
-{
- Int32 t, i;
- Int32 borrow = 0;
- for (i = 0; i < 8; i++) {
- t = ((Int32)dst->b[i]) - ((Int32)src->b[i]) - borrow;
- if (t < 0) {
- dst->b[i] = (UChar)(t + 256);
- borrow = 1;
- } else {
- dst->b[i] = (UChar)t;
- borrow = 0;
- }
- }
-}
-
-static
-void uInt64_mul ( UInt64* a, UInt64* b, UInt64* r_hi, UInt64* r_lo )
-{
- UChar sum[16];
- Int32 ia, ib, carry;
- for (ia = 0; ia < 16; ia++) sum[ia] = 0;
- for (ia = 0; ia < 8; ia++) {
- carry = 0;
- for (ib = 0; ib < 8; ib++) {
- carry += ( ((Int32)sum[ia+ib])
- + ((Int32)a->b[ia]) * ((Int32)b->b[ib]) );
- sum[ia+ib] = (UChar)(carry & 0xFF);
- carry >>= 8;
- }
- sum[ia+8] = (UChar)(carry & 0xFF);
- if ((carry >>= 8) != 0) panic ( "uInt64_mul" );
- }
-
- for (ia = 0; ia < 8; ia++) r_hi->b[ia] = sum[ia+8];
- for (ia = 0; ia < 8; ia++) r_lo->b[ia] = sum[ia];
-}
-
-
-static
-void uInt64_shr1 ( UInt64* n )
-{
- Int32 i;
- for (i = 0; i < 8; i++) {
- n->b[i] >>= 1;
- if (i < 7 && (n->b[i+1] & 1)) n->b[i] |= 0x80;
- }
-}
-
-static
-void uInt64_shl1 ( UInt64* n )
-{
- Int32 i;
- for (i = 7; i >= 0; i--) {
- n->b[i] <<= 1;
- if (i > 0 && (n->b[i-1] & 0x80)) n->b[i]++;
- }
-}
static
Bool uInt64_isZero ( UInt64* n )
@@ -445,49 +362,23 @@
return 1;
}
-static
+
+/* Divide *n by 10, and return the remainder. */
+static
Int32 uInt64_qrm10 ( UInt64* n )
{
- /* Divide *n by 10, and return the remainder. Long division
- is difficult, so we cheat and instead multiply by
- 0xCCCC CCCC CCCC CCCD, which is 0.8 (viz, 0.1 << 3).
- */
+ UInt32 rem, tmp;
Int32 i;
- UInt64 tmp1, tmp2, n_orig, zero_point_eight;
-
- zero_point_eight.b[1] = zero_point_eight.b[2] =
- zero_point_eight.b[3] = zero_point_eight.b[4] =
- zero_point_eight.b[5] = zero_point_eight.b[6] =
- zero_point_eight.b[7] = 0xCC;
- zero_point_eight.b[0] = 0xCD;
-
- n_orig = *n;
-
- /* divide n by 10,
- by multiplying by 0.8 and then shifting right 3 times */
- uInt64_mul ( n, &zero_point_eight, &tmp1, &tmp2 );
- uInt64_shr1(&tmp1); uInt64_shr1(&tmp1); uInt64_shr1(&tmp1);
- *n = tmp1;
-
- /* tmp1 = 8*n, tmp2 = 2*n */
- uInt64_shl1(&tmp1); uInt64_shl1(&tmp1); uInt64_shl1(&tmp1);
- tmp2 = *n; uInt64_shl1(&tmp2);
-
- /* tmp1 = 10*n */
- uInt64_add ( &tmp2, &tmp1 );
-
- /* n_orig = n_orig - 10*n */
- uInt64_sub ( &tmp1, &n_orig );
-
- /* n_orig should now hold quotient, in range 0 .. 9 */
- for (i = 7; i >= 1; i--)
- if (n_orig.b[i] != 0) panic ( "uInt64_qrm10(1)" );
- if (n_orig.b[0] > 9)
- panic ( "uInt64_qrm10(2)" );
-
- return (int)n_orig.b[0];
+ rem = 0;
+ for (i = 7; i >= 0; i--) {
+ tmp = rem * 256 + n->b[i];
+ n->b[i] = tmp / 10;
+ rem = tmp % 10;
+ }
+ return rem;
}
+
/* ... and the Whole Entire Point of all this UInt64 stuff is
so that we can supply the following function.
*/
@@ -504,7 +395,8 @@
nBuf++;
} while (!uInt64_isZero(&n_copy));
outbuf[nBuf] = 0;
- for (i = 0; i < nBuf; i++) outbuf[i] = buf[nBuf-i-1];
+ for (i = 0; i < nBuf; i++)
+ outbuf[i] = buf[nBuf-i-1];
}
@@ -566,35 +458,38 @@
if (ret == EOF) goto errhandler_io;
if (zStream != stdout) {
ret = fclose ( zStream );
+ outputHandleJustInCase = NULL;
if (ret == EOF) goto errhandler_io;
}
+ outputHandleJustInCase = NULL;
if (ferror(stream)) goto errhandler_io;
ret = fclose ( stream );
if (ret == EOF) goto errhandler_io;
- if (nbytes_in_lo32 == 0 && nbytes_in_hi32 == 0)
- nbytes_in_lo32 = 1;
-
if (verbosity >= 1) {
- Char buf_nin[32], buf_nout[32];
- UInt64 nbytes_in, nbytes_out;
- double nbytes_in_d, nbytes_out_d;
- uInt64_from_UInt32s ( &nbytes_in,
- nbytes_in_lo32, nbytes_in_hi32 );
- uInt64_from_UInt32s ( &nbytes_out,
- nbytes_out_lo32, nbytes_out_hi32 );
- nbytes_in_d = uInt64_to_double ( &nbytes_in );
- nbytes_out_d = uInt64_to_double ( &nbytes_out );
- uInt64_toAscii ( buf_nin, &nbytes_in );
- uInt64_toAscii ( buf_nout, &nbytes_out );
- fprintf ( stderr, "%6.3f:1, %6.3f bits/byte, "
- "%5.2f%% saved, %s in, %s out.\n",
- nbytes_in_d / nbytes_out_d,
- (8.0 * nbytes_out_d) / nbytes_in_d,
- 100.0 * (1.0 - nbytes_out_d / nbytes_in_d),
- buf_nin,
- buf_nout
- );
+ if (nbytes_in_lo32 == 0 && nbytes_in_hi32 == 0) {
+ fprintf ( stderr, " no data compressed.\n");
+ } else {
+ Char buf_nin[32], buf_nout[32];
+ UInt64 nbytes_in, nbytes_out;
+ double nbytes_in_d, nbytes_out_d;
+ uInt64_from_UInt32s ( &nbytes_in,
+ nbytes_in_lo32, nbytes_in_hi32 );
+ uInt64_from_UInt32s ( &nbytes_out,
+ nbytes_out_lo32, nbytes_out_hi32 );
+ nbytes_in_d = uInt64_to_double ( &nbytes_in );
+ nbytes_out_d = uInt64_to_double ( &nbytes_out );
+ uInt64_toAscii ( buf_nin, &nbytes_in );
+ uInt64_toAscii ( buf_nout, &nbytes_out );
+ fprintf ( stderr, "%6.3f:1, %6.3f bits/byte, "
+ "%5.2f%% saved, %s in, %s out.\n",
+ nbytes_in_d / nbytes_out_d,
+ (8.0 * nbytes_out_d) / nbytes_in_d,
+ 100.0 * (1.0 - nbytes_out_d / nbytes_in_d),
+ buf_nin,
+ buf_nout
+ );
+ }
}
return;
@@ -652,7 +547,7 @@
while (bzerr == BZ_OK) {
nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
- if (bzerr == BZ_DATA_ERROR_MAGIC) goto errhandler;
+ if (bzerr == BZ_DATA_ERROR_MAGIC) goto trycat;
if ((bzerr == BZ_OK || bzerr == BZ_STREAM_END) && nread > 0)
fwrite ( obuf, sizeof(UChar), nread, stream );
if (ferror(stream)) goto errhandler_io;
@@ -668,9 +563,9 @@
if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
if (nUnused == 0 && myfeof(zStream)) break;
-
}
+ closeok:
if (ferror(zStream)) goto errhandler_io;
ret = fclose ( zStream );
if (ret == EOF) goto errhandler_io;
@@ -680,11 +575,26 @@
if (ret != 0) goto errhandler_io;
if (stream != stdout) {
ret = fclose ( stream );
+ outputHandleJustInCase = NULL;
if (ret == EOF) goto errhandler_io;
}
+ outputHandleJustInCase = NULL;
if (verbosity >= 2) fprintf ( stderr, "\n " );
return True;
+ trycat:
+ if (forceOverwrite) {
+ rewind(zStream);
+ while (True) {
+ if (myfeof(zStream)) break;
+ nread = fread ( obuf, sizeof(UChar), 5000, zStream );
+ if (ferror(zStream)) goto errhandler_io;
+ if (nread > 0) fwrite ( obuf, sizeof(UChar), nread, stream );
+ if (ferror(stream)) goto errhandler_io;
+ }
+ goto closeok;
+ }
+
errhandler:
BZ2_bzReadClose ( &bzerr_dummy, bzf );
switch (bzerr) {
@@ -832,7 +742,7 @@
stderr,
"\nIt is possible that the compressed file(s) have become corrupted.\n"
"You can use the -tvv option to test integrity of such files.\n\n"
- "You can use the `bzip2recover' program to *attempt* to recover\n"
+ "You can use the `bzip2recover' program to attempt to recover\n"
"data from undamaged sections of corrupted files.\n\n"
);
}
@@ -855,28 +765,55 @@
static
void cleanUpAndFail ( Int32 ec )
{
- IntNative retVal;
+ IntNative retVal;
+ struct MY_STAT statBuf;
if ( srcMode == SM_F2F
&& opMode != OM_TEST
&& deleteOutputOnInterrupt ) {
- if (noisy)
- fprintf ( stderr, "%s: Deleting output file %s, if it exists.\n",
- progName, outName );
- if (outputHandleJustInCase != NULL)
- fclose ( outputHandleJustInCase );
- retVal = remove ( outName );
- if (retVal != 0)
+
+ /* Check whether input file still exists. Delete output file
+ only if input exists to avoid loss of data. Joerg Prante, 5
+ January 2002. (JRS 06-Jan-2002: other changes in 1.0.2 mean
+ this is less likely to happen. But to be ultra-paranoid, we
+ do the check anyway.) */
+ retVal = MY_STAT ( inName, &statBuf );
+ if (retVal == 0) {
+ if (noisy)
+ fprintf ( stderr,
+ "%s: Deleting output file %s, if it exists.\n",
+ progName, outName );
+ if (outputHandleJustInCase != NULL)
+ fclose ( outputHandleJustInCase );
+ retVal = remove ( outName );
+ if (retVal != 0)
+ fprintf ( stderr,
+ "%s: WARNING: deletion of output file "
+ "(apparently) failed.\n",
+ progName );
+ } else {
+ fprintf ( stderr,
+ "%s: WARNING: deletion of output file suppressed\n",
+ progName );
fprintf ( stderr,
- "%s: WARNING: deletion of output file (apparently) failed.\n",
+ "%s: since input file no longer exists. Output file\n",
+ progName );
+ fprintf ( stderr,
+ "%s: `%s' may be incomplete.\n",
+ progName, outName );
+ fprintf ( stderr,
+ "%s: I suggest doing an integrity test (bzip2 -tv)"
+ " of it.\n",
progName );
+ }
}
+
if (noisy && numFileNames > 0 && numFilesProcessed < numFileNames) {
fprintf ( stderr,
"%s: WARNING: some files have not been processed:\n"
- "\t%d specified on command line, %d not processed yet.\n\n",
- progName, numFileNames,
- numFileNames - numFilesProcessed );
+ "%s: %d specified on command line, %d not processed yet.\n\n",
+ progName, progName,
+ numFileNames, numFileNames - numFilesProcessed );
}
setExit(ec);
exit(exitValue);
@@ -915,14 +852,16 @@
static
void compressedStreamEOF ( void )
{
- fprintf ( stderr,
- "\n%s: Compressed file ends unexpectedly;\n\t"
- "perhaps it is corrupted? *Possible* reason follows.\n",
- progName );
- perror ( progName );
- showFileNames();
- cadvise();
- cleanUpAndFail( 2 );
+ if (noisy) {
+ fprintf ( stderr,
+ "\n%s: Compressed file ends unexpectedly;\n\t"
+ "perhaps it is corrupted? *Possible* reason follows.\n",
+ progName );
+ perror ( progName );
+ showFileNames();
+ cadvise();
+ }
+ cleanUpAndFail( 2 );
}
@@ -1038,6 +977,11 @@
/*--- The main driver machinery ---*/
/*---------------------------------------------------*/
+/* All rather crufty. The main problem is that input files
+ are stat()d multiple times before use. This should be
+ cleaned up.
+*/
+
/*---------------------------------------------*/
static
void pad ( Char *s )
@@ -1082,6 +1026,32 @@
/*---------------------------------------------*/
+/* Open an output file safely with O_EXCL and good permissions.
+ This avoids a race condition in versions < 1.0.2, in which
+ the file was first opened and then had its interim permissions
+ set safely. We instead use open() to create the file with
+ the interim permissions required. (--- --- rw-).
+
+ For non-Unix platforms, if we are not worrying about
+ security issues, simple this simply behaves like fopen.
+*/
+FILE* fopen_output_safely ( Char* name, const char* mode )
+{
+# if BZ_UNIX
+ FILE* fp;
+ IntNative fh;
+ fh = open(name, O_WRONLY|O_CREAT|O_EXCL, S_IWUSR|S_IRUSR);
+ if (fh == -1) return NULL;
+ fp = fdopen(fh, mode);
+ if (fp == NULL) close(fh);
+ return fp;
+# else
+ return fopen(name, mode);
+# endif
+}
+
+
+/*---------------------------------------------*/
/*--
if in doubt, return True
--*/
@@ -1093,7 +1063,7 @@
i = MY_LSTAT ( name, &statBuf );
if (i != 0) return True;
- if (MY_S_IFREG(statBuf.st_mode)) return False;
+ if (MY_S_ISREG(statBuf.st_mode)) return False;
return True;
}
@@ -1115,42 +1085,66 @@
/*---------------------------------------------*/
+/* Copy modification date, access date, permissions and owner from the
+ source to destination file. We have to copy this meta-info off
+ into fileMetaInfo before starting to compress / decompress it,
+ because doing it afterwards means we get the wrong access time.
+
+ To complicate matters, in compress() and decompress() below, the
+ sequence of tests preceding the call to saveInputFileMetaInfo()
+ involves calling fileExists(), which in turn establishes its result
+ by attempting to fopen() the file, and if successful, immediately
+ fclose()ing it again. So we have to assume that the fopen() call
+ does not cause the access time field to be updated.
+
+ Reading of the man page for stat() (man 2 stat) on RedHat 7.2 seems
+ to imply that merely doing open() will not affect the access time.
+ Therefore we merely need to hope that the C library only does
+ open() as a result of fopen(), and not any kind of read()-ahead
+ cleverness.
+
+ It sounds pretty fragile to me. Whether this carries across
+ robustly to arbitrary Unix-like platforms (or even works robustly
+ on this one, RedHat 7.2) is unknown to me. Nevertheless ...
+*/
+#if BZ_UNIX
+static
+struct MY_STAT fileMetaInfo;
+#endif
+
static
-void copyDatePermissionsAndOwner ( Char *srcName, Char *dstName )
+void saveInputFileMetaInfo ( Char *srcName )
{
-#if BZ_UNIX
+# if BZ_UNIX
+ IntNative retVal;
+ /* Note use of stat here, not lstat. */
+ retVal = MY_STAT( srcName, &fileMetaInfo );
+ ERROR_IF_NOT_ZERO ( retVal );
+# endif
+}
+
+
+static
+void applySavedMetaInfoToOutputFile ( Char *dstName )
+{
+# if BZ_UNIX
IntNative retVal;
- struct MY_STAT statBuf;
struct utimbuf uTimBuf;
- retVal = MY_LSTAT ( srcName, &statBuf );
- ERROR_IF_NOT_ZERO ( retVal );
- uTimBuf.actime = statBuf.st_atime;
- uTimBuf.modtime = statBuf.st_mtime;
+ uTimBuf.actime = fileMetaInfo.st_atime;
+ uTimBuf.modtime = fileMetaInfo.st_mtime;
- retVal = chmod ( dstName, statBuf.st_mode );
+ retVal = chmod ( dstName, fileMetaInfo.st_mode );
ERROR_IF_NOT_ZERO ( retVal );
retVal = utime ( dstName, &uTimBuf );
ERROR_IF_NOT_ZERO ( retVal );
- retVal = chown ( dstName, statBuf.st_uid, statBuf.st_gid );
+ retVal = chown ( dstName, fileMetaInfo.st_uid, fileMetaInfo.st_gid );
/* chown() will in many cases return with EPERM, which can
be safely ignored.
*/
-#endif
-}
-
-
-/*---------------------------------------------*/
-static
-void setInterimPermissions ( Char *dstName )
-{
-#if BZ_UNIX
- IntNative retVal;
- retVal = chmod ( dstName, S_IRUSR | S_IWUSR );
- ERROR_IF_NOT_ZERO ( retVal );
-#endif
+# endif
}
@@ -1158,10 +1152,19 @@
static
Bool containsDubiousChars ( Char* name )
{
- Bool cdc = False;
+# if BZ_UNIX
+ /* On unix, files can contain any characters and the file expansion
+ * is performed by the shell.
+ */
+ return False;
+# else /* ! BZ_UNIX */
+ /* On non-unix (Win* platforms), wildcard characters are not allowed in
+ * filenames.
+ */
for (; *name != '\0'; name++)
- if (*name == '?' || *name == '*') cdc = True;
- return cdc;
+ if (*name == '?' || *name == '*') return True;
+ return False;
+# endif /* BZ_UNIX */
}
@@ -1201,6 +1204,7 @@
FILE *inStr;
FILE *outStr;
Int32 n, i;
+ struct MY_STAT statBuf;
deleteOutputOnInterrupt = False;
@@ -1246,6 +1250,16 @@
return;
}
}
+ if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
+ MY_STAT(inName, &statBuf);
+ if ( MY_S_ISDIR(statBuf.st_mode) ) {
+ fprintf( stderr,
+ "%s: Input file %s is a directory.\n",
+ progName,inName);
+ setExit(1);
+ return;
+ }
+ }
if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
if (noisy)
fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
@@ -1253,11 +1267,15 @@
setExit(1);
return;
}
- if ( srcMode == SM_F2F && !forceOverwrite && fileExists ( outName ) ) {
- fprintf ( stderr, "%s: Output file %s already exists.\n",
- progName, outName );
- setExit(1);
- return;
+ if ( srcMode == SM_F2F && fileExists ( outName ) ) {
+ if (forceOverwrite) {
+ remove(outName);
+ } else {
+ fprintf ( stderr, "%s: Output file %s already exists.\n",
+ progName, outName );
+ setExit(1);
+ return;
+ }
}
if ( srcMode == SM_F2F && !forceOverwrite &&
(n=countHardLinks ( inName )) > 0) {
@@ -1267,6 +1285,12 @@
return;
}
+ if ( srcMode == SM_F2F ) {
+ /* Save the file's meta-info before we open it. Doing it later
+ means we mess up the access times. */
+ saveInputFileMetaInfo ( inName );
+ }
+
switch ( srcMode ) {
case SM_I2O:
@@ -1306,7 +1330,7 @@
case SM_F2F:
inStr = fopen ( inName, "rb" );
- outStr = fopen ( outName, "wb" );
+ outStr = fopen_output_safely ( outName, "wb" );
if ( outStr == NULL) {
fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
progName, outName, strerror(errno) );
@@ -1321,7 +1345,6 @@
setExit(1);
return;
};
- setInterimPermissions ( outName );
break;
default:
@@ -1343,7 +1366,7 @@
/*--- If there was an I/O error, we won't get here. ---*/
if ( srcMode == SM_F2F ) {
- copyDatePermissionsAndOwner ( inName, outName );
+ applySavedMetaInfoToOutputFile ( outName );
deleteOutputOnInterrupt = False;
if ( !keepInputFiles ) {
IntNative retVal = remove ( inName );
@@ -1364,6 +1387,7 @@
Int32 n, i;
Bool magicNumberOK;
Bool cantGuess;
+ struct MY_STAT statBuf;
deleteOutputOnInterrupt = False;
@@ -1405,6 +1429,16 @@
setExit(1);
return;
}
+ if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
+ MY_STAT(inName, &statBuf);
+ if ( MY_S_ISDIR(statBuf.st_mode) ) {
+ fprintf( stderr,
+ "%s: Input file %s is a directory.\n",
+ progName,inName);
+ setExit(1);
+ return;
+ }
+ }
if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
if (noisy)
fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
@@ -1419,11 +1453,15 @@
progName, inName, outName );
/* just a warning, no return */
}
- if ( srcMode == SM_F2F && !forceOverwrite && fileExists ( outName ) ) {
- fprintf ( stderr, "%s: Output file %s already exists.\n",
- progName, outName );
- setExit(1);
- return;
+ if ( srcMode == SM_F2F && fileExists ( outName ) ) {
+ if (forceOverwrite) {
+ remove(outName);
+ } else {
+ fprintf ( stderr, "%s: Output file %s already exists.\n",
+ progName, outName );
+ setExit(1);
+ return;
+ }
}
if ( srcMode == SM_F2F && !forceOverwrite &&
(n=countHardLinks ( inName ) ) > 0) {
@@ -1433,6 +1471,12 @@
return;
}
+ if ( srcMode == SM_F2F ) {
+ /* Save the file's meta-info before we open it. Doing it later
+ means we mess up the access times. */
+ saveInputFileMetaInfo ( inName );
+ }
+
switch ( srcMode ) {
case SM_I2O:
@@ -1463,7 +1507,7 @@
case SM_F2F:
inStr = fopen ( inName, "rb" );
- outStr = fopen ( outName, "wb" );
+ outStr = fopen_output_safely ( outName, "wb" );
if ( outStr == NULL) {
fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
progName, outName, strerror(errno) );
@@ -1478,7 +1522,6 @@
setExit(1);
return;
};
- setInterimPermissions ( outName );
break;
default:
@@ -1501,7 +1544,7 @@
/*--- If there was an I/O error, we won't get here. ---*/
if ( magicNumberOK ) {
if ( srcMode == SM_F2F ) {
- copyDatePermissionsAndOwner ( inName, outName );
+ applySavedMetaInfoToOutputFile ( outName );
deleteOutputOnInterrupt = False;
if ( !keepInputFiles ) {
IntNative retVal = remove ( inName );
@@ -1539,6 +1582,7 @@
{
FILE *inStr;
Bool allOK;
+ struct MY_STAT statBuf;
deleteOutputOnInterrupt = False;
@@ -1565,6 +1609,16 @@
setExit(1);
return;
}
+ if ( srcMode != SM_I2O ) {
+ MY_STAT(inName, &statBuf);
+ if ( MY_S_ISDIR(statBuf.st_mode) ) {
+ fprintf( stderr,
+ "%s: Input file %s is a directory.\n",
+ progName,inName);
+ setExit(1);
+ return;
+ }
+ }
switch ( srcMode ) {
@@ -1603,6 +1657,7 @@
}
/*--- Now the input handle is sane. Do the Biz. ---*/
+ outputHandleJustInCase = NULL;
allOK = testStream ( inStr );
if (allOK && verbosity >= 1) fprintf ( stderr, "ok\n" );
@@ -1619,7 +1674,7 @@
"bzip2, a block-sorting file compressor. "
"Version %s.\n"
" \n"
- " Copyright (C) 1996-2000 by Julian Seward.\n"
+ " Copyright (C) 1996-2002 by Julian Seward.\n"
" \n"
" This program is free software; you can redistribute it and/or modify\n"
" it under the terms set out in the LICENSE file, which is included\n"
@@ -1658,6 +1713,8 @@
" -V --version display software version & license\n"
" -s --small use less memory (at most 2500k)\n"
" -1 .. -9 set block size to 100k .. 900k\n"
+ " --fast alias for -1\n"
+ " --best alias for -9\n"
"\n"
" If invoked as `bzip2', default action is to compress.\n"
" as `bunzip2', default action is to decompress.\n"
@@ -1666,9 +1723,9 @@
" If no file names are given, bzip2 compresses or decompresses\n"
" from standard input to standard output. You can combine\n"
" short flags, so `-v -4' means the same as -v4 or -4v, &c.\n"
-#if BZ_UNIX
+# if BZ_UNIX
"\n"
-#endif
+# endif
,
BZ2_bzlibVersion(),
@@ -1818,11 +1875,11 @@
/*-- Set up signal handlers for mem access errors --*/
signal (SIGSEGV, mySIGSEGVorSIGBUScatcher);
-#if BZ_UNIX
-#ifndef __DJGPP__
+# if BZ_UNIX
+# ifndef __DJGPP__
signal (SIGBUS, mySIGSEGVorSIGBUScatcher);
-#endif
-#endif
+# endif
+# endif
copyFileName ( inName, "(none)" );
copyFileName ( outName, "(none)" );
@@ -1933,6 +1990,8 @@
if (ISFLAG("--exponential")) workFactor = 1; else
if (ISFLAG("--repetitive-best")) redundant(aa->name); else
if (ISFLAG("--repetitive-fast")) redundant(aa->name); else
+ if (ISFLAG("--fast")) blockSize100k = 1; else
+ if (ISFLAG("--best")) blockSize100k = 9; else
if (ISFLAG("--verbose")) verbosity++; else
if (ISFLAG("--help")) { usage ( progName ); exit ( 0 ); }
else
Index: contrib/bzip2/bzlib.c
===================================================================
RCS file: /home/ncvs/src/contrib/bzip2/bzlib.c,v
retrieving revision 1.1.1.1.2.1
diff -u -r1.1.1.1.2.1 bzlib.c
--- contrib/bzip2/bzlib.c 1 Aug 2001 00:13:32 -0000 1.1.1.1.2.1
+++ contrib/bzip2/bzlib.c 22 Feb 2002 13:34:04 -0000
@@ -8,7 +8,7 @@
This file is a part of bzip2 and/or libbzip2, a program and
library for lossless, block-sorting data compression.
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -93,10 +93,39 @@
"component, you should also report this bug to the author(s)\n"
"of that program. Please make an effort to report this bug;\n"
"timely and accurate bug reports eventually lead to higher\n"
- "quality software. Thanks. Julian Seward, 21 March 2000.\n\n",
+ "quality software. Thanks. Julian Seward, 30 December 2001.\n\n",
errcode,
BZ2_bzlibVersion()
);
+
+ if (errcode == 1007) {
+ fprintf(stderr,
+ "\n*** A special note about internal error number 1007 ***\n"
+ "\n"
+ "Experience suggests that a common cause of i.e. 1007\n"
+ "is unreliable memory or other hardware. The 1007 assertion\n"
+ "just happens to cross-check the results of huge numbers of\n"
+ "memory reads/writes, and so acts (unintendedly) as a stress\n"
+ "test of your memory system.\n"
+ "\n"
+ "I suggest the following: try compressing the file again,\n"
+ "possibly monitoring progress in detail with the -vv flag.\n"
+ "\n"
+ "* If the error cannot be reproduced, and/or happens at different\n"
+ " points in compression, you may have a flaky memory system.\n"
+ " Try a memory-test program. I have used Memtest86\n"
+ " (www.memtest86.com). At the time of writing it is free (GPLd).\n"
+ " Memtest86 tests memory much more thorougly than your BIOSs\n"
+ " power-on test, and may find failures that the BIOS doesn't.\n"
+ "\n"
+ "* If the error can be repeatably reproduced, this is a bug in\n"
+ " bzip2, and I would very much like to hear about it. Please\n"
+ " let me know, and, ideally, save a copy of the file causing the\n"
+ " problem -- without which I will be unable to investigate it.\n"
+ "\n"
+ );
+ }
+
exit(3);
}
#endif
@@ -1402,7 +1431,7 @@
smallMode = 1; break;
default:
if (isdigit((int)(*mode))) {
- blockSize100k = *mode-'0';
+ blockSize100k = *mode-BZ_HDR_0;
}
}
mode++;
Index: contrib/bzip2/bzlib.h
===================================================================
RCS file: /home/ncvs/src/contrib/bzip2/bzlib.h,v
retrieving revision 1.1.1.1.2.1
diff -u -r1.1.1.1.2.1 bzlib.h
--- contrib/bzip2/bzlib.h 1 Aug 2001 00:13:32 -0000 1.1.1.1.2.1
+++ contrib/bzip2/bzlib.h 22 Feb 2002 13:34:04 -0000
@@ -8,7 +8,7 @@
This file is a part of bzip2 and/or libbzip2, a program and
library for lossless, block-sorting data compression.
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -110,8 +110,10 @@
#define BZ_EXPORT
#endif
+/* Need a definitition for FILE */
+#include <stdio.h>
+
#ifdef _WIN32
-# include <stdio.h>
# include <windows.h>
# ifdef small
/* windows.h define small to char */
Index: contrib/bzip2/bzlib_private.h
===================================================================
RCS file: /home/ncvs/src/contrib/bzip2/bzlib_private.h,v
retrieving revision 1.1.1.1.2.1
diff -u -r1.1.1.1.2.1 bzlib_private.h
--- contrib/bzip2/bzlib_private.h 1 Aug 2001 00:13:32 -0000 1.1.1.1.2.1
+++ contrib/bzip2/bzlib_private.h 22 Feb 2002 13:34:04 -0000
@@ -8,7 +8,7 @@
This file is a part of bzip2 and/or libbzip2, a program and
library for lossless, block-sorting data compression.
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -76,7 +76,7 @@
/*-- General stuff. --*/
-#define BZ_VERSION "1.0.1, 23-June-2000"
+#define BZ_VERSION "1.0.2, 30-Dec-2001"
typedef char Char;
typedef unsigned char Bool;
@@ -137,6 +137,13 @@
#define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp))
+/*-- Header bytes. --*/
+
+#define BZ_HDR_B 0x42 /* 'B' */
+#define BZ_HDR_Z 0x5a /* 'Z' */
+#define BZ_HDR_h 0x68 /* 'h' */
+#define BZ_HDR_0 0x30 /* '0' */
+
/*-- Constants for the back end. --*/
#define BZ_MAX_ALPHA_SIZE 258
Index: contrib/bzip2/compress.c
===================================================================
RCS file: /home/ncvs/src/contrib/bzip2/compress.c,v
retrieving revision 1.1.1.1.2.1
diff -u -r1.1.1.1.2.1 compress.c
--- contrib/bzip2/compress.c 1 Aug 2001 00:13:32 -0000 1.1.1.1.2.1
+++ contrib/bzip2/compress.c 22 Feb 2002 13:34:04 -0000
@@ -8,7 +8,7 @@
This file is a part of bzip2 and/or libbzip2, a program and
library for lossless, block-sorting data compression.
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -663,10 +663,10 @@
/*-- If this is the first block, create the stream header. --*/
if (s->blockNo == 1) {
BZ2_bsInitWrite ( s );
- bsPutUChar ( s, 'B' );
- bsPutUChar ( s, 'Z' );
- bsPutUChar ( s, 'h' );
- bsPutUChar ( s, (UChar)('0' + s->blockSize100k) );
+ bsPutUChar ( s, BZ_HDR_B );
+ bsPutUChar ( s, BZ_HDR_Z );
+ bsPutUChar ( s, BZ_HDR_h );
+ bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );
}
if (s->nblock > 0) {
Index: contrib/bzip2/decompress.c
===================================================================
RCS file: /home/ncvs/src/contrib/bzip2/decompress.c,v
retrieving revision 1.1.1.1.2.1
diff -u -r1.1.1.1.2.1 decompress.c
--- contrib/bzip2/decompress.c 1 Aug 2001 00:13:32 -0000 1.1.1.1.2.1
+++ contrib/bzip2/decompress.c 22 Feb 2002 13:34:04 -0000
@@ -8,7 +8,7 @@
This file is a part of bzip2 and/or libbzip2, a program and
library for lossless, block-sorting data compression.
- Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -235,18 +235,18 @@
switch (s->state) {
GET_UCHAR(BZ_X_MAGIC_1, uc);
- if (uc != 'B') RETURN(BZ_DATA_ERROR_MAGIC);
+ if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
GET_UCHAR(BZ_X_MAGIC_2, uc);
- if (uc != 'Z') RETURN(BZ_DATA_ERROR_MAGIC);
+ if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
GET_UCHAR(BZ_X_MAGIC_3, uc)
- if (uc != 'h') RETURN(BZ_DATA_ERROR_MAGIC);
+ if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
- if (s->blockSize100k < '1' ||
- s->blockSize100k > '9') RETURN(BZ_DATA_ERROR_MAGIC);
- s->blockSize100k -= '0';
+ if (s->blockSize100k < (BZ_HDR_0 + 1) ||
+ s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
+ s->blockSize100k -= BZ_HDR_0;
if (s->smallDecompress) {
s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );