Package: unzip
Version: 6.0-7
Severity: grave
Tags: upstream
Justification: causes non-serious data loss

Dear Maintainer,

Unzipping an archive gives me CRC errors and corrupt files.  Please consider
adding -DNOMEMCPY to the compile line.  I was merrily unzipping an
archive when I came across CRC errors for some of the extracted files:

$ unzip ../walk_network_20120628.zip
Archive:  ../walk_network_20120628.zip
  inflating: walk_network.shx
  inflating: walk_network.dbf     bad CRC b3242663  (should be 7d1b61e0)
  inflating: walk_network.prj
  inflating: walk_network.sbn
  inflating: walk_network.sbx
  inflating: walk_network.shp     bad CRC 13443cc8  (should be 0adaa078)
  inflating: walk_network.shp.xml

The extracted files are corrupted.  I suspected a memory failure
so ran memtester with a large percentage of ram under test.  Nothing
showed up and grumpyness ensued.

So I downloaded the source using apt-get source unzip, built
the unzip executable with flags -O0 -g and removed the -s
flag from the link line to not strip the resulting binaries, like so:

$ make -B -f unix/Makefile LF2="" CFLAGS="-O0 -g" unzip
[...]

Running the unzip command above under valgrind and tells me this:

$ valgrind ../unzip-6.0/unzip ../lvm_walk_network_20120628.zip 
==19732== Memcheck, a memory error detector
==19732== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==19732== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==19732== Command: ../unzip-6.0/unzip ../walk_network_20120628.zip
==19732== 
Archive:  ../walk_network_20120628.zip
  inflating: walk_network.shx    
  inflating: walk_network.dbf    ==19732== Source and destination overlap in 
memcpy(0x70dd44, 0x70dd72, 74)
==19732==    at 0x4C2A690: memcpy (mc_replace_strmem.c:838)
==19732==    by 0x40D377: inflate_codes (inflate.c:1021)
==19732==    by 0x40E151: inflate_dynamic (inflate.c:1373)
==19732==    by 0x40E2D0: inflate_block (inflate.c:1421)
==19732==    by 0x40E3E7: inflate (inflate.c:1494)
==19732==    by 0x408B38: extract_or_test_member (extract.c:1855)
==19732==    by 0x408091: extract_or_test_entrylist (extract.c:1576)
==19732==    by 0x406060: extract_or_test_files (extract.c:584)
==19732==    by 0x4116D8: do_seekable (process.c:987)
==19732==    by 0x410719: process_zipfiles (process.c:401)
==19732==    by 0x402195: unzip (unzip.c:1253)
==19732==    by 0x401B10: main (unzip.c:720)
==19732== 

Looking at the source I see it choosing between memcpy() and
a hand-rolled forward copy like this:

#ifndef NOMEMCPY
          if ((unsigned)w - d >= e)
          /* (this test assumes unsigned comparison) */
          {
            memcpy(redirSlide + (unsigned)w, redirSlide + d, e);
            w += e;
            d += e;
          }
          else                  /* do it slowly to avoid memcpy() overlap */
#endif /* !NOMEMCPY */
            do {
              redirSlide[w++] = redirSlide[d++];
            } while (--e);

The same style of test occurs in explode.c twice.  So I added -DNOMEMCPY to
the compile line, rebuilt, and ran the unzip command again. All files were
intact without any corruption.

-- System Information:
Debian Release: wheezy/sid
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: amd64 (x86_64)

Kernel: Linux 3.2.0-3-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages unzip depends on:
ii  libbz2-1.0  1.0.6-4
ii  libc6       2.13-35

unzip recommends no packages.

Versions of packages unzip suggests:
pn  zip  <none>

-- no debconf information


-- 
To UNSUBSCRIBE, email to debian-bugs-rc-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to