Skip to content

Commit 627c7d8

Browse files
committed
Fix for new rustc warnings
* Remove all `#[repr(packed)]` on the IMAGE structs due to a misunderstanding of the Windows.h struct definitions: Only the old 16-bit headers want 2 byte packing, all the others want 4 byte packing. However all of these structs end up already aligned anyway. Safeguard their implementation by asserting their sizes. Fixes rust-lang/rust#46043 * Explicitly specify the raw pointer type when casting from reference and calling a method on it. Fixes rust-lang/rust#46906
1 parent 23b6958 commit 627c7d8

File tree

3 files changed

+77
-27
lines changed

3 files changed

+77
-27
lines changed

src/image.rs

Lines changed: 73 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ pub fn image_base() -> &'static IMAGE_DOS_HEADER {
5454

5555
pub const IMAGE_DOS_SIGNATURE: u16 = 0x5A4D;
5656

57-
#[repr(C, packed)]
57+
#[derive(Copy, Clone)]
58+
#[repr(C)]
5859
pub struct IMAGE_DOS_HEADER {
5960
pub e_magic: u16,
6061
pub e_cblp: u16,
@@ -99,7 +100,8 @@ pub const IMAGE_FILE_DLL: u16 = 0x2000;
99100
pub const IMAGE_FILE_UP_SYSTEM_ONLY: u16 = 0x4000;
100101
pub const IMAGE_FILE_BYTES_REVERSED_HI: u16 = 0x8000;
101102

102-
#[repr(C, packed)]
103+
#[derive(Copy, Clone)]
104+
#[repr(C)]
103105
pub struct IMAGE_FILE_HEADER {
104106
pub Machine: u16,
105107
pub NumberOfSections: u16,
@@ -112,7 +114,8 @@ pub struct IMAGE_FILE_HEADER {
112114

113115
//----------------------------------------------------------------
114116

115-
#[repr(C, packed)]
117+
#[derive(Copy, Clone)]
118+
#[repr(C)]
116119
pub struct IMAGE_DATA_DIRECTORY {
117120
pub VirtualAddress: u32,
118121
pub Size: u32,
@@ -168,7 +171,8 @@ pub const IMAGE_DLLCHARACTERISTICS_WDM_DRIVER: u16 = 0x2000;
168171
pub const IMAGE_DLLCHARACTERISTICS_GUARD_CF: u16 = 0x4000;
169172
pub const IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE: u16 = 0x8000;
170173

171-
#[repr(C, packed)]
174+
#[derive(Copy, Clone)]
175+
#[repr(C)]
172176
pub struct IMAGE_OPTIONAL_HEADER32 {
173177
pub Magic: u16,
174178
pub MajorLinkerVersion: u8,
@@ -203,7 +207,8 @@ pub struct IMAGE_OPTIONAL_HEADER32 {
203207
pub DataDirectory: [IMAGE_DATA_DIRECTORY; IMAGE_NUMBEROF_DIRECTORY_ENTRIES],
204208
}
205209

206-
#[repr(C, packed)]
210+
#[derive(Copy, Clone)]
211+
#[repr(C)]
207212
pub struct IMAGE_OPTIONAL_HEADER64 {
208213
pub Magic: u16,
209214
pub MajorLinkerVersion: u8,
@@ -241,14 +246,16 @@ pub struct IMAGE_OPTIONAL_HEADER64 {
241246

242247
pub const IMAGE_NT_HEADERS_SIGNATURE: u32 = 0x00004550;
243248

244-
#[repr(C, packed)]
249+
#[derive(Copy, Clone)]
250+
#[repr(C)]
245251
pub struct IMAGE_NT_HEADERS32 {
246252
pub Signature: u32,
247253
pub FileHeader: IMAGE_FILE_HEADER,
248254
pub OptionalHeader: IMAGE_OPTIONAL_HEADER32,
249255
}
250256

251-
#[repr(C, packed)]
257+
#[derive(Copy, Clone)]
258+
#[repr(C)]
252259
pub struct IMAGE_NT_HEADERS64 {
253260
pub Signature: u32,
254261
pub FileHeader: IMAGE_FILE_HEADER,
@@ -295,7 +302,8 @@ pub const IMAGE_SCN_MEM_EXECUTE: u32 = 0x20000000;
295302
pub const IMAGE_SCN_MEM_READ: u32 = 0x40000000;
296303
pub const IMAGE_SCN_MEM_WRITE: u32 = 0x80000000;
297304

298-
#[repr(C, packed)]
305+
#[derive(Copy, Clone)]
306+
#[repr(C)]
299307
pub struct IMAGE_SECTION_HEADER {
300308
pub Name: [u8; IMAGE_SIZEOF_SHORT_NAME],
301309
pub VirtualSize: u32,
@@ -311,7 +319,8 @@ pub struct IMAGE_SECTION_HEADER {
311319

312320
//----------------------------------------------------------------
313321

314-
#[repr(C, packed)]
322+
#[derive(Copy, Clone)]
323+
#[repr(C)]
315324
pub struct IMAGE_EXPORT_DIRECTORY {
316325
pub Characteristics: u32,
317326
pub TimeDateStamp: u32,
@@ -328,7 +337,8 @@ pub struct IMAGE_EXPORT_DIRECTORY {
328337

329338
//----------------------------------------------------------------
330339

331-
#[repr(C, packed)]
340+
#[derive(Copy, Clone)]
341+
#[repr(C)]
332342
pub struct IMAGE_IMPORT_DESCRIPTOR {
333343
pub OriginalFirstThunk: u32,
334344
pub TimeDateStamp: u32,
@@ -369,7 +379,8 @@ pub const RT_ANIICON: u16 = 22;
369379
pub const RT_HTML: u16 = 23;
370380
pub const RT_MANIFEST: u16 = 24;
371381

372-
#[repr(C, packed)]
382+
#[derive(Copy, Clone)]
383+
#[repr(C)]
373384
pub struct IMAGE_RESOURCE_DIRECTORY {
374385
pub Characteristics: u32,
375386
pub TimeDateStamp: u32,
@@ -379,7 +390,8 @@ pub struct IMAGE_RESOURCE_DIRECTORY {
379390
pub NumberOfIdEntries: u16,
380391
}
381392

382-
#[repr(C, packed)]
393+
#[derive(Copy, Clone)]
394+
#[repr(C)]
383395
pub struct IMAGE_RESOURCE_DIRECTORY_ENTRY {
384396
// High bit set means the lower 31 bits are an RVA to its name string otherwise this is a 16 bit WORD id
385397
// Name string is encoded in WORDs and is prefixed with a WORD indicating its length (in WORDs)
@@ -388,7 +400,8 @@ pub struct IMAGE_RESOURCE_DIRECTORY_ENTRY {
388400
pub Offset: u32,
389401
}
390402

391-
#[repr(C, packed)]
403+
#[derive(Copy, Clone)]
404+
#[repr(C)]
392405
pub struct IMAGE_RESOURCE_DATA_ENTRY {
393406
pub OffsetToData: u32,
394407
pub Size: u32,
@@ -419,7 +432,8 @@ pub const IMAGE_REL_BASED_MIPSJMPADDR16: u8 = 9;
419432
pub const IMAGE_REL_BASED_ARM_MOV32: u8 = 5;
420433
pub const IMAGE_REL_BASED_THUMB_MOV32: u8 = 7;
421434

422-
#[repr(C, packed)]
435+
#[derive(Copy, Clone)]
436+
#[repr(C)]
423437
pub struct IMAGE_BASE_RELOCATION {
424438
pub VirtualAddress: u32,
425439
pub SizeOfBlock: u32,
@@ -429,12 +443,14 @@ pub struct IMAGE_BASE_RELOCATION {
429443
// It is immediately followed by a number of `WORD`s representing a bit field:
430444
// |0123|456789ABCDEF|
431445
// |Type| Offset |
432-
#[repr(C, packed)]
446+
#[derive(Copy, Clone)]
447+
#[repr(C)]
433448
pub struct IMAGE_BASE_RELOC_TYPEOFFSET(pub u16);
434449

435450
//----------------------------------------------------------------
436451

437-
#[repr(C, packed)]
452+
#[derive(Copy, Clone)]
453+
#[repr(C)]
438454
pub struct IMAGE_TLS_DIRECTORY32 {
439455
pub StartAddressOfRawData: u32,
440456
pub EndAddressOfRawData: u32,
@@ -444,7 +460,8 @@ pub struct IMAGE_TLS_DIRECTORY32 {
444460
pub Characteristics: u32,
445461
}
446462

447-
#[repr(C, packed)]
463+
#[derive(Copy, Clone)]
464+
#[repr(C)]
448465
pub struct IMAGE_TLS_DIRECTORY64 {
449466
pub StartAddressOfRawData: u64,
450467
pub EndAddressOfRawData: u64,
@@ -457,8 +474,8 @@ pub struct IMAGE_TLS_DIRECTORY64 {
457474
//----------------------------------------------------------------
458475
// Sourced from http://www.debuginfo.com/articles/debuginfomatch.html
459476

460-
#[derive(Clone, PartialEq, Eq)]
461-
#[repr(C, packed)]
477+
#[derive(Copy, Clone, PartialEq, Eq)]
478+
#[repr(C)]
462479
pub struct GUID {
463480
pub Data1: u32,
464481
pub Data2: u16,
@@ -478,7 +495,8 @@ pub const IMAGE_DEBUG_TYPE_OMAP_FROM_SRC: u32 = 8;
478495
pub const IMAGE_DEBUG_TYPE_BORLAND: u32 = 9;
479496
pub const IMAGE_DEBUG_TYPE_CLSID: u32 = 11;
480497

481-
#[repr(C, packed)]
498+
#[derive(Copy, Clone)]
499+
#[repr(C)]
482500
pub struct IMAGE_DEBUG_DIRECTORY {
483501
pub Characteristics: u32,
484502
pub TimeDateStamp: u32,
@@ -490,7 +508,8 @@ pub struct IMAGE_DEBUG_DIRECTORY {
490508
pub PointerToRawData: u32,
491509
}
492510

493-
#[repr(C, packed)]
511+
#[derive(Copy, Clone)]
512+
#[repr(C)]
494513
pub struct IMAGE_DEBUG_CV_INFO_PDB20 {
495514
pub CvSignature: u32,
496515
pub Offset: u32,
@@ -499,7 +518,8 @@ pub struct IMAGE_DEBUG_CV_INFO_PDB20 {
499518
pub PdbFileName: [u8; 0],
500519
}
501520

502-
#[repr(C, packed)]
521+
#[derive(Copy, Clone)]
522+
#[repr(C)]
503523
pub struct IMAGE_DEBUG_CV_INFO_PDB70 {
504524
pub CvSignature: u32,
505525
pub Signature: GUID,
@@ -509,7 +529,8 @@ pub struct IMAGE_DEBUG_CV_INFO_PDB70 {
509529

510530
pub const IMAGE_DEBUG_MISC_EXENAME: u32 = 1;
511531

512-
#[repr(C, packed)]
532+
#[derive(Copy, Clone)]
533+
#[repr(C)]
513534
pub struct IMAGE_DEBUG_MISC {
514535
pub DataType: u32,
515536
pub Length: u32,
@@ -544,3 +565,32 @@ unsafe impl Pod for IMAGE_DEBUG_DIRECTORY {}
544565
unsafe impl Pod for IMAGE_DEBUG_CV_INFO_PDB20 {}
545566
unsafe impl Pod for IMAGE_DEBUG_CV_INFO_PDB70 {}
546567
unsafe impl Pod for IMAGE_DEBUG_MISC {}
568+
569+
570+
//----------------------------------------------------------------
571+
572+
#[test]
573+
fn sizes() {
574+
use std::mem::size_of;
575+
assert_eq!(64, size_of::<IMAGE_DOS_HEADER>());
576+
assert_eq!(20, size_of::<IMAGE_FILE_HEADER>());
577+
assert_eq!(8, size_of::<IMAGE_DATA_DIRECTORY>());
578+
assert_eq!(224, size_of::<IMAGE_OPTIONAL_HEADER32>());
579+
assert_eq!(240, size_of::<IMAGE_OPTIONAL_HEADER64>());
580+
assert_eq!(248, size_of::<IMAGE_NT_HEADERS32>());
581+
assert_eq!(264, size_of::<IMAGE_NT_HEADERS64>());
582+
assert_eq!(40, size_of::<IMAGE_SECTION_HEADER>());
583+
assert_eq!(40, size_of::<IMAGE_EXPORT_DIRECTORY>());
584+
assert_eq!(20, size_of::<IMAGE_IMPORT_DESCRIPTOR>());
585+
assert_eq!(16, size_of::<IMAGE_RESOURCE_DIRECTORY>());
586+
assert_eq!(8, size_of::<IMAGE_RESOURCE_DIRECTORY_ENTRY>());
587+
assert_eq!(16, size_of::<IMAGE_RESOURCE_DATA_ENTRY>());
588+
assert_eq!(8, size_of::<IMAGE_BASE_RELOCATION>());
589+
assert_eq!(24, size_of::<IMAGE_TLS_DIRECTORY32>());
590+
assert_eq!(40, size_of::<IMAGE_TLS_DIRECTORY64>());
591+
assert_eq!(16, size_of::<GUID>());
592+
assert_eq!(28, size_of::<IMAGE_DEBUG_DIRECTORY>());
593+
assert_eq!(16, size_of::<IMAGE_DEBUG_CV_INFO_PDB20>()); // Unsized
594+
assert_eq!(24, size_of::<IMAGE_DEBUG_CV_INFO_PDB70>()); // Unsized
595+
assert_eq!(12, size_of::<IMAGE_DEBUG_MISC>()); // Unsized
596+
}

src/pe64/base_relocs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ impl<'a, P: Pe<'a> + Copy> Block<'a, P> {
115115
/// Gets the types and offsets.
116116
pub fn words(&self) -> &'a [IMAGE_BASE_RELOC_TYPEOFFSET] {
117117
unsafe {
118-
let p = (self.image as *const _).offset(1) as *const IMAGE_BASE_RELOC_TYPEOFFSET;
118+
let p = (self.image as *const IMAGE_BASE_RELOCATION).offset(1) as *const IMAGE_BASE_RELOC_TYPEOFFSET;
119119
let len = (self.image.SizeOfBlock as usize - mem::size_of::<IMAGE_BASE_RELOCATION>()) / mem::size_of::<IMAGE_BASE_RELOC_TYPEOFFSET>();
120120
slice::from_raw_parts(p, len)
121121
}

src/resources/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ impl<'a> Directory<'a> {
8080
pub fn entries(&self) -> Entries<'a> {
8181
// Validated by constructor
8282
let slice = unsafe {
83-
let p = (self.image as *const _).offset(1) as *const IMAGE_RESOURCE_DIRECTORY_ENTRY;
83+
let p = (self.image as *const IMAGE_RESOURCE_DIRECTORY).offset(1) as *const IMAGE_RESOURCE_DIRECTORY_ENTRY;
8484
let len = self.image.NumberOfNamedEntries as usize + self.image.NumberOfIdEntries as usize;
8585
slice::from_raw_parts(p, len)
8686
};
@@ -93,7 +93,7 @@ impl<'a> Directory<'a> {
9393
// Validated by constructor
9494
let slice = unsafe {
9595
// Named entries come first in the array (see chapter "PE File Resources" in "Peering Inside the PE: A Tour of the Win32 Portable Executable File Format")
96-
let p = (self.image as *const _).offset(1) as *const IMAGE_RESOURCE_DIRECTORY_ENTRY;
96+
let p = (self.image as *const IMAGE_RESOURCE_DIRECTORY).offset(1) as *const IMAGE_RESOURCE_DIRECTORY_ENTRY;
9797
let len = self.image.NumberOfNamedEntries as usize;
9898
slice::from_raw_parts(p, len)
9999
};
@@ -106,7 +106,7 @@ impl<'a> Directory<'a> {
106106
// Validated by the constructor
107107
let slice = unsafe {
108108
// Id entries come last in the array
109-
let p = (self.image as *const _).offset(1 + self.image.NumberOfNamedEntries as isize) as *const IMAGE_RESOURCE_DIRECTORY_ENTRY;
109+
let p = (self.image as *const IMAGE_RESOURCE_DIRECTORY).offset(1 + self.image.NumberOfNamedEntries as isize) as *const IMAGE_RESOURCE_DIRECTORY_ENTRY;
110110
let len = self.image.NumberOfIdEntries as usize;
111111
slice::from_raw_parts(p, len)
112112
};

0 commit comments

Comments
 (0)