mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 17:51:53 +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:
parent
2c7555cf2a
commit
7d2c7d59a3
@ -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 */
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user