Fix growth check in compress(1)/gzip(1)
authortb <tb@openbsd.org>
Mon, 29 Aug 2022 19:42:01 +0000 (19:42 +0000)
committertb <tb@openbsd.org>
Mon, 29 Aug 2022 19:42:01 +0000 (19:42 +0000)
If a compressed file is larger than its expanded version, compress(1) and
gzip(1) don't compress unless -f is given. As found by gkoehler, the check
is not quite correct for very small files or files with sufficiently random
data. Fix the check so that slight growth still triggers the check.

ok millert

usr.bin/compress/main.c

index 66cd228..81d7bd5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: main.c,v 1.100 2022/04/10 18:05:39 jca Exp $  */
+/*     $OpenBSD: main.c,v 1.101 2022/08/29 19:42:01 tb Exp $   */
 
 /*
  * Copyright (c) 1992, 1993
@@ -582,7 +582,8 @@ docompress(const char *in, char *out, const struct compressor *method,
                error = FAILURE;
        }
 
-       if (!force && !cat && info.total_out >= info.total_in) {
+       if (!force && !cat && (info.hlen >= info.total_in ||
+           info.total_out >= info.total_in - info.hlen)) {
                if (verbose > 0)
                        fprintf(stderr, "file would grow; left unmodified\n");
                (void) unlink(out);