Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 02 Oct 2005 20:20:56 -0700
From:      Tim Kientzle <kientzle@freebsd.org>
To:        Juergen Lock <nox@jelal.kn-bremen.de>
Cc:        Craig Rodrigues <rodrigc@freebsd.org>, freebsd-bugs@freebsd.org, kientzle@freebsd.org
Subject:   Re: bin/86690: bsdtar sparse file problems
Message-ID:  <4340A398.900@freebsd.org>
In-Reply-To: <20051001181537.GA69885@saturn.kn-bremen.de>
References:  <200509300010.j8U0AJon030993@freefall.freebsd.org> <20050930202618.GA42971@saturn.kn-bremen.de> <433E18F8.4000106@kientzle.com> <20051001181537.GA69885@saturn.kn-bremen.de>

next in thread | previous in thread | raw e-mail | index | archive | help
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--




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4340A398.900>