diff options
author | Michihiro NAKAJIMA <ggcueroad@gmail.com> | 2011-07-17 11:32:04 -0400 |
---|---|---|
committer | Michihiro NAKAJIMA <ggcueroad@gmail.com> | 2011-07-17 11:32:04 -0400 |
commit | a1f785ea9cdb67a08d23839e8098107aa2b01629 (patch) | |
tree | e2e520d115f72f3f0d535d85b71844b24dd04cc1 /libarchive/archive_read_support_filter_uu.c | |
parent | 3de335e1a015c830bc39267178c28f6b32855950 (diff) | |
download | libarchive-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.c | 23 |
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; |