diff options
author | kientzle <kientzle@FreeBSD.org> | 2009-03-07 01:21:46 +0000 |
---|---|---|
committer | kientzle <kientzle@FreeBSD.org> | 2009-03-07 01:21:46 +0000 |
commit | 8639c01b4ddedbb4fe1e61353da07e3fab2f1939 (patch) | |
tree | 495a12527e15517f80bca36a3dbf276c64009315 /lib/libarchive/test/read_open_memory.c | |
parent | 61bb6e5d7404321b9f7e226e2ae72e9e6565f195 (diff) | |
download | FreeBSD-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.c | 28 |
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)); } /* |