bin/114470: [patch]: gzip(1): bad recursive behaviour

Ighighi ighighi at gmail.com
Tue Jul 10 09:00:13 UTC 2007


>Number:         114470
>Category:       bin
>Synopsis:       [patch]: gzip(1): bad recursive behaviour
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jul 10 09:00:10 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     Ighighi
>Release:        6.2-STABLE
>Organization:
>Environment:
FreeBSD orion 6.2-STABLE FreeBSD 6.2-STABLE #3: Mon Jul  9 23:03:53 VET 2007     root at orion:/usr/obj/usr/src/sys/CUSTOM  i386

>Description:
The handle_dir() function should pass fts_path and not fts_name because the latter
is the basename(3).  Because of this, not just verbose output but error messages
as well are ambiguous when files with the same name exist...
It's also an issue when compatibility with GNU gzip(1) is desired.
>How-To-Repeat:
$ /bin/mkdir /tmp/x /tmp/y
$ /bin/cp /etc/services /tmp/x
$ /bin/cp /etc/services /tmp/y
$ /bin/chmod 000 /tmp/x/services
$ /usr/bin/gzip -vr /tmp/x /tmp/y
gzip: can't open services: Permission denied
services:          71.7% -- replaced with services.gz
$ /usr/bin/gzip --version
FreeBSD gzip 20070528

### Now with GNU gzip(1) in ports:

$ /bin/mkdir /tmp/x /tmp/y
$ /bin/cp /etc/services /tmp/x
$ /bin/cp /etc/services /tmp/y
$ /bin/chmod 000 /tmp/x/services
$ /usr/local/bin/gzip -vr /tmp/x /tmp/y
gzip: /tmp/x/services: Permission denied
/tmp/y/services:         71.8% -- replaced with /tmp/y/services.gz
$ /usr/local/bin/gzip --version
gzip 1.3.12
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 1993 Jean-loup Gailly.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by Jean-loup Gailly.

>Fix:
Attached patch successfully built and tested on FreeBSD 6.2-STABLE and
known to patch in -CURRENT.

To apply, run:
patch -d /usr < /path/to/patch
cd /usr/src/usr.bin/gzip
make clean obj depend && make && make install

Patch attached with submission follows:

--- src/usr.bin/gzip/gzip.c.orig	Sat Jun 30 06:13:00 2007
+++ src/usr.bin/gzip/gzip.c	Tue Jul 10 04:08:11 2007
@@ -1806,7 +1806,7 @@
 
 	path_argv[0] = dir;
 	path_argv[1] = 0;
-	fts = fts_open(path_argv, FTS_PHYSICAL, NULL);
+	fts = fts_open(path_argv, FTS_PHYSICAL | FTS_NOCHDIR, NULL);
 	if (fts == NULL) {
 		warn("couldn't fts_open %s", dir);
 		return;
@@ -1824,7 +1824,7 @@
 			maybe_warn("%s", entry->fts_path);
 			continue;
 		case FTS_F:
-			handle_file(entry->fts_name, entry->fts_statp);
+			handle_file(entry->fts_path, entry->fts_statp);
 		}
 	}
 	(void)fts_close(fts);


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list