Workaround UBSAN errors for variable arrays
This gets around UBSAN errors when using arrays at the end of structs. It converts some zero-length arrays to variable length arrays and disables UBSAN checking on certain modules. It is based off of the patch from #15460. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Tested-by: Thomas Lamprecht <t.lamprecht@proxmox.com> Co-authored-by: Thomas Lamprecht <t.lamprecht@proxmox.com> Signed-off-by: Tony Hutter <hutter2@llnl.gov> Issue #15145 Closes #15510
This commit is contained in:
parent
94a830adf6
commit
bb1dd98bcc
|
@ -111,7 +111,7 @@ typedef struct spl_kmem_magazine {
|
||||||
uint32_t skm_refill; /* Batch refill size */
|
uint32_t skm_refill; /* Batch refill size */
|
||||||
struct spl_kmem_cache *skm_cache; /* Owned by cache */
|
struct spl_kmem_cache *skm_cache; /* Owned by cache */
|
||||||
unsigned int skm_cpu; /* Owned by cpu */
|
unsigned int skm_cpu; /* Owned by cpu */
|
||||||
void *skm_objs[0]; /* Object pointers */
|
void *skm_objs[]; /* Object pointers */
|
||||||
} spl_kmem_magazine_t;
|
} spl_kmem_magazine_t;
|
||||||
|
|
||||||
typedef struct spl_kmem_obj {
|
typedef struct spl_kmem_obj {
|
||||||
|
|
|
@ -130,7 +130,7 @@ typedef struct raidz_row {
|
||||||
uint64_t rr_offset; /* Logical offset for *_io_verify() */
|
uint64_t rr_offset; /* Logical offset for *_io_verify() */
|
||||||
uint64_t rr_size; /* Physical size for *_io_verify() */
|
uint64_t rr_size; /* Physical size for *_io_verify() */
|
||||||
#endif
|
#endif
|
||||||
raidz_col_t rr_col[0]; /* Flexible array of I/O columns */
|
raidz_col_t rr_col[]; /* Flexible array of I/O columns */
|
||||||
} raidz_row_t;
|
} raidz_row_t;
|
||||||
|
|
||||||
typedef struct raidz_map {
|
typedef struct raidz_map {
|
||||||
|
@ -139,7 +139,7 @@ typedef struct raidz_map {
|
||||||
int rm_nskip; /* RAIDZ sectors skipped for padding */
|
int rm_nskip; /* RAIDZ sectors skipped for padding */
|
||||||
int rm_skipstart; /* Column index of padding start */
|
int rm_skipstart; /* Column index of padding start */
|
||||||
const raidz_impl_ops_t *rm_ops; /* RAIDZ math operations */
|
const raidz_impl_ops_t *rm_ops; /* RAIDZ math operations */
|
||||||
raidz_row_t *rm_row[0]; /* flexible array of rows */
|
raidz_row_t *rm_row[]; /* flexible array of rows */
|
||||||
} raidz_map_t;
|
} raidz_map_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,8 @@ OBJECT_FILES_NON_STANDARD_aesni-gcm-x86_64.o := y
|
||||||
OBJECT_FILES_NON_STANDARD_sha256_impl.o := y
|
OBJECT_FILES_NON_STANDARD_sha256_impl.o := y
|
||||||
OBJECT_FILES_NON_STANDARD_sha512_impl.o := y
|
OBJECT_FILES_NON_STANDARD_sha512_impl.o := y
|
||||||
|
|
||||||
|
UBSAN_SANITIZE_modhash.o := n
|
||||||
|
|
||||||
ICP_DIRS = \
|
ICP_DIRS = \
|
||||||
api \
|
api \
|
||||||
core \
|
core \
|
||||||
|
|
|
@ -159,4 +159,8 @@ CFLAGS_REMOVE_vdev_raidz_math_aarch64_neon.o += -mgeneral-regs-only
|
||||||
CFLAGS_REMOVE_vdev_raidz_math_aarch64_neonx2.o += -mgeneral-regs-only
|
CFLAGS_REMOVE_vdev_raidz_math_aarch64_neonx2.o += -mgeneral-regs-only
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
UBSAN_SANITIZE_zap_leaf.o := n
|
||||||
|
UBSAN_SANITIZE_zap_micro.o := n
|
||||||
|
UBSAN_SANITIZE_sa.o := n
|
||||||
|
|
||||||
include $(mfdir)/../os/linux/zfs/Makefile
|
include $(mfdir)/../os/linux/zfs/Makefile
|
||||||
|
|
Loading…
Reference in New Issue