From owner-freebsd-bugs@FreeBSD.ORG Mon Oct 3 03:21:22 2005 Return-Path: X-Original-To: freebsd-bugs@freebsd.org Delivered-To: freebsd-bugs@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 351C016A420; Mon, 3 Oct 2005 03:21:22 +0000 (GMT) (envelope-from kientzle@freebsd.org) Received: from kientzle.com (h-66-166-149-50.snvacaid.covad.net [66.166.149.50]) by mx1.FreeBSD.org (Postfix) with ESMTP id D921243D48; Mon, 3 Oct 2005 03:21:20 +0000 (GMT) (envelope-from kientzle@freebsd.org) Received: from freebsd.org (p54.kientzle.com [66.166.149.54]) by kientzle.com (8.12.9/8.12.9) with ESMTP id j933LJOZ022431; Sun, 2 Oct 2005 20:21:20 -0700 (PDT) (envelope-from kientzle@freebsd.org) Message-ID: <4340A398.900@freebsd.org> Date: Sun, 02 Oct 2005 20:20:56 -0700 From: Tim Kientzle User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.4) Gecko/20031006 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Juergen Lock References: <200509300010.j8U0AJon030993@freefall.freebsd.org> <20050930202618.GA42971@saturn.kn-bremen.de> <433E18F8.4000106@kientzle.com> <20051001181537.GA69885@saturn.kn-bremen.de> In-Reply-To: <20051001181537.GA69885@saturn.kn-bremen.de> Content-Type: multipart/mixed; boundary="------------060106030001060601030805" Cc: Craig Rodrigues , freebsd-bugs@freebsd.org, kientzle@freebsd.org Subject: Re: bin/86690: bsdtar sparse file problems X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 03 Oct 2005 03:21:22 -0000 This is a multi-part message in MIME format. --------------060106030001060601030805 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Juergen Lock wrote: > > Hmm i just tried it on a 60beta4 vm i still had lying around: > > FreeBSD qemutest.kn-bremen.de 6.0-BETA4 FreeBSD 6.0-BETA4 #0: Sun Sep 4 09:18:09 UTC 2005 root@x64.samsco.home:/usr/obj/usr/src/sys/GENERIC i386 > > and there it still extracts it to a 1 byte file. Has this been > fixed between beta4 and 5? Juergen, Try the attached patch against libarchive in 6.0 and let me know if this fixes it for you. Looks like the offset for the very first sparse block was being ignored. Tim --------------060106030001060601030805 Content-Type: text/plain; name="sparse_fix.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="sparse_fix.patch" Index: archive_read_support_format_tar.c =================================================================== RCS file: /home/ncvs/src/lib/libarchive/archive_read_support_format_tar.c,v retrieving revision 1.36 diff -u -r1.36 archive_read_support_format_tar.c --- archive_read_support_format_tar.c 24 Sep 2005 21:15:00 -0000 1.36 +++ archive_read_support_format_tar.c 3 Oct 2005 03:17:35 -0000 @@ -450,24 +450,34 @@ struct sparse_block *p; tar = *(a->pformat_data); - if (tar->entry_bytes_remaining > 0) { - bytes_read = (a->compression_read_ahead)(a, buff, 1); - if (bytes_read <= 0) - return (ARCHIVE_FATAL); - if (bytes_read > tar->entry_bytes_remaining) - bytes_read = tar->entry_bytes_remaining; + if (tar->sparse_list != NULL) { + /* Remove exhausted entries from sparse list. */ while (tar->sparse_list != NULL && tar->sparse_list->remaining == 0) { p = tar->sparse_list; tar->sparse_list = p->next; free(p); - if (tar->sparse_list != NULL) - tar->entry_offset = tar->sparse_list->offset; } + if (tar->sparse_list == NULL) { + /* We exhausted the entire sparse list. */ + tar->entry_bytes_remaining = 0; + } + } + + if (tar->entry_bytes_remaining > 0) { + bytes_read = (a->compression_read_ahead)(a, buff, 1); + if (bytes_read <= 0) + return (ARCHIVE_FATAL); + if (bytes_read > tar->entry_bytes_remaining) + bytes_read = tar->entry_bytes_remaining; if (tar->sparse_list != NULL) { + /* Don't read more than is available in the + * current sparse block. */ if (tar->sparse_list->remaining < bytes_read) bytes_read = tar->sparse_list->remaining; + tar->entry_offset = tar->sparse_list->offset; tar->sparse_list->remaining -= bytes_read; + tar->sparse_list->offset += bytes_read; } *size = bytes_read; *offset = tar->entry_offset; --------------060106030001060601030805--