Skip to content

Commit ebbb247

Browse files
committed
Fix two divergences with LLVM
These result in corrupt archives
1 parent 563333a commit ebbb247

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

src/archive.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,30 @@ pub enum ArchiveKind {
2020
}
2121

2222
pub(crate) mod big_archive {
23+
#[repr(C)]
24+
pub(crate) struct BigArMemHdrType {
25+
/// File member size in decimal
26+
size: [u8; 20],
27+
28+
/// Next member offset in decimal
29+
next_offset: [u8; 20],
30+
31+
/// Previous member offset in decimal
32+
prev_offset: [u8; 20],
33+
34+
last_modified: [u8; 12],
35+
36+
uid: [u8; 12],
37+
gid: [u8; 12],
38+
39+
access_mode: [u8; 12],
40+
41+
/// File member name length in decimal
42+
name_len: [u8; 4],
43+
44+
terminator: [u8; 2],
45+
}
46+
2347
/// Fixed-Length Header.
2448
#[repr(C)]
2549
pub(crate) struct FixLenHdr {

src/archive_writer.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ fn print_big_archive_member_header<W: Write>(
115115
) -> io::Result<()> {
116116
write!(
117117
w,
118-
"{:<20}{:<20}{:<20}{:<12}{:<12}{:<12}{:12o}{:<4}",
118+
"{:<20}{:<20}{:<20}{:<12}{:<12}{:<12}{:<12o}{:<4}",
119119
size,
120120
next_offset,
121121
prev_offset,
@@ -537,7 +537,7 @@ fn compute_member_data<'a, S: Write + Seek>(
537537

538538
if is_aix_big_archive(kind) {
539539
let next_offset = pos
540-
+ u64::try_from(std::mem::size_of::<big_archive::FixLenHdr>()).unwrap()
540+
+ u64::try_from(std::mem::size_of::<big_archive::BigArMemHdrType>()).unwrap()
541541
+ align_to(u64::try_from(m.member_name.len()).unwrap(), 2)
542542
+ align_to(size, 2);
543543
print_big_archive_member_header(
@@ -710,7 +710,7 @@ pub fn write_archive_to_stream<W: Write + Seek>(
710710
member_names.push(&member.member_name);
711711
// File member name ended with "`\n". The length is included in
712712
// BigArMemHdrType.
713-
member_end_offset += u64::try_from(std::mem::size_of::<big_archive::FixLenHdr>())
713+
member_end_offset += u64::try_from(std::mem::size_of::<big_archive::BigArMemHdrType>())
714714
.unwrap()
715715
+ align_to(u64::try_from(data[i].data.len()).unwrap(), 2)
716716
+ align_to(u64::try_from(member.member_name.len()).unwrap(), 2);
@@ -723,7 +723,7 @@ pub fn write_archive_to_stream<W: Write + Seek>(
723723
let global_symbol_offset = if write_symtab && num_syms > 0 {
724724
last_member_end_offset
725725
+ align_to(
726-
u64::try_from(std::mem::size_of::<big_archive::FixLenHdr>()).unwrap()
726+
u64::try_from(std::mem::size_of::<big_archive::BigArMemHdrType>()).unwrap()
727727
+ member_table_size,
728728
2,
729729
)

0 commit comments

Comments
 (0)