aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/unzip
diff options
context:
space:
mode:
authorYoshihiro Takahashi <nyan@FreeBSD.org>2021-10-10 11:49:19 +0000
committerYoshihiro Takahashi <nyan@FreeBSD.org>2021-10-10 11:49:19 +0000
commit2c614481fd5248c1685e713f67d40cf2d5fba494 (patch)
tree59db3e22ccf724d7d8aa6dcef95f569b51b26bcc /usr.bin/unzip
parentb158d4d7a12fad8e9c4509466d5f1ebd15862d9f (diff)
downloadsrc-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.c15
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.. */