aboutsummaryrefslogtreecommitdiff
path: root/libarchive/archive_read_support_format_zip.c
diff options
context:
space:
mode:
authorMartin Matuska <mm@FreeBSD.org>2024-04-26 10:11:59 +0000
committerMartin Matuska <mm@FreeBSD.org>2024-04-26 10:11:59 +0000
commitd6f77d3cfa8e56aed99e2ea250fdb242f51747df (patch)
treec54748bd439b0fa85deafd8f4915301a16d1acd7 /libarchive/archive_read_support_format_zip.c
parenta509d68f27b9f114b876bbe3b9caa9d0ee0c5606 (diff)
Diffstat (limited to 'libarchive/archive_read_support_format_zip.c')
-rw-r--r--libarchive/archive_read_support_format_zip.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/libarchive/archive_read_support_format_zip.c b/libarchive/archive_read_support_format_zip.c
index 212bfff9fa7b..c9759eaf9a89 100644
--- a/libarchive/archive_read_support_format_zip.c
+++ b/libarchive/archive_read_support_format_zip.c
@@ -1393,7 +1393,7 @@ check_authentication_code(struct archive_read *a, const void *_p)
* [CRC32] [compressed low] [compressed high] [uncompressed low] [uncompressed high] [other PK marker]
* ```
* Since the 32-bit and 64-bit compressed sizes both match, the
- * actualy size must fit in 32 bits, which implies the high-order
+ * actual size must fit in 32 bits, which implies the high-order
* word of the compressed size is zero. So we know the uncompressed
* low word is zero, which again implies that if we accept the shorter
* format, there will not be a valid PK marker following it.
@@ -4083,6 +4083,17 @@ slurp_central_directory(struct archive_read *a, struct archive_entry* entry,
} else {
/* Generate resource fork name to find its
* resource file at zip->tree_rsrc. */
+
+ /* If this is an entry ending with slash,
+ * make the resource for name slash-less
+ * as the actual resource fork doesn't end with '/'.
+ */
+ size_t tmp_length = filename_length;
+ if (tmp_length > 0 && name[tmp_length - 1] == '/') {
+ tmp_length--;
+ r = rsrc_basename(name, tmp_length);
+ }
+
archive_strcpy(&(zip_entry->rsrcname),
"__MACOSX/");
archive_strncat(&(zip_entry->rsrcname),
@@ -4090,7 +4101,7 @@ slurp_central_directory(struct archive_read *a, struct archive_entry* entry,
archive_strcat(&(zip_entry->rsrcname), "._");
archive_strncat(&(zip_entry->rsrcname),
name + (r - name),
- filename_length - (r - name));
+ tmp_length - (r - name));
/* Register an entry to RB tree to sort it by
* file offset. */
__archive_rb_tree_insert_node(&zip->tree,