diff options
author | Michihiro NAKAJIMA <ggcueroad@gmail.com> | 2012-10-08 11:27:52 +0900 |
---|---|---|
committer | Michihiro NAKAJIMA <ggcueroad@gmail.com> | 2012-10-08 11:45:38 +0900 |
commit | 664ea71debc6d0528f45da11ee0f1c937242aa83 (patch) | |
tree | 435cdbb3cbf6d4f1c432b7fe17a42fa028246dd6 /libarchive/archive_read_support_filter_uu.c | |
parent | d2a08aeff989f0cbb66ea04344ac47d4ea1b0b68 (diff) | |
download | libarchive-664ea71debc6d0528f45da11ee0f1c937242aa83.tar.gz |
Improve compatibility to uudecode command.
Ignore junk data after an end sequence detected.
Diffstat (limited to 'libarchive/archive_read_support_filter_uu.c')
-rw-r--r-- | libarchive/archive_read_support_filter_uu.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/libarchive/archive_read_support_filter_uu.c b/libarchive/archive_read_support_filter_uu.c index 4afb5ae1..42223f1b 100644 --- a/libarchive/archive_read_support_filter_uu.c +++ b/libarchive/archive_read_support_filter_uu.c @@ -56,6 +56,7 @@ struct uudecode { #define ST_READ_UU 1 #define ST_UUEND 2 #define ST_READ_BASE64 3 +#define ST_IGNORE 4 }; static int uudecode_bidder_bid(struct archive_read_filter_bidder *, @@ -470,6 +471,10 @@ read_more: total = 0; out = uudecode->out_buff; ravail = avail_in; + if (uudecode->state == ST_IGNORE) { + used = avail_in; + goto finish; + } if (uudecode->in_cnt) { /* * If there is remaining data which is saved by @@ -491,6 +496,12 @@ read_more: len = get_line(b, avail_in - used, &nl); if (len < 0) { /* Non-ascii character is found. */ + if (uudecode->state == ST_FIND_HEAD && + (uudecode->total > 0 || total > 0)) { + uudecode->state = ST_IGNORE; + used = avail_in; + goto finish; + } archive_set_error(&self->archive->archive, ARCHIVE_ERRNO_MISC, "Insufficient compressed data"); |