Skip to content

Commit

Permalink
Workaround UBSAN errors for variable arrays
Browse files Browse the repository at this point in the history
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 <[email protected]>
Tested-by: Thomas Lamprecht <[email protected]>
Co-authored-by: Thomas Lamprecht <[email protected]>
Signed-off-by: Tony Hutter <[email protected]>
Issue #15145
Closes #15510
  • Loading branch information
tonyhutter authored and behlendorf committed Jan 29, 2024
1 parent 94a830a commit 217fabc
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 3 deletions.
2 changes: 1 addition & 1 deletion include/os/linux/spl/sys/kmem_cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ typedef struct spl_kmem_magazine {
uint32_t skm_refill; /* Batch refill size */
struct spl_kmem_cache *skm_cache; /* Owned by cache */
unsigned int skm_cpu; /* Owned by cpu */
void *skm_objs[0]; /* Object pointers */
void *skm_objs[]; /* Object pointers */
} spl_kmem_magazine_t;

typedef struct spl_kmem_obj {
Expand Down
4 changes: 2 additions & 2 deletions include/sys/vdev_raidz_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ typedef struct raidz_row {
uint64_t rr_offset; /* Logical offset for *_io_verify() */
uint64_t rr_size; /* Physical size for *_io_verify() */
#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;

typedef struct raidz_map {
Expand All @@ -139,7 +139,7 @@ typedef struct raidz_map {
int rm_nskip; /* RAIDZ sectors skipped for padding */
int rm_skipstart; /* Column index of padding start */
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;


Expand Down
2 changes: 2 additions & 0 deletions module/icp/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -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_sha512_impl.o := y

UBSAN_SANITIZE_modhash.o := n

ICP_DIRS = \
api \
core \
Expand Down
4 changes: 4 additions & 0 deletions module/zfs/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
endif

UBSAN_SANITIZE_zap_leaf.o := n
UBSAN_SANITIZE_zap_micro.o := n
UBSAN_SANITIZE_sa.o := n

include $(mfdir)/../os/linux/zfs/Makefile

0 comments on commit 217fabc

Please sign in to comment.