summaryrefslogtreecommitdiff
path: root/libarchive/archive_write_set_format_cpio_binary.c
diff options
context:
space:
mode:
authorTom Ivar Helbekkmo <tih@hamartun.priv.no>2021-03-06 10:09:53 +0100
committerTom Ivar Helbekkmo <tih@hamartun.priv.no>2021-03-06 10:09:53 +0100
commit809c2e466faa4ec6e60c6bf3f9b2a95dd2f6e4fc (patch)
tree268be9758d15614b7d12f5f54ac708d719486e51 /libarchive/archive_write_set_format_cpio_binary.c
parent0d2e5a0502100a83366d7a01e8c9962a19aa22e4 (diff)
downloadlibarchive-809c2e466faa4ec6e60c6bf3f9b2a95dd2f6e4fc.tar.gz
fix output format handling and symlink detection for PWB
Diffstat (limited to 'libarchive/archive_write_set_format_cpio_binary.c')
-rw-r--r--libarchive/archive_write_set_format_cpio_binary.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/libarchive/archive_write_set_format_cpio_binary.c b/libarchive/archive_write_set_format_cpio_binary.c
index 3f608c71..c1e2f65a 100644
--- a/libarchive/archive_write_set_format_cpio_binary.c
+++ b/libarchive/archive_write_set_format_cpio_binary.c
@@ -446,13 +446,19 @@ write_header(struct archive_write *a, struct archive_entry *entry)
h.h_mode = archive_entry_mode(entry);
if (((h.h_mode & AE_IFMT) == AE_IFSOCK) || ((h.h_mode & AE_IFMT) == AE_IFIFO)) {
archive_set_error(&a->archive, EINVAL,
- "sockets and fifos cannot be represented in the binary cpio format");
+ "sockets and fifos cannot be represented in the binary cpio formats");
ret_final = ARCHIVE_FATAL;
goto exit_write_header;
}
if (a->archive.archive_format == ARCHIVE_FORMAT_CPIO_PWB) {
- if (((h.h_mode & AE_IFMT) == AE_IFLNK) || ((h.h_mode & AE_IFMT) == AE_IFREG))
- h.h_mode &= (~AE_IFMT);
+ if ((h.h_mode & AE_IFMT) == AE_IFLNK) {
+ archive_set_error(&a->archive, EINVAL,
+ "symbolic links cannot be represented in the PWB cpio format");
+ ret_final = ARCHIVE_FATAL;
+ goto exit_write_header;
+ }
+ /* we could turn off AE_IFREG here, but it does no harm, */
+ /* and allows v7 cpio to read the entry without confusion */
}
h.h_mode = swap16(h.h_mode);