diff options
author | kientzle <kientzle@FreeBSD.org> | 2006-11-15 05:14:20 +0000 |
---|---|---|
committer | kientzle <kientzle@FreeBSD.org> | 2006-11-15 05:14:20 +0000 |
commit | 8c58f2d4e886683f06f5018c49ab1c29b9a64302 (patch) | |
tree | 26d9c2a2e2f3ef0e43a46c1ba47b7fb7dad859f4 /lib | |
parent | 0cea6ebe6fec73e12ddd70734e98196884ed7fa9 (diff) | |
download | FreeBSD-src-8c58f2d4e886683f06f5018c49ab1c29b9a64302.zip FreeBSD-src-8c58f2d4e886683f06f5018c49ab1c29b9a64302.tar.gz |
Change the internal API for writing data to an entry; make the
internal format-specific functions return the same as the public
function, so that the public API layer doesn't have to guess the
correct return value. This addresses an obscure problem that occurs
when someone tries to write more data than the size of the entry (as
indicated in the entry header). In this case, the return value from
archive_write_data() was incorrect, reflecting the requested write
rather than the amount actually written.
MFC after: 15 days
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libarchive/archive_private.h | 2 | ||||
-rw-r--r-- | lib/libarchive/archive_write.c | 4 | ||||
-rw-r--r-- | lib/libarchive/archive_write_set_format_cpio.c | 9 | ||||
-rw-r--r-- | lib/libarchive/archive_write_set_format_pax.c | 9 | ||||
-rw-r--r-- | lib/libarchive/archive_write_set_format_shar.c | 15 | ||||
-rw-r--r-- | lib/libarchive/archive_write_set_format_ustar.c | 8 |
6 files changed, 28 insertions, 19 deletions
diff --git a/lib/libarchive/archive_private.h b/lib/libarchive/archive_private.h index 9e02856..cc63c1e 100644 --- a/lib/libarchive/archive_private.h +++ b/lib/libarchive/archive_private.h @@ -182,7 +182,7 @@ struct archive { int (*format_finish_entry)(struct archive *); int (*format_write_header)(struct archive *, struct archive_entry *); - int (*format_write_data)(struct archive *, + ssize_t (*format_write_data)(struct archive *, const void *buff, size_t); /* diff --git a/lib/libarchive/archive_write.c b/lib/libarchive/archive_write.c index 148f6b5..aa50c70 100644 --- a/lib/libarchive/archive_write.c +++ b/lib/libarchive/archive_write.c @@ -271,9 +271,7 @@ archive_write_header(struct archive *a, struct archive_entry *entry) int archive_write_data(struct archive *a, const void *buff, size_t s) { - int ret; __archive_check_magic(a, ARCHIVE_WRITE_MAGIC, ARCHIVE_STATE_DATA, "archive_write_data"); archive_string_empty(&a->error_string); - ret = (a->format_write_data)(a, buff, s); - return (ret == ARCHIVE_OK ? (ssize_t)s : -1); + return ((a->format_write_data)(a, buff, s)); } diff --git a/lib/libarchive/archive_write_set_format_cpio.c b/lib/libarchive/archive_write_set_format_cpio.c index 224f9cf..fc558b6 100644 --- a/lib/libarchive/archive_write_set_format_cpio.c +++ b/lib/libarchive/archive_write_set_format_cpio.c @@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$"); #include "archive_entry.h" #include "archive_private.h" -static int archive_write_cpio_data(struct archive *, const void *buff, +static ssize_t archive_write_cpio_data(struct archive *, const void *buff, size_t s); static int archive_write_cpio_finish(struct archive *); static int archive_write_cpio_finish_entry(struct archive *); @@ -167,7 +167,7 @@ archive_write_cpio_header(struct archive *a, struct archive_entry *entry) return (ret); } -static int +static ssize_t archive_write_cpio_data(struct archive *a, const void *buff, size_t s) { struct cpio *cpio; @@ -179,7 +179,10 @@ archive_write_cpio_data(struct archive *a, const void *buff, size_t s) ret = (a->compression_write)(a, buff, s); cpio->entry_bytes_remaining -= s; - return (ret); + if (ret >= 0) + return (s); + else + return (ret); } /* diff --git a/lib/libarchive/archive_write_set_format_pax.c b/lib/libarchive/archive_write_set_format_pax.c index 81a43b7..657a720 100644 --- a/lib/libarchive/archive_write_set_format_pax.c +++ b/lib/libarchive/archive_write_set_format_pax.c @@ -70,7 +70,7 @@ static void add_pax_attr_time(struct archive_string *, unsigned long nanos); static void add_pax_attr_w(struct archive_string *, const char *key, const wchar_t *wvalue); -static int archive_write_pax_data(struct archive *, +static ssize_t archive_write_pax_data(struct archive *, const void *, size_t); static int archive_write_pax_finish(struct archive *); static int archive_write_pax_finish_entry(struct archive *); @@ -1081,7 +1081,7 @@ write_nulls(struct archive *a, size_t padding) return (ARCHIVE_OK); } -static int +static ssize_t archive_write_pax_data(struct archive *a, const void *buff, size_t s) { struct pax *pax; @@ -1094,7 +1094,10 @@ archive_write_pax_data(struct archive *a, const void *buff, size_t s) ret = (a->compression_write)(a, buff, s); pax->entry_bytes_remaining -= s; - return (ret); + if (ret == ARCHIVE_OK) + return (s); + else + return (ret); } static int diff --git a/lib/libarchive/archive_write_set_format_shar.c b/lib/libarchive/archive_write_set_format_shar.c index fd451e3..88b1384 100644 --- a/lib/libarchive/archive_write_set_format_shar.c +++ b/lib/libarchive/archive_write_set_format_shar.c @@ -64,9 +64,9 @@ struct shar { static int archive_write_shar_finish(struct archive *); static int archive_write_shar_header(struct archive *, struct archive_entry *); -static int archive_write_shar_data_sed(struct archive *, +static ssize_t archive_write_shar_data_sed(struct archive *, const void * buff, size_t); -static int archive_write_shar_data_uuencode(struct archive *, +static ssize_t archive_write_shar_data_uuencode(struct archive *, const void * buff, size_t); static int archive_write_shar_finish_entry(struct archive *); static int shar_printf(struct archive *, const char *fmt, ...); @@ -323,12 +323,13 @@ archive_write_shar_header(struct archive *a, struct archive_entry *entry) } /* XXX TODO: This could be more efficient XXX */ -static int +static ssize_t archive_write_shar_data_sed(struct archive *a, const void *buff, size_t n) { struct shar *shar; const char *src; int ret; + int written = n; shar = (struct shar *)a->format_data; if (!shar->has_data) @@ -357,7 +358,9 @@ archive_write_shar_data_sed(struct archive *a, const void *buff, size_t n) if (shar->outpos > 0) ret = (a->compression_write)(a, shar->outbuff, shar->outpos); - return (ret); + if (ret != ARCHIVE_OK) + return (ret); + return (written); } #define UUENC(c) (((c)!=0) ? ((c) & 077) + ' ': '`') @@ -384,7 +387,7 @@ uuencode_group(struct shar *shar) shar->outbuff[shar->outpos] = 0; } -static int +static ssize_t archive_write_shar_data_uuencode(struct archive *a, const void *buff, size_t length) { @@ -413,7 +416,7 @@ archive_write_shar_data_uuencode(struct archive *a, const void *buff, shar->uubuffer[shar->uuavail++] = *src++; shar->outbytes++; } - return (ARCHIVE_OK); + return (length); } static int diff --git a/lib/libarchive/archive_write_set_format_ustar.c b/lib/libarchive/archive_write_set_format_ustar.c index 0a443fb..53ef37b 100644 --- a/lib/libarchive/archive_write_set_format_ustar.c +++ b/lib/libarchive/archive_write_set_format_ustar.c @@ -113,7 +113,7 @@ static const struct archive_entry_header_ustar template_header = { { "" } /* padding */ }; -static int archive_write_ustar_data(struct archive *a, const void *buff, +static ssize_t archive_write_ustar_data(struct archive *a, const void *buff, size_t s); static int archive_write_ustar_finish(struct archive *); static int archive_write_ustar_finish_entry(struct archive *); @@ -493,7 +493,7 @@ write_nulls(struct archive *a, size_t padding) return (ARCHIVE_OK); } -static int +static ssize_t archive_write_ustar_data(struct archive *a, const void *buff, size_t s) { struct ustar *ustar; @@ -504,5 +504,7 @@ archive_write_ustar_data(struct archive *a, const void *buff, size_t s) s = ustar->entry_bytes_remaining; ret = (a->compression_write)(a, buff, s); ustar->entry_bytes_remaining -= s; - return (ret); + if (ret != ARCHIVE_OK) + return (ret); + return (s); } |