diff options
author | Tom Ivar Helbekkmo <tih@hamartun.priv.no> | 2021-03-06 10:09:53 +0100 |
---|---|---|
committer | Tom Ivar Helbekkmo <tih@hamartun.priv.no> | 2021-03-06 10:09:53 +0100 |
commit | 809c2e466faa4ec6e60c6bf3f9b2a95dd2f6e4fc (patch) | |
tree | 268be9758d15614b7d12f5f54ac708d719486e51 /libarchive/archive_write_set_format_cpio_binary.c | |
parent | 0d2e5a0502100a83366d7a01e8c9962a19aa22e4 (diff) | |
download | libarchive-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.c | 12 |
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); |