Skip to content

Commit

Permalink
Fix unsafe AtomicRefCell<PersistentLayoutData> transmute due to memor…
Browse files Browse the repository at this point in the history
…y alignment differences
  • Loading branch information
MortimerGoro committed May 12, 2017
1 parent 48fdda3 commit 593e890
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions components/layout/lib.rs
Expand Up @@ -93,6 +93,7 @@ pub mod wrapper;
// For unit tests:
pub use fragment::Fragment;
pub use fragment::SpecificFragmentInfo;
pub use self::data::PersistentLayoutData;

/// Returns whether the two arguments point to the same value.
///
Expand Down
5 changes: 5 additions & 0 deletions components/script_layout_interface/lib.rs
Expand Up @@ -50,6 +50,7 @@ use servo_url::ServoUrl;
use std::sync::atomic::AtomicIsize;
use style::data::ElementData;

#[repr(C)]
pub struct PartialPersistentLayoutData {
/// Data that the style system associates with a node. When the
/// style system is being used standalone, this is all that hangs
Expand All @@ -59,13 +60,17 @@ pub struct PartialPersistentLayoutData {

/// Information needed during parallel traversals.
pub parallel: DomParallelInfo,

// Required alignment for safe transmutes between PersistentLayoutData and PartialPersistentLayoutData.
_align: [u64; 0]
}

impl PartialPersistentLayoutData {
pub fn new() -> Self {
PartialPersistentLayoutData {
style_data: ElementData::new(None),
parallel: DomParallelInfo::new(),
_align: [],
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions tests/unit/layout/Cargo.toml
Expand Up @@ -10,4 +10,6 @@ path = "lib.rs"
doctest = false

[dependencies]
atomic_refcell = "0.1"
layout = {path = "../../../components/layout"}
script_layout_interface = {path = "../../../components/script_layout_interface"}
26 changes: 26 additions & 0 deletions tests/unit/layout/align_of.rs
@@ -0,0 +1,26 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

use atomic_refcell::AtomicRefCell;
use layout::PersistentLayoutData;
use script_layout_interface::PartialPersistentLayoutData;
use std::mem::align_of;

fn check_layout_alignment(expected: usize, current: usize) {
if current != expected {
panic!("Your changes have altered the mem alignment of the PartialPersistentLayoutData \
struct to {}, but it must match the {}-alignment of PersistentLayoutData struct. \
Please fix alignment in components/script_layout_interface/lib.rs",
current, expected);
}
}

#[test]
fn test_persistent_layout_data_alignment() {
check_layout_alignment(align_of::<PersistentLayoutData>(),
align_of::<PartialPersistentLayoutData>());

check_layout_alignment(align_of::<AtomicRefCell<PersistentLayoutData>>(),
align_of::<AtomicRefCell<PartialPersistentLayoutData>>());
}
3 changes: 3 additions & 0 deletions tests/unit/layout/lib.rs
Expand Up @@ -2,6 +2,9 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

extern crate atomic_refcell;
extern crate layout;
extern crate script_layout_interface;

#[cfg(test)] mod align_of;
#[cfg(all(test, target_pointer_width = "64"))] mod size_of;

0 comments on commit 593e890

Please sign in to comment.