0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-22 09:41:54 +00:00

Nest: Fix memory alignment in attribute cache

In attribute cache, adata structures were stored densely in one memory
block, without regard to alignment. Let's force at least u32 alignment.
This commit is contained in:
Ondrej Zajicek 2023-12-13 17:46:16 +01:00
parent 2c7555cf2a
commit 7d2c7d59a3
2 changed files with 5 additions and 3 deletions

View File

@ -542,6 +542,7 @@ const char *ea_custom_name(uint ea);
#define EA_ALLOW_UNDEF 0x10000 /* ea_find: allow EAF_TYPE_UNDEF */ #define EA_ALLOW_UNDEF 0x10000 /* ea_find: allow EAF_TYPE_UNDEF */
#define EA_BIT(n) ((n) << 24) /* Used in bitfield accessors */ #define EA_BIT(n) ((n) << 24) /* Used in bitfield accessors */
#define EA_BIT_GET(ea) ((ea) >> 24) #define EA_BIT_GET(ea) ((ea) >> 24)
#define EA_DATA_ALIGN 4 /* Alignment of adata in attribute cache */
#define EAF_TYPE_MASK 0x1f /* Mask with this to get type */ #define EAF_TYPE_MASK 0x1f /* Mask with this to get type */
#define EAF_TYPE_INT 0x01 /* 32-bit unsigned integer number */ #define EAF_TYPE_INT 0x01 /* 32-bit unsigned integer number */

View File

@ -766,7 +766,7 @@ ea_list_copy(ea_list *o)
{ {
eattr *a = &o->attrs[i]; eattr *a = &o->attrs[i];
if (!(a->type & EAF_EMBEDDED)) if (!(a->type & EAF_EMBEDDED))
elen += sizeof(struct adata) + a->u.ptr->length; elen += BIRD_ALIGN(sizeof(struct adata) + a->u.ptr->length, EA_DATA_ALIGN);
} }
n = mb_alloc(rta_pool, elen); n = mb_alloc(rta_pool, elen);
@ -777,11 +777,12 @@ ea_list_copy(ea_list *o)
eattr *a = &n->attrs[i]; eattr *a = &n->attrs[i];
if (!(a->type & EAF_EMBEDDED)) if (!(a->type & EAF_EMBEDDED))
{ {
unsigned size = sizeof(struct adata) + a->u.ptr->length; uint size_u = sizeof(struct adata) + a->u.ptr->length;
uint size = BIRD_ALIGN(size_u, EA_DATA_ALIGN);
ASSERT_DIE(adpos + size <= elen); ASSERT_DIE(adpos + size <= elen);
struct adata *d = ((void *) n) + adpos; struct adata *d = ((void *) n) + adpos;
memcpy(d, a->u.ptr, size); memcpy(d, a->u.ptr, size_u);
a->u.ptr = d; a->u.ptr = d;
adpos += size; adpos += size;