diff options
author | Michihiro NAKAJIMA <ggcueroad@gmail.com> | 2012-02-14 05:45:06 +0900 |
---|---|---|
committer | Michihiro NAKAJIMA <ggcueroad@gmail.com> | 2012-02-14 16:29:42 +0900 |
commit | f30dc311bafff055bbcfcb272834566e15fce4dd (patch) | |
tree | 98a9ba64a9cca385af29791091f2e2f1c91fbe1d /libarchive/archive_options.c | |
parent | 1ecb1bb23cc28c22e787f3bf5a65342bcb0f3282 (diff) | |
download | libarchive-f30dc311bafff055bbcfcb272834566e15fce4dd.tar.gz |
Fix issue 237.
Properly set a clear error message when archive_{write,read}_set_options failed.
Diffstat (limited to 'libarchive/archive_options.c')
-rw-r--r-- | libarchive/archive_options.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/libarchive/archive_options.c b/libarchive/archive_options.c index 962572c7..08a348fb 100644 --- a/libarchive/archive_options.c +++ b/libarchive/archive_options.c @@ -38,6 +38,7 @@ _archive_set_option(struct archive *a, int magic, const char *fn, option_handler use_option) { const char *mp, *op, *vp; + int r; archive_check_magic(a, magic, ARCHIVE_STATE_NEW, fn); @@ -47,10 +48,24 @@ _archive_set_option(struct archive *a, if (op == NULL && vp == NULL) return (ARCHIVE_OK); - if (op == NULL) + if (op == NULL) { + archive_set_error(a, ARCHIVE_ERRNO_MISC, "Empty option"); return (ARCHIVE_FAILED); + } - return use_option(a, mp, op, vp); + r = use_option(a, mp, op, vp); + if (r == ARCHIVE_WARN - 1) { + archive_set_error(a, ARCHIVE_ERRNO_MISC, + "Unknown module name: `%s'", mp); + return (ARCHIVE_FAILED); + } + if (r == ARCHIVE_WARN) { + archive_set_error(a, ARCHIVE_ERRNO_MISC, + "Undefined option: `%s%s%s%s%s%s'", + vp?"":"!", mp?mp:"", mp?":":"", op, vp?"=":"", vp?vp:""); + return (ARCHIVE_FAILED); + } + return (r); } int @@ -102,6 +117,25 @@ _archive_set_options(struct archive *a, const char *options, free(data); return (ARCHIVE_FATAL); } + if (r == ARCHIVE_FAILED && mod != NULL) { + free(data); + return (ARCHIVE_FAILED); + } + if (r == ARCHIVE_WARN - 1) { + /* The module name is wrong. */ + archive_set_error(a, ARCHIVE_ERRNO_MISC, + "Unknown module name: `%s'", mod); + free(data); + return (ARCHIVE_FAILED); + } + if (r == ARCHIVE_WARN) { + /* The option name is wrong. No-one used this. */ + archive_set_error(a, ARCHIVE_ERRNO_MISC, + "Undefined option: `%s%s%s'", + mod?mod:"", mod?":":"", opt); + free(data); + return (ARCHIVE_FAILED); + } if (r == ARCHIVE_OK) anyok = 1; else |