Linux 6.3 compat: Fix memcpy "detected field-spanning write" error

Add a new union member of flexible array to dnode_phys_t and use
it in the macro so we can silence the memcpy() fortify error.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Youzhong Yang <yyang@mathworks.com>
Closes #14737
This commit is contained in:
youzhongyang 2023-04-13 12:12:03 -04:00 committed by Tony Hutter
parent f0aca5f7bb
commit d7fb413f0f
1 changed files with 9 additions and 1 deletions

View File

@ -120,7 +120,11 @@ extern "C" {
#define DN_MAX_LEVELS (DIV_ROUND_UP(DN_MAX_OFFSET_SHIFT - SPA_MINBLOCKSHIFT, \ #define DN_MAX_LEVELS (DIV_ROUND_UP(DN_MAX_OFFSET_SHIFT - SPA_MINBLOCKSHIFT, \
DN_MIN_INDBLKSHIFT - SPA_BLKPTRSHIFT) + 1) DN_MIN_INDBLKSHIFT - SPA_BLKPTRSHIFT) + 1)
#define DN_BONUS(dnp) ((void*)((dnp)->dn_bonus + \ /*
* Use the flexible array instead of the fixed length one dn_bonus
* to address memcpy/memmove fortify error
*/
#define DN_BONUS(dnp) ((void*)((dnp)->dn_bonus_flexible + \
(((dnp)->dn_nblkptr - 1) * sizeof (blkptr_t)))) (((dnp)->dn_nblkptr - 1) * sizeof (blkptr_t))))
#define DN_MAX_BONUS_LEN(dnp) \ #define DN_MAX_BONUS_LEN(dnp) \
((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) ? \ ((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) ? \
@ -266,6 +270,10 @@ typedef struct dnode_phys {
sizeof (blkptr_t)]; sizeof (blkptr_t)];
blkptr_t dn_spill; blkptr_t dn_spill;
}; };
struct {
blkptr_t __dn_ignore4;
uint8_t dn_bonus_flexible[];
};
}; };
} dnode_phys_t; } dnode_phys_t;