diff options
author | Brad King <brad.king@kitware.com> | 2017-03-27 20:53:55 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2017-03-27 20:53:55 (GMT) |
commit | 85abc5f5aa5f8afbca88e7b3e1c919db49756ecb (patch) | |
tree | de024adb06fcf112b7fd5389e2bc96e0ad38e419 | |
parent | 8c94f5085d24bbc25f3f7fa421f7a62761a5515c (diff) | |
parent | 9dfccdc227f530997203ab9eb509a861f6718f59 (diff) | |
download | CMake-85abc5f5aa5f8afbca88e7b3e1c919db49756ecb.zip CMake-85abc5f5aa5f8afbca88e7b3e1c919db49756ecb.tar.gz CMake-85abc5f5aa5f8afbca88e7b3e1c919db49756ecb.tar.bz2 |
Merge branch 'libarchive-backport-zip-dir-fix' into release
-rw-r--r-- | Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c b/Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c index c50ba84..8df52c3 100644 --- a/Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c +++ b/Utilities/cmlibarchive/libarchive/archive_read_support_format_zip.c @@ -850,29 +850,33 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry, zip_entry->mode |= AE_IFREG; } - if ((zip_entry->mode & AE_IFMT) == 0) { - /* Especially in streaming mode, we can end up - here without having seen proper mode information. - Guess from the filename. */ + /* If the mode is totally empty, set some sane default. */ + if (zip_entry->mode == 0) { + zip_entry->mode |= 0664; + } + + /* Make sure that entries with a trailing '/' are marked as directories + * even if the External File Attributes contains bogus values. If this + * is not a directory and there is no type, assume regularfile. */ + if ((zip_entry->mode & AE_IFMT) != AE_IFDIR) { + int has_slash; + wp = archive_entry_pathname_w(entry); if (wp != NULL) { len = wcslen(wp); - if (len > 0 && wp[len - 1] == L'/') - zip_entry->mode |= AE_IFDIR; - else - zip_entry->mode |= AE_IFREG; + has_slash = len > 0 && wp[len - 1] == L'/'; } else { cp = archive_entry_pathname(entry); len = (cp != NULL)?strlen(cp):0; - if (len > 0 && cp[len - 1] == '/') - zip_entry->mode |= AE_IFDIR; - else - zip_entry->mode |= AE_IFREG; + has_slash = len > 0 && cp[len - 1] == '/'; } - if (zip_entry->mode == AE_IFDIR) { - zip_entry->mode |= 0775; - } else if (zip_entry->mode == AE_IFREG) { - zip_entry->mode |= 0664; + /* Correct file type as needed. */ + if (has_slash) { + zip_entry->mode &= ~AE_IFMT; + zip_entry->mode |= AE_IFDIR; + zip_entry->mode |= 0111; + } else if ((zip_entry->mode & AE_IFMT) == 0) { + zip_entry->mode |= AE_IFREG; } } |