Fix alignment of ordertree nodes (#954)

This ensures casts of local variables don't run into alignment
differences.

(cherry picked from commit d9c4f69e0e)
This commit is contained in:
Christian Kamm 2024-04-29 18:50:40 +02:00
parent ed715ce855
commit 676da3a084
2 changed files with 13 additions and 4 deletions

View File

@ -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};
@ -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);
@ -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),

View File

@ -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;