diff options
author | Glyn Normington <gnormington@pivotal.io> | 2017-11-13 14:41:09 +0000 |
---|---|---|
committer | Glyn Normington <gnormington@pivotal.io> | 2017-11-13 14:41:09 +0000 |
commit | e22d7dad24eecb336bce2e84d4206e61794baf47 (patch) | |
tree | aefa07a249f0fb03043c42101bcdcb5c0b2b095b /src/codegen/mod.rs | |
parent | 433e9c050b2f5fd45a476a818f035b17b38f6b15 (diff) |
Avoid bitfield getters and setters accessing memory beyond "self"
This fixes https://github.com/rust-lang-nursery/rust-bindgen/issues/954.
Diffstat (limited to 'src/codegen/mod.rs')
-rw-r--r-- | src/codegen/mod.rs | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 50de296e..f0a7e0be 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1201,7 +1201,7 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit { 1 => quote! { u8 }, size => { debug_assert!(size > 8); - // Can't generate bitfield accessors for unit sizes larget than + // Can't generate bitfield accessors for unit sizes larger than // 64 bits at the moment. struct_layout.saw_bitfield_unit(self.layout()); return; @@ -1227,7 +1227,7 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit { struct_layout, fields, methods, - (&unit_field_name, unit_field_int_ty.clone()), + (&unit_field_name, unit_field_int_ty.clone(), self.layout().size), ); let param_name = bitfield_getter_name(ctx, bf); @@ -1283,7 +1283,7 @@ fn bitfield_setter_name( } impl<'a> FieldCodegen<'a> for Bitfield { - type Extra = (&'a str, quote::Tokens); + type Extra = (&'a str, quote::Tokens, usize); fn codegen<F, M>( &self, @@ -1296,7 +1296,7 @@ impl<'a> FieldCodegen<'a> for Bitfield { _struct_layout: &mut StructLayoutTracker, _fields: &mut F, methods: &mut M, - (unit_field_name, unit_field_int_ty): (&'a str, quote::Tokens), + (unit_field_name, unit_field_int_ty, unit_field_size): (&'a str, quote::Tokens, usize), ) where F: Extend<quote::Tokens>, M: Extend<quote::Tokens>, @@ -1331,7 +1331,7 @@ impl<'a> FieldCodegen<'a> for Bitfield { ::#prefix::ptr::copy_nonoverlapping( &self.#unit_field_ident as *const _ as *const u8, &mut unit_field_val as *mut #unit_field_int_ty as *mut u8, - ::#prefix::mem::size_of::<#unit_field_int_ty>(), + #unit_field_size, ) }; @@ -1355,7 +1355,7 @@ impl<'a> FieldCodegen<'a> for Bitfield { ::#prefix::ptr::copy_nonoverlapping( &self.#unit_field_ident as *const _ as *const u8, &mut unit_field_val as *mut #unit_field_int_ty as *mut u8, - ::#prefix::mem::size_of::< #unit_field_int_ty >(), + #unit_field_size, ) }; @@ -1366,7 +1366,7 @@ impl<'a> FieldCodegen<'a> for Bitfield { ::#prefix::ptr::copy_nonoverlapping( &unit_field_val as *const _ as *const u8, &mut self.#unit_field_ident as *mut _ as *mut u8, - ::#prefix::mem::size_of::< #unit_field_int_ty >(), + #unit_field_size, ); } } |