summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2007-03-01 06:22:34 +0000
committerkientzle <kientzle@FreeBSD.org>2007-03-01 06:22:34 +0000
commitc00cd44eca5abca948f15cc5e1e5772003e71ea3 (patch)
tree20547f42903c25a22f7baef1ee353b35a41cfe60 /lib
parenta843fe0d3432844ab1942540ae5761afdaccccd9 (diff)
downloadFreeBSD-src-c00cd44eca5abca948f15cc5e1e5772003e71ea3.zip
FreeBSD-src-c00cd44eca5abca948f15cc5e1e5772003e71ea3.tar.gz
Because the buffer gets released immediately, I need to
copy the symlink target name, not just copy the reference. This problem sometimes caused crashes when extracting symlinks from ISO9660 images. Thanks to: Diego "Flameeyes" Pettenò
Diffstat (limited to 'lib')
-rw-r--r--lib/libarchive/archive_entry.c6
-rw-r--r--lib/libarchive/archive_entry.h1
-rw-r--r--lib/libarchive/archive_read_support_format_iso9660.c2
3 files changed, 8 insertions, 1 deletions
diff --git a/lib/libarchive/archive_entry.c b/lib/libarchive/archive_entry.c
index e3737a6..646f314 100644
--- a/lib/libarchive/archive_entry.c
+++ b/lib/libarchive/archive_entry.c
@@ -760,6 +760,12 @@ archive_entry_set_symlink(struct archive_entry *entry, const char *linkname)
}
void
+archive_entry_copy_symlink(struct archive_entry *entry, const char *linkname)
+{
+ aes_copy_mbs(&entry->ae_symlink, linkname);
+}
+
+void
archive_entry_copy_symlink_w(struct archive_entry *entry, const wchar_t *linkname)
{
aes_copy_wcs(&entry->ae_symlink, linkname);
diff --git a/lib/libarchive/archive_entry.h b/lib/libarchive/archive_entry.h
index 5e6c9fd..2604f86 100644
--- a/lib/libarchive/archive_entry.h
+++ b/lib/libarchive/archive_entry.h
@@ -130,6 +130,7 @@ void archive_entry_set_rdevmajor(struct archive_entry *, dev_t);
void archive_entry_set_rdevminor(struct archive_entry *, dev_t);
void archive_entry_set_size(struct archive_entry *, int64_t);
void archive_entry_set_symlink(struct archive_entry *, const char *);
+void archive_entry_copy_symlink(struct archive_entry *, const char *);
void archive_entry_copy_symlink_w(struct archive_entry *, const wchar_t *);
void archive_entry_set_uid(struct archive_entry *, uid_t);
void archive_entry_set_uname(struct archive_entry *, const char *);
diff --git a/lib/libarchive/archive_read_support_format_iso9660.c b/lib/libarchive/archive_read_support_format_iso9660.c
index 20c8ecc..a2dc6fd 100644
--- a/lib/libarchive/archive_read_support_format_iso9660.c
+++ b/lib/libarchive/archive_read_support_format_iso9660.c
@@ -378,7 +378,7 @@ archive_read_format_iso9660_read_header(struct archive *a,
archive_entry_set_pathname(entry,
build_pathname(&iso9660->pathname, file));
if (file->symlink.s != NULL)
- archive_entry_set_symlink(entry, file->symlink.s);
+ archive_entry_copy_symlink(entry, file->symlink.s);
/* If this entry points to the same data as the previous
* entry, convert this into a hardlink to that entry.
OpenPOWER on IntegriCloud