summaryrefslogtreecommitdiff
path: root/libarchive/archive_read_support_filter_uu.c
diff options
context:
space:
mode:
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>2012-10-08 11:27:52 +0900
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>2012-10-08 11:45:38 +0900
commit664ea71debc6d0528f45da11ee0f1c937242aa83 (patch)
tree435cdbb3cbf6d4f1c432b7fe17a42fa028246dd6 /libarchive/archive_read_support_filter_uu.c
parentd2a08aeff989f0cbb66ea04344ac47d4ea1b0b68 (diff)
downloadlibarchive-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.c11
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");