svn commit: r189472 - in head/lib/libarchive: . test

Tim Kientzle kientzle at FreeBSD.org
Fri Mar 6 17:21:47 PST 2009


Author: kientzle
Date: Sat Mar  7 01:21:46 2009
New Revision: 189472
URL: http://svn.freebsd.org/changeset/base/189472

Log:
  Merge r714,r715 from libarchive.googlecode.com: Fix Debian bug #516577.
  Don't crash if client does not provide a skip function.  Extend one
  of the test cases to use archive_read_open2() with only a read callback.

Modified:
  head/lib/libarchive/archive_read.c
  head/lib/libarchive/test/read_open_memory.c
  head/lib/libarchive/test/test.h
  head/lib/libarchive/test/test_read_pax_truncated.c

Modified: head/lib/libarchive/archive_read.c
==============================================================================
--- head/lib/libarchive/archive_read.c	Sat Mar  7 01:18:30 2009	(r189471)
+++ head/lib/libarchive/archive_read.c	Sat Mar  7 01:21:46 2009	(r189472)
@@ -234,6 +234,8 @@ static int64_t
 client_skip_proxy(struct archive_read_filter *self, int64_t request)
 {
 	int64_t r;
+	if (self->archive->client.skipper == NULL)
+		return (0);
 	r = (self->archive->client.skipper)(&self->archive->archive,
 	    self->data, request);
 	self->archive->archive.raw_position += r;

Modified: head/lib/libarchive/test/read_open_memory.c
==============================================================================
--- head/lib/libarchive/test/read_open_memory.c	Sat Mar  7 01:18:30 2009	(r189471)
+++ head/lib/libarchive/test/read_open_memory.c	Sat Mar  7 01:21:46 2009	(r189472)
@@ -54,10 +54,30 @@ static ssize_t	memory_read_skip(struct a
 static off_t	memory_read_skip(struct archive *, void *, off_t request);
 #endif
 static ssize_t	memory_read(struct archive *, void *, const void **buff);
+static int	read_open_memory_internal(struct archive *a, void *buff,
+    size_t size, size_t read_size, int fullapi);
+
 
 int
 read_open_memory(struct archive *a, void *buff, size_t size, size_t read_size)
 {
+	return read_open_memory_internal(a, buff, size, read_size, 1);
+}
+
+/*
+ * As above, but don't register any optional part of the API, to verify
+ * that internals work correctly with just the minimal entry points.
+ */
+int
+read_open_memory2(struct archive *a, void *buff, size_t size, size_t read_size)
+{
+	return read_open_memory_internal(a, buff, size, read_size, 0);
+}
+
+static int
+read_open_memory_internal(struct archive *a, void *buff,
+    size_t size, size_t read_size, int fullapi)
+{
 	struct read_memory_data *mine;
 
 	mine = (struct read_memory_data *)malloc(sizeof(*mine));
@@ -71,8 +91,12 @@ read_open_memory(struct archive *a, void
 	mine->read_size = read_size;
 	mine->copy_buff_size = read_size + 64;
 	mine->copy_buff = malloc(mine->copy_buff_size);
-	return (archive_read_open2(a, mine, memory_read_open,
-		    memory_read, memory_read_skip, memory_read_close));
+	if (fullapi)
+		return (archive_read_open2(a, mine, memory_read_open,
+			    memory_read, memory_read_skip, memory_read_close));
+	else
+		return (archive_read_open2(a, mine, NULL,
+			    memory_read, NULL, NULL));
 }
 
 /*

Modified: head/lib/libarchive/test/test.h
==============================================================================
--- head/lib/libarchive/test/test.h	Sat Mar  7 01:18:30 2009	(r189471)
+++ head/lib/libarchive/test/test.h	Sat Mar  7 01:21:46 2009	(r189472)
@@ -166,6 +166,8 @@ void extract_reference_file(const char *
 
 /* Special customized read-from-memory interface. */
 int read_open_memory(struct archive *, void *, size_t, size_t);
+/* "2" version exercises a slightly different set of libarchive APIs. */
+int read_open_memory2(struct archive *, void *, size_t, size_t);
 
 /*
  * ARCHIVE_VERSION_STAMP first appeared in 1.9 and libarchive 2.2.4.

Modified: head/lib/libarchive/test/test_read_pax_truncated.c
==============================================================================
--- head/lib/libarchive/test/test_read_pax_truncated.c	Sat Mar  7 01:18:30 2009	(r189471)
+++ head/lib/libarchive/test/test_read_pax_truncated.c	Sat Mar  7 01:21:46 2009	(r189472)
@@ -72,7 +72,7 @@ DEFINE_TEST(test_read_pax_truncated)
 		assert((a = archive_read_new()) != NULL);
 		assertA(0 == archive_read_support_format_all(a));
 		assertA(0 == archive_read_support_compression_all(a));
-		assertA(0 == read_open_memory(a, buff, i, 13));
+		assertA(0 == read_open_memory2(a, buff, i, 13));
 
 		if (i < 1536) {
 			assertEqualIntA(a, ARCHIVE_FATAL, archive_read_next_header(a, &ae));


More information about the svn-src-head mailing list