Skip to content

Commit

Permalink
Fix alignment of ordertree nodes (#954)
Browse files Browse the repository at this point in the history
This ensures casts of local variables don't run into alignment
differences.

(cherry picked from commit d9c4f69)
(cherry picked from commit 676da3a)
  • Loading branch information
ckamm authored and farnyser committed Aug 9, 2024
1 parent be67617 commit e6c9a38
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 4 deletions.
14 changes: 11 additions & 3 deletions programs/mango-v4/src/state/orderbook/nodes.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::mem::size_of;
use std::mem::{align_of, size_of};

use anchor_lang::prelude::*;
use bytemuck::{cast_mut, cast_ref};
Expand Down Expand Up @@ -252,7 +252,9 @@ pub struct FreeNode {
pub(crate) tag: u8, // NodeTag
pub(crate) padding: [u8; 3],
pub(crate) next: NodeHandle,
pub(crate) reserved: [u8; NODE_SIZE - 8],
pub(crate) reserved: [u8; NODE_SIZE - 16],
// ensure that FreeNode has the same 8-byte alignment as other nodes
pub(crate) force_align: u64,
}
const_assert_eq!(size_of::<FreeNode>(), NODE_SIZE);
const_assert_eq!(size_of::<FreeNode>() % 8, 0);
Expand All @@ -261,13 +263,19 @@ const_assert_eq!(size_of::<FreeNode>() % 8, 0);
#[derive(bytemuck::Pod, bytemuck::Zeroable)]
pub struct AnyNode {
pub tag: u8,
pub data: [u8; 119],
pub data: [u8; 111],
// ensure that AnyNode has the same 8-byte alignment as other nodes
pub(crate) force_align: u64,
}
const_assert_eq!(size_of::<AnyNode>(), NODE_SIZE);
const_assert_eq!(size_of::<AnyNode>() % 8, 0);
const_assert_eq!(size_of::<AnyNode>(), size_of::<InnerNode>());
const_assert_eq!(size_of::<AnyNode>(), size_of::<LeafNode>());
const_assert_eq!(size_of::<AnyNode>(), size_of::<FreeNode>());
const_assert_eq!(align_of::<AnyNode>(), 8);
const_assert_eq!(align_of::<AnyNode>(), align_of::<InnerNode>());
const_assert_eq!(align_of::<AnyNode>(), align_of::<LeafNode>());
const_assert_eq!(align_of::<AnyNode>(), align_of::<FreeNode>());

pub(crate) enum NodeRef<'a> {
Inner(&'a InnerNode),
Expand Down
3 changes: 2 additions & 1 deletion programs/mango-v4/src/state/orderbook/ordertree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,8 @@ impl OrderTreeNodes {
},
padding: Default::default(),
next: self.free_list_head,
reserved: [0; 112],
reserved: [0; 104],
force_align: 0,
});

self.free_list_len += 1;
Expand Down

0 comments on commit e6c9a38

Please sign in to comment.