extra bytes in zip archive when used with logrotate

extra bytes in zip archive when used with logrotate

Oleg Goldshmidt pub at goldshmidt.org
Mon Aug 6 17:35:28 IDT 2012


Hi everyone,

I am looking at another weird problem on CentOS 6.2. Here is the
outline - hope someone will be able to help me figure it out.

Many (most?) of you are probably familiar with logrotate(8), and know
that it is capable of a) compressing the rotated logs, and b) mailing
them to a specified address. Logrotate is smart enough to know what it
has compressed and takes care to uncompress the logs before mailing,
so that the plain text logs become the body of the email.

I need to send zipped logs as attachments as they are rotated. Since
logrotate allows specifying the mailer program I wrote a trivial
script that accepts the same arguments as the default "mail", takes
the stdin, zips it, and calls "mutt -a" to send the archive as an
attachment. During testing I even commented out the mutt part, so that
the (simplified, debug version of the) script looks like this:

---------------------- file: zipit --------------------------------
 #!/bin/bash

archive=/tmp/file.log.zip
input=/tmp/zipit.$$

# read the input - we want a filename in the archive
/bin/cat - > $input

# create a new archive
/bin/rm -f $archive
/usr/bin/zip -r $archive -j $input

# clean up, keeping the archive for checking
/bin/rm -f $input
--------------------------------------------------------------------

As long as I do

$ cat file.log | ./zipit

or

$ gunzip -c file.log.gz | ./zipit

everything is fine. The zip archive is created, i can open it, no problem.

As soon as I try

$ logrotate -vm ./zipit logrotate.conf

everything is also fine, but subsequent unzip results in a warning

$ unzip -l file.log.zip
Archive:  file.log.zip
warning [file.log.zip]:  16 extra bytes at beginning or within zipfile
  (attempting to process anyway)
  Length      Date    Time    Name
---------  ---------- -----   ----
    71992  08-06-2012 16:05   zipit.10182
---------                     -------
    71992                     1 file

and the archive cannot be opened:

$ unzip -c file.log.zip
Archive:  file.log.zip
warning [file.log.zip]:  16 extra bytes at beginning or within zipfile
  (attempting to process anyway)
file #1:  bad zipfile offset (local header sig):  16
  (attempting to re-compensate)
  inflating: zipit.10182

  error:  invalid compressed data to inflate
$

The file cannot be opened either on Linux (the same machine) or on
Windows (after receiving in the mail) - basically, the archive is
corrupted. The number of "extra bytes" is always 16, by the way.

I googled and only saw similar complaints about *very* large files or
when non-binary FTP or similar was involved - neither is the case
here. I went over the code of logrotate (very readable, creates a pipe
and calls the configured uncompress command, gunzip by default, before
passing to mail command), zip, and unzip (very UNreadable) in an
attempt to find out what could cause the problem, all to no avail. I
saw that someone succeeded fixing the archive using zip -FFv after
such a warning. Didn't work for me, but it would be a non-starter,
anyway.

Packages and versions:

zip-3.0-1.el6.x86_64
unzip-6.0-1.el6.x86_64
logrotate-3.7.8-12.el6_0.1.x86_64

Any ideas? For a solution or an explanation?

-- 
Oleg Goldshmidt | pub at goldshmidt.org



More information about the Linux-il mailing list