Date: Wed, 20 Mar 2002 21:18:21 +0600 (NOVT) From: Dmitry Frolov <frolov@riss-telecom.ru> To: FreeBSD-gnats-submit@FreeBSD.org Subject: bin/36136: savecore -z option does not work Message-ID: <200203201518.g2KFILs49998@nerve.riss-telecom.ru>
next in thread | raw e-mail | index | archive | help
>Number: 36136 >Category: bin >Synopsis: savecore -z option does not work >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Mar 20 07:20:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Dmitry Frolov >Release: FreeBSD 4.5-STABLE i386 >Organization: RISS-Telecom >Environment: System: FreeBSD nerve.riss-telecom.ru 4.5-STABLE FreeBSD 4.5-STABLE #0: Thu Mar 7 22:35:51 NOVT 2002 root@nerve.riss-telecom.ru:/usr/src/sys/compile/NERVE i386 >Description: When saving kernel core dump, savecore attempts to find blocks of zeroes in dump, and calls fseek on output stream when finds such block. If -z option is specified, stream is created with zlib "zopen" function, and fseek on that stream fails. Problem represented by commit at Feb 16 2001 (savecore.c revision 1.37). >How-To-Repeat: # savecore -z /var/crash savecore: reboot after panic: page fault savecore: system went down at Wed Mar 20 19:54:18 2002 savecore: writing compressed core to /var/crash/vmcore.0.gz savecore: /var/crash/vmcore.0.gz: Illegal seek savecore: WARNING: vmcore may be incomplete >Fix: savecore.c: Don't search for zeroes if -z option is specified. --- sbin/savecore/savecore.c.old Wed Mar 20 21:03:18 2002 +++ sbin/savecore/savecore.c Wed Mar 20 21:05:05 2002 @@ -432,14 +432,17 @@ nw = fwrite(buf, 1, nr, fp); } else { for (nw = 0; nw < nr; nw = he) { - /* find a contiguous block of zeroes */ - for (hs = nw; hs < nr; hs += BLOCKSIZE) { - for (he = hs; he < nr && buf[he] == 0; ++he) - /* nothing */ ; - /* is the hole long enough to matter? */ - if (he >= hs + BLOCKSIZE) - break; - } + if (compress) + hs = he = nr; + else + /* find a contiguous block of zeroes */ + for (hs = nw; hs < nr; hs += BLOCKSIZE) { + for (he = hs; he < nr && buf[he] == 0; ++he) + /* nothing */ ; + /* is the hole long enough to matter? */ + if (he >= hs + BLOCKSIZE) + break; + } /* back down to a block boundary */ he &= BLOCKMASK; >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200203201518.g2KFILs49998>