The GZIP environment variable is too hazardous. * gzip.c (env, ENV_OPTION): * tailor.h (OPTIONS_VAR): * util.c (SEPARATOR, add_envopt): Remove. All uses removed. * gzip.c (main): Ignore GZIP. * tests/gzip-env: Test that GZIP is ignored. --- NEWS | 6 ++++ doc/gzip.texi | 11 ++----- gzip.1 | 18 ++++-------- gzip.c | 79 +------------------------------------------------- gzip.h | 1 - tailor.h | 4 --- tests/gzip-env | 19 +++++------- util.c | 60 -------------------------------------- znew.in | 2 +- 9 files changed, 24 insertions(+), 176 deletions(-)
diff --git a/NEWS b/NEWS index e348355..0c4a2fc 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,12 @@ GNU gzip NEWS -*- outline -*- * Noteworthy changes in release ?.? (????-??-??) [?] +** Changes in behavior + + The GZIP environment variable, which was marked as obsolescent in + gzip 1.7 (2016) due to its hazards, has been removed. You can use + an alias or script instead. + ** Bug fixes 'gzip -d' no longer omits the last partial output buffer when the diff --git a/doc/gzip.texi b/doc/gzip.texi index cc05b60..1bfca98 100644 --- a/doc/gzip.texi +++ b/doc/gzip.texi @@ -487,14 +487,9 @@ complement to @command{tar}, not as a replacement. @chapter Environment @cindex Environment -The obsolescent environment variable @env{GZIP} can hold a set of -default options for @command{gzip}. These options are interpreted -first and can be overwritten by explicit command line parameters. As -this can cause problems when using scripts, this feature is supported -only for options that are reasonably likely to not cause too much -harm, and @command{gzip} warns if it is used. This feature will be -removed in a future release of @command{gzip}. - +Although previous verions of @command{gzip} examined the environment +variable @env{GZIP} for a set of default options, +this feature has been removed because it caused problems when using scripts. You can use an alias or script instead. For example, if @command{gzip} is in the directory @samp{/usr/bin} you can prepend @file{$HOME/bin} to your @env{PATH} and create an executable script diff --git a/gzip.1 b/gzip.1 index 0efe399..4afa243 100644 --- a/gzip.1 +++ b/gzip.1 @@ -416,20 +416,12 @@ such as tar or zip. GNU tar supports the \-z option to invoke gzip transparently. gzip is designed as a complement to tar, not as a replacement. .SH "ENVIRONMENT" -The obsolescent environment variable -.B GZIP -can hold a set of default options for -.BR gzip . -These options are interpreted first and can be overwritten by explicit -command line parameters. -As this can cause problems when using scripts, -this feature is supported only for options that are -reasonably likely to not cause too much harm, and +Although previous versions of .B gzip -warns if it is used. -This feature will be removed in a future release of -.BR gzip . -.PP +examined the environment variable +.B GZIP +for a set of default options, this feature has been removed +because it caused problems when using scripts. You can use an alias or script instead. For example, if .B gzip diff --git a/gzip.c b/gzip.c index a33841a..1fe589b 100644 --- a/gzip.c +++ b/gzip.c @@ -182,7 +182,6 @@ static int foreground = 0; /* set if program run in foreground */ static int last_member; /* set for .zip and .Z files */ static int part_nb; /* number of parts in .gz file */ off_t ifile_size; /* input file size, -1 for devices (debug only) */ -static char *env; /* contents of GZIP env variable */ static char const *z_suffix; /* default suffix (can be set with --suffix) */ static size_t z_len; /* strlen(z_suffix) */ @@ -249,10 +248,6 @@ enum PRESUME_INPUT_TTY_OPTION = CHAR_MAX + 1, RSYNCABLE_OPTION, SYNCHRONOUS_OPTION, - - /* A value greater than all valid long options, used as a flag to - distinguish options derived from the GZIP environment variable. */ - ENV_OPTION }; static char const shortopts[] = "ab:cdfhH?klLmMnNqrS:tvVZ123456789"; @@ -413,9 +408,6 @@ int main (int argc, char **argv) { int file_count; /* number of files to process */ size_t proglen; /* length of program_name */ - char **argv_copy; - int env_argc; - char **env_argv; EXPAND(argc, argv); /* wild card expansion if necessary */ @@ -426,11 +418,6 @@ int main (int argc, char **argv) if (4 < proglen && strequ (program_name + proglen - 4, ".exe")) program_name[proglen - 4] = '\0'; - /* Add options in GZIP environment variable if there is one */ - argv_copy = argv; - env = add_envopt (&env_argc, &argv_copy, OPTIONS_VAR); - env_argv = env ? argv_copy : NULL; - #ifndef GNU_STANDARD # define GNU_STANDARD 1 #endif @@ -454,49 +441,8 @@ int main (int argc, char **argv) z_len = strlen(z_suffix); while (true) { - int optc; int longind = -1; - - if (env_argv) - { - if (env_argv[optind] && strequ (env_argv[optind], "--")) - optc = ENV_OPTION + '-'; - else - { - optc = getopt_long (env_argc, env_argv, shortopts, longopts, - &longind); - if (0 <= optc) - optc += ENV_OPTION; - else - { - if (optind != env_argc) - { - fprintf (stderr, - ("%s: %s: non-option in "OPTIONS_VAR - " environment variable\n"), - program_name, env_argv[optind]); - try_help (); - } - - /* Wait until here before warning, so that GZIP='-q' - doesn't warn. */ - if (env_argc != 1 && !quiet) - fprintf (stderr, - ("%s: warning: "OPTIONS_VAR" environment variable" - " is deprecated; use an alias or script\n"), - program_name); - - /* Start processing ARGC and ARGV instead. */ - free (env_argv); - env_argv = NULL; - optind = 1; - longind = -1; - } - } - } - - if (!env_argv) - optc = getopt_long (argc, argv, shortopts, longopts, &longind); + int optc = getopt_long (argc, argv, shortopts, longopts, &longind); if (optc < 0) break; @@ -532,15 +478,12 @@ int main (int argc, char **argv) case 'M': /* undocumented, may change later */ no_time = 0; break; case 'n': - case 'n' + ENV_OPTION: no_name = no_time = 1; break; case 'N': - case 'N' + ENV_OPTION: no_name = no_time = 0; break; case PRESUME_INPUT_TTY_OPTION: presume_input_tty = true; break; case 'q': - case 'q' + ENV_OPTION: quiet = 1; verbose = 0; break; case 'r': #if NO_DIR @@ -553,7 +496,6 @@ int main (int argc, char **argv) break; case RSYNCABLE_OPTION: - case RSYNCABLE_OPTION + ENV_OPTION: rsync = 1; break; case 'S': @@ -575,7 +517,6 @@ int main (int argc, char **argv) test = decompress = to_stdout = 1; break; case 'v': - case 'v' + ENV_OPTION: verbose++; quiet = 0; break; case 'V': version (); finish_out (); break; @@ -584,28 +525,12 @@ int main (int argc, char **argv) program_name); try_help (); break; - case '1' + ENV_OPTION: case '2' + ENV_OPTION: case '3' + ENV_OPTION: - case '4' + ENV_OPTION: case '5' + ENV_OPTION: case '6' + ENV_OPTION: - case '7' + ENV_OPTION: case '8' + ENV_OPTION: case '9' + ENV_OPTION: - optc -= ENV_OPTION; - FALLTHROUGH; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': level = optc - '0'; break; default: - if (ENV_OPTION <= optc && optc != ENV_OPTION + '?') - { - /* Output a diagnostic, since getopt_long didn't. */ - fprintf (stderr, "%s: ", program_name); - if (longind < 0) - fprintf (stderr, "-%c: ", optc - ENV_OPTION); - else - fprintf (stderr, "--%s: ", longopts[longind].name); - fprintf (stderr, ("option not valid in "OPTIONS_VAR - " environment variable\n")); - } try_help (); } } /* loop on all arguments */ @@ -2042,8 +1967,6 @@ do_exit (int exitcode) if (in_exit) exit(exitcode); in_exit = 1; - free(env); - env = NULL; FREE(inbuf); FREE(outbuf); FREE(d_buf); diff --git a/gzip.h b/gzip.h index 855a88b..66b504b 100644 --- a/gzip.h +++ b/gzip.h @@ -314,7 +314,6 @@ extern char *strlwr (char *s); extern char *gzip_base_name (char *fname) _GL_ATTRIBUTE_PURE; extern int xunlink (char *fname); extern void make_simple_name (char *name); -extern char *add_envopt (int *argcp, char ***argvp, char const *env); _Noreturn extern void gzip_error (char const *m); _Noreturn extern void xalloc_die (void); extern void warning (char const *m); diff --git a/tailor.h b/tailor.h index c9147b1..095d7ce 100644 --- a/tailor.h +++ b/tailor.h @@ -163,10 +163,6 @@ # define casemap(c) (c) #endif -#ifndef OPTIONS_VAR -# define OPTIONS_VAR "GZIP" -#endif - #ifndef Z_SUFFIX # define Z_SUFFIX ".gz" #endif diff --git a/tests/gzip-env b/tests/gzip-env index b7382d9..2da5915 100755 --- a/tests/gzip-env +++ b/tests/gzip-env @@ -1,5 +1,5 @@ #!/bin/sh -# Test the obsolescent GZIP environment variable. +# Test that gzip is unaffected by the GZIP environment variable. # Copyright 2015-2025 Free Software Foundation, Inc. @@ -23,20 +23,17 @@ echo a >exp || framework_failure_ gzip <exp >in || framework_failure_ fail=0 -GZIP=-qv gzip -d <in >out 2>err || fail=1 -compare exp out || fail=1 -for badopt in -- -c --stdout -d --decompress -f --force -h --help -k --keep \ +for opt in -qv \ + -- -c --stdout -d --decompress -f --force -h --help -k --keep \ -l --list -L --license -r --recursive -Sxxx --suffix=xxx '--suffix xxx' \ - -t --test -V --version -do - GZIP=$badopt gzip -d <in >out 2>err && fail=1 -done - -for goodopt in -n --no-name -N --name -q --quiet -v --verbose \ + -t --test -V --version \ + -n --no-name -N --name -q --quiet -v --verbose \ -1 --fast -2 -3 -4 -5 -6 -7 -8 -9 --best do - GZIP=$goodopt gzip -d <in >out 2>err || fail=1 + GZIP=$opt gzip <exp >inopt 2>err || fail=1 + compare in inopt || fail=1 + GZIP=$opt gzip -d <in >out 2>err || fail=1 compare exp out || fail=1 done diff --git a/util.c b/util.c index e3eb739..c799ac1 100644 --- a/util.c +++ b/util.c @@ -291,66 +291,6 @@ make_simple_name (char *name) } #endif -/* Convert the value of the environment variable ENVVAR_NAME - to a newly allocated argument vector, and set *ARGCP and *ARGVP - to the number of arguments and to the vector, respectively. - Make the new vector's zeroth element equal to the old **ARGVP. - Return a pointer to the newly allocated string storage. - - If the vector would be empty, do not allocate storage, - do not set *ARGCP and *ARGVP, and return NULL. */ - -#define SEPARATOR " \t" /* separators in env variable */ - -char *add_envopt( - int *argcp, /* pointer to argc */ - char ***argvp, /* pointer to argv */ - char const *envvar_name) /* name of environment variable */ -{ - char *p; /* running pointer through env variable */ - char **oargv; /* runs through old argv array */ - char **nargv; /* runs through new argv array */ - int nargc = 0; /* number of arguments in env variable */ - char *env_val; - - env_val = getenv(envvar_name); - if (env_val == NULL) return NULL; - - env_val = xstrdup (env_val); - - for (p = env_val; *p; nargc++ ) { /* move through env_val */ - p += strspn(p, SEPARATOR); /* skip leading separators */ - if (*p == '\0') break; - - p += strcspn(p, SEPARATOR); /* find end of word */ - if (*p) *p++ = '\0'; /* mark it */ - } - if (nargc == 0) { - free(env_val); - return NULL; - } - *argcp = nargc + 1; - /* Allocate the new argv array, with an extra element just in case - * the original arg list did not end with a NULL. - */ - nargv = xcalloc (*argcp + 1, sizeof (char *)); - oargv = *argvp; - *argvp = nargv; - - /* Copy the program name first */ - *nargv++ = *oargv; - - /* Then copy the environment args */ - for (p = env_val; nargc > 0; nargc--) { - p += strspn(p, SEPARATOR); /* skip separators */ - *(nargv++) = p; /* store start */ - while (*p++) ; /* skip over word */ - } - - *nargv = NULL; - return env_val; -} - /* ======================================================================== * Error handlers. */ diff --git a/znew.in b/znew.in index b09d967..e9d87f3 100644 --- a/znew.in +++ b/znew.in @@ -55,7 +55,7 @@ new=0 block=1024 # block is the disk block size (best guess, need not be exact) -# Beware -s or --suffix in $GZIP. +# Beware -s or --suffix in $GZIP, used by gzip 1.13 and earlier. unset GZIP ext=.gz -- 2.45.2