summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libarchive/archive_write_set_format_shar.c37
1 files changed, 26 insertions, 11 deletions
diff --git a/libarchive/archive_write_set_format_shar.c b/libarchive/archive_write_set_format_shar.c
index a6452abe..ba8fcd12 100644
--- a/libarchive/archive_write_set_format_shar.c
+++ b/libarchive/archive_write_set_format_shar.c
@@ -350,8 +350,10 @@ archive_write_shar_data_sed(struct archive_write *a, const void *buff, size_t n)
* twice before entering the loop, so make sure three additional
* bytes can be written.
*/
- if (archive_string_ensure(&shar->work, ensured + 3) == NULL)
- __archive_errx(1, "Out of memory");
+ if (archive_string_ensure(&shar->work, ensured + 3) == NULL) {
+ archive_set_error(&a->archive, ENOMEM, "Out of memory");
+ return (ARCHIVE_FATAL);
+ }
if (shar->work.length > ensured) {
ret = __archive_write_output(a, shar->work.s,
@@ -407,16 +409,18 @@ uuencode_group(const char _in[3], char out[4])
out[3] = UUENC( 0x3f & t );
}
-static void
-uuencode_line(struct shar *shar, const char *inbuf, size_t len)
+static int
+_uuencode_line(struct archive_write *a, struct shar *shar, const char *inbuf, size_t len)
{
char tmp_buf[3], *buf;
size_t alloc_len;
/* len <= 45 -> expanded to 60 + len byte + new line */
alloc_len = shar->work.length + 62;
- if (archive_string_ensure(&shar->work, alloc_len) == NULL)
- __archive_errx(1, "Out of memory");
+ if (archive_string_ensure(&shar->work, alloc_len) == NULL) {
+ archive_set_error(&a->archive, ENOMEM, "Out of memory");
+ return (ARCHIVE_FATAL);
+ }
buf = shar->work.s + shar->work.length;
*buf++ = UUENC(len);
@@ -437,11 +441,22 @@ uuencode_line(struct shar *shar, const char *inbuf, size_t len)
buf += 4;
}
*buf++ = '\n';
- if ((buf - shar->work.s) > (ptrdiff_t)(shar->work.length + 62))
- __archive_errx(1, "Buffer overflow");
+ if ((buf - shar->work.s) > (ptrdiff_t)(shar->work.length + 62)) {
+ archive_set_error(&a->archive,
+ ARCHIVE_ERRNO_MISC, "Buffer overflow");
+ return (ARCHIVE_FATAL);
+ }
shar->work.length = buf - shar->work.s;
+ return (ARCHIVE_OK);
}
+#define uuencode_line(__a, __shar, __inbuf, __len) \
+ do { \
+ int r = _uuencode_line(__a, __shar, __inbuf, __len); \
+ if (r != ARCHIVE_OK) \
+ return (ARCHIVE_FATAL); \
+ } while (0)
+
static ssize_t
archive_write_shar_data_uuencode(struct archive_write *a, const void *buff,
size_t length)
@@ -465,7 +480,7 @@ archive_write_shar_data_uuencode(struct archive_write *a, const void *buff,
shar->outpos += n;
return length;
}
- uuencode_line(shar, shar->outbuff, 45);
+ uuencode_line(a, shar, shar->outbuff, 45);
src += n;
n = length - n;
} else {
@@ -473,7 +488,7 @@ archive_write_shar_data_uuencode(struct archive_write *a, const void *buff,
}
while (n >= 45) {
- uuencode_line(shar, src, 45);
+ uuencode_line(a, shar, src, 45);
src += 45;
n -= 45;
@@ -507,7 +522,7 @@ archive_write_shar_finish_entry(struct archive_write *a)
/* Finish uuencoded data. */
if (shar->has_data) {
if (shar->outpos > 0)
- uuencode_line(shar, shar->outbuff,
+ uuencode_line(a, shar, shar->outbuff,
shar->outpos);
archive_strcat(&shar->work, "`\nend\n");
archive_strcat(&shar->work, "SHAR_END\n");