diff options
author | Yoshihiro Takahashi <nyan@FreeBSD.org> | 2021-10-10 11:49:19 +0000 |
---|---|---|
committer | Yoshihiro Takahashi <nyan@FreeBSD.org> | 2021-10-10 11:49:19 +0000 |
commit | 2c614481fd5248c1685e713f67d40cf2d5fba494 (patch) | |
tree | 59db3e22ccf724d7d8aa6dcef95f569b51b26bcc /usr.bin/unzip | |
parent | b158d4d7a12fad8e9c4509466d5f1ebd15862d9f (diff) | |
download | src-2c614481fd5248c1685e713f67d40cf2d5fba494.tar.gz src-2c614481fd5248c1685e713f67d40cf2d5fba494.zip |
unzip: Fix segmentation fault if a zip file contains buggy filename.
PR: 259011
Reported by: Robert Morris
Submitted by: ak
MFC after:: 1 week
Diffstat (limited to 'usr.bin/unzip')
-rw-r--r-- | usr.bin/unzip/unzip.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/usr.bin/unzip/unzip.c b/usr.bin/unzip/unzip.c index e5ca1ff2c939..0b564b0f08ec 100644 --- a/usr.bin/unzip/unzip.c +++ b/usr.bin/unzip/unzip.c @@ -211,6 +211,9 @@ pathdup(const char *path) char *str; size_t i, len; + if (path == NULL || path[0] == '\0') + return (NULL); + len = strlen(path); while (len && path[len - 1] == '/') len--; @@ -697,7 +700,11 @@ extract(struct archive *a, struct archive_entry *e) mode_t filetype; char *p, *q; - pathname = pathdup(archive_entry_pathname(e)); + if ((pathname = pathdup(archive_entry_pathname(e))) == NULL) { + warningx("skipping empty or unreadable filename entry"); + ac(archive_read_data_skip(a)); + return; + } filetype = archive_entry_filetype(e); /* sanity checks */ @@ -760,7 +767,11 @@ extract_stdout(struct archive *a, struct archive_entry *e) char *pathname; mode_t filetype; - pathname = pathdup(archive_entry_pathname(e)); + if ((pathname = pathdup(archive_entry_pathname(e))) == NULL) { + warningx("skipping empty or unreadable filename entry"); + ac(archive_read_data_skip(a)); + return; + } filetype = archive_entry_filetype(e); /* I don't think this can happen in a zipfile.. */ |