diff options
author | Yoshihiro Takahashi <nyan@FreeBSD.org> | 2021-01-02 01:50:08 +0000 |
---|---|---|
committer | Yoshihiro Takahashi <nyan@FreeBSD.org> | 2021-01-02 01:50:08 +0000 |
commit | 0cdfa4956424dc816944a84568a4d9900b68f5e3 (patch) | |
tree | 117795555560811fa08df012e82120f1466dd3a2 /usr.bin/unzip | |
parent | bfe90bb336ccccded5ce51d72ed01ebfbb447337 (diff) | |
download | src-0cdfa4956424dc816944a84568a4d9900b68f5e3.tar.gz src-0cdfa4956424dc816944a84568a4d9900b68f5e3.zip |
unzip: Sync with NetBSD upstream.
- Ignore malformed directory entries as created by Dropbox ("/").
(rev 1.24)
- Use libarchive 3.x interface: check result for archive_read_free()
and don't call archive_read_close manually. (rev 1.23)
- Always overwrite symlinks on extraction, ever if they're newer than
entries in archive.
- Use getline() rather than getdelim().
PR: 231827
Submitted by: ak
Reviewed by: mm
Obtained from: NetBSD
MFC after: 2 weeks
Diffstat (limited to 'usr.bin/unzip')
-rw-r--r-- | usr.bin/unzip/unzip.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/usr.bin/unzip/unzip.c b/usr.bin/unzip/unzip.c index c9e53f27ed74..937176111a02 100644 --- a/usr.bin/unzip/unzip.c +++ b/usr.bin/unzip/unzip.c @@ -385,6 +385,13 @@ extract_dir(struct archive *a, struct archive_entry *e, const char *path) { int mode; + /* + * Dropbox likes to create '/' directory entries, just ignore + * such junk. + */ + if (*path == '\0') + return; + mode = archive_entry_mode(e) & 0777; if (mode == 0) mode = 0755; @@ -451,7 +458,7 @@ handle_existing_file(char **path) free(*path); *path = NULL; alen = 0; - len = getdelim(path, &alen, '\n', stdin); + len = getline(path, &alen, stdin); if ((*path)[len - 1] == '\n') (*path)[len - 1] = '\0'; return 0; @@ -601,7 +608,7 @@ recheck: if (lstat(*path, &sb) == 0) { if (u_opt || f_opt) { /* check if up-to-date */ - if ((S_ISREG(sb.st_mode) || S_ISLNK(sb.st_mode)) && + if (S_ISREG(sb.st_mode) && (sb.st_mtim.tv_sec > mtime.tv_sec || (sb.st_mtim.tv_sec == mtime.tv_sec && sb.st_mtim.tv_nsec >= mtime.tv_nsec))) @@ -916,8 +923,7 @@ unzip(const char *fn) } } - ac(archive_read_close(a)); - (void)archive_read_free(a); + ac(archive_read_free(a)); if (t_opt) { if (error_count > 0) { |