summaryrefslogtreecommitdiffstats
path: root/lib/libarchive/test/read_open_memory.c
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2009-03-07 01:21:46 +0000
committerkientzle <kientzle@FreeBSD.org>2009-03-07 01:21:46 +0000
commit8639c01b4ddedbb4fe1e61353da07e3fab2f1939 (patch)
tree495a12527e15517f80bca36a3dbf276c64009315 /lib/libarchive/test/read_open_memory.c
parent61bb6e5d7404321b9f7e226e2ae72e9e6565f195 (diff)
downloadFreeBSD-src-8639c01b4ddedbb4fe1e61353da07e3fab2f1939.zip
FreeBSD-src-8639c01b4ddedbb4fe1e61353da07e3fab2f1939.tar.gz
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.
Diffstat (limited to 'lib/libarchive/test/read_open_memory.c')
-rw-r--r--lib/libarchive/test/read_open_memory.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/lib/libarchive/test/read_open_memory.c b/lib/libarchive/test/read_open_memory.c
index bae26b9..312e9ad 100644
--- a/lib/libarchive/test/read_open_memory.c
+++ b/lib/libarchive/test/read_open_memory.c
@@ -54,10 +54,30 @@ static ssize_t memory_read_skip(struct archive *, void *, size_t request);
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 *buff, size_t size, size_t read_size)
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));
}
/*
OpenPOWER on IntegriCloud