summaryrefslogtreecommitdiff
path: root/libarchive/archive_read_support_filter_uu.c
diff options
context:
space:
mode:
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>2011-07-17 11:32:04 -0400
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>2011-07-17 11:32:04 -0400
commita1f785ea9cdb67a08d23839e8098107aa2b01629 (patch)
treee2e520d115f72f3f0d535d85b71844b24dd04cc1 /libarchive/archive_read_support_filter_uu.c
parent3de335e1a015c830bc39267178c28f6b32855950 (diff)
downloadlibarchive-a1f785ea9cdb67a08d23839e8098107aa2b01629.tar.gz
Fix issue 163.
Correctly allocate enough memory for a input buffer saved. SVN-Revision: 3486
Diffstat (limited to 'libarchive/archive_read_support_filter_uu.c')
-rw-r--r--libarchive/archive_read_support_filter_uu.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/libarchive/archive_read_support_filter_uu.c b/libarchive/archive_read_support_filter_uu.c
index 12f42408..f9623ab2 100644
--- a/libarchive/archive_read_support_filter_uu.c
+++ b/libarchive/archive_read_support_filter_uu.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2009 Michihiro NAKAJIMA
+ * Copyright (c) 2009-2011 Michihiro NAKAJIMA
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -392,19 +392,30 @@ ensure_in_buff_size(struct archive_read_filter *self,
unsigned char *ptr;
size_t newsize;
- newsize = uudecode->in_allocated << 1;
+ /*
+ * Calculate a new buffer size for in_buff.
+ * Increase its value until it has enough size we need.
+ */
+ newsize = uudecode->in_allocated;
+ do {
+ if (newsize < IN_BUFF_SIZE*32)
+ newsize <<= 1;
+ else
+ newsize += IN_BUFF_SIZE;
+ } while (size > newsize);
+ /* Allocate the new buffer. */
ptr = malloc(newsize);
- if (ptr == NULL ||
- newsize < uudecode->in_allocated) {
+ if (ptr == NULL) {
free(ptr);
archive_set_error(&self->archive->archive,
ENOMEM,
"Can't allocate data for uudecode");
return (ARCHIVE_FATAL);
}
+ /* Move the remaining data in in_buff into the new buffer. */
if (uudecode->in_cnt)
- memmove(ptr, uudecode->in_buff,
- uudecode->in_cnt);
+ memmove(ptr, uudecode->in_buff, uudecode->in_cnt);
+ /* Replace in_buff with the new buffer. */
free(uudecode->in_buff);
uudecode->in_buff = ptr;
uudecode->in_allocated = newsize;