ports/162804: zoo can't modify archives under amd64 [Patch]

Carl Johnson carlj at peak.org
Thu Nov 24 03:00:32 UTC 2011


>Number:         162804
>Category:       ports
>Synopsis:       zoo can't modify archives under amd64 [Patch]
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Nov 24 03:00:25 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Carl Johnson
>Release:        FreeBSD 8.1-RELEASE amd64
>Organization:
>Environment:
System: FreeBSD oak.localnet 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Mon Jul 19 02:36:49 UTC 2010 root at mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64


	
I have confirmed that this also occurs on FreeBSD 8.2-RELEASE.
>Description:
	
Zoo can't modify any archives that already exist in an amd64 system.
Zoo can create the archive, but any change later generates the message:
    Zoo:  FATAL:  Archive header failed consistency check.
The zoo version is the one in 8.1-RELEASE (zoo-2.10.1_2).


>How-To-Repeat:
	
$ rm -f test.zoo
$ zoo -a test .profile          # test.zoo doesn't exist
Zoo:  .profile --  (38%) added
$ zoo -a test .profile          # test.zoo now exists
Zoo:  FATAL:  Archive header failed consistency check.
$ zoo -l test                   # this will work

Archive test.zoo:
Length    CF  Size Now  Date      Time
--------  --- --------  --------- --------
     813  38%      502  21 Oct 11 15:25:22-1   644 .profile
--------  --- --------  --------- --------
     813  38%      502     1 file
$ pkg_info -Ix zoo
zoo-2.10.1_2        Manipulate archives of files in compressed form

>Fix:

	
The problem seems to be that it uses long calculations (64 bit), but then
compares with stored 32-bit values in the header, which will fail.  The
following patch seems to work, and is basically what I reported to Debian
several years ago (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=335114).
It is based on the already patched contents of the work directory in
/usr/ports/archivers/zoo.  I think it will still work with 32 bit systems, but
I don't have any to check with.

=-=-=-=-=-=-=-=-=-=-  snip diff -u patch below  -=-=-=-=-=-=-=-=-=-=
--- orig/misc.c	2011-11-23 14:56:04.000000000 -0800
+++ misc.c	2011-11-23 17:41:30.000000000 -0800
@@ -177,7 +177,11 @@
 
    frd_zooh (header, zoo_file);
 
+#ifdef __LP64__
+   if ((int)(header->zoo_start + header->zoo_minus) != 0)
+#else
    if ((header->zoo_start + header->zoo_minus) != 0L)
+#endif
       prterror ('f', failed_consistency);
    if (ver_too_high (header))
       prterror ('f', wrong_version, header->major_ver, header->minor_ver);
--- orig/zoodel.c	2011-11-23 14:56:04.000000000 -0800
+++ zoodel.c	2011-11-23 17:41:37.000000000 -0800
@@ -138,7 +138,11 @@
    
    /* read archive header */
    frd_zooh (&zoo_header, zoo_file);
+#ifdef __LP64__
+   if ((int)(zoo_header.zoo_start + zoo_header.zoo_minus) != 0)
+#else
    if ((zoo_header.zoo_start + zoo_header.zoo_minus) != 0L)
+#endif
       prterror ('f', failed_consistency);
    if (ver_too_high (&zoo_header))
       prterror ('f', wrong_version, zoo_header.major_ver, zoo_header.minor_ver);
--- orig/zooext.c	2011-11-23 14:56:04.000000000 -0800
+++ zooext.c	2011-11-23 17:41:47.000000000 -0800
@@ -163,7 +163,11 @@
 } else {
    /* read header */
    frd_zooh (&zoo_header, zoo_file);
+#ifdef __LP64__
+   if ((int)(zoo_header.zoo_start + zoo_header.zoo_minus) != 0) {
+#else
    if ((zoo_header.zoo_start + zoo_header.zoo_minus) != 0L) {
+#endif
       prterror ('w', failed_consistency);
       bad_header++;
 		exit_status = 1;
--- orig/zoopack.c	2011-11-23 14:56:04.000000000 -0800
+++ zoopack.c	2011-11-23 17:41:53.000000000 -0800
@@ -139,7 +139,11 @@
 /* Read the header of the old archive. */
 frd_zooh(&old_zoo_header, zoo_file);
 
+#ifdef __LP64__
+if ((int)(old_zoo_header.zoo_start + old_zoo_header.zoo_minus) != 0) {
+#else
 if ((old_zoo_header.zoo_start + old_zoo_header.zoo_minus) != 0L) {
+#endif
    prterror ('w', failed_consistency);
    ++bad_header;                    /* remember for future error message */
 }
=-=-=-=-=-=-=-=-=-=-  snip diff -u patch above  -=-=-=-=-=-=-=-=-=-=


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



More information about the freebsd-ports-bugs mailing list