diff --git a/contrib/libarchive/libarchive/archive_write_set_format_gnutar.c b/contrib/libarchive/libarchive/archive_write_set_format_gnutar.c index ec29c5c418e4..aca51da76017 100644 --- a/contrib/libarchive/libarchive/archive_write_set_format_gnutar.c +++ b/contrib/libarchive/libarchive/archive_write_set_format_gnutar.c @@ -634,8 +634,8 @@ archive_format_gnutar_header(struct archive_write *a, char h[512], memcpy(h + GNUTAR_gname_offset, p, copy_length); } - /* By truncating the mode here, we ensure it always fits. */ - format_octal(archive_entry_mode(entry) & 07777, + /* GNU tar mode allows base-256, all 16-bit mode_t values fit. */ + format_number(archive_entry_mode(entry), h + GNUTAR_mode_offset, GNUTAR_mode_size); /* GNU tar supports base-256 here, so should never overflow. */