mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
![]() The current codebase makes use of one-element arrays in the following
form:
struct something {
int length;
u8 data[1];
};
struct something *instance;
instance = kmalloc(sizeof(*instance) + size, GFP_KERNEL);
instance->length = size;
memcpy(instance->data, source, size);
but the preferred mechanism to declare variable-length types such as
these ones is a flexible array member[1][2], introduced in C99:
struct foo {
int stuff;
struct boo array[];
};
By making use of the mechanism above, we will get a compiler warning
in case the flexible array does not occur last in the structure, which
will help us prevent some kind of undefined behavior bugs from being
inadvertently introduced[3] to the codebase from now on. So, replace
the one-element array with a flexible-array member.
Also, make use of the new struct_size() helper to properly calculate the
size of struct SISLANDS_SMC_SWSTATE.
This issue was found with the help of Coccinelle and, audited and fixed
_manually_.
[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit
|
||
---|---|---|
.. | ||
reg_srcs | ||
.gitignore | ||
atom-bits.h | ||
atom-names.h | ||
atom-types.h | ||
atom.c | ||
atom.h | ||
atombios.h | ||
atombios_crtc.c | ||
atombios_dp.c | ||
atombios_encoders.c | ||
atombios_i2c.c | ||
avivod.h | ||
btc_dpm.c | ||
btc_dpm.h | ||
btcd.h | ||
cayman_blit_shaders.c | ||
cayman_blit_shaders.h | ||
ci_dpm.c | ||
ci_dpm.h | ||
ci_smc.c | ||
cik.c | ||
cik_blit_shaders.c | ||
cik_blit_shaders.h | ||
cik_reg.h | ||
cik_sdma.c | ||
cikd.h | ||
clearstate_cayman.h | ||
clearstate_ci.h | ||
clearstate_defs.h | ||
clearstate_evergreen.h | ||
clearstate_si.h | ||
cypress_dpm.c | ||
cypress_dpm.h | ||
dce3_1_afmt.c | ||
dce6_afmt.c | ||
evergreen.c | ||
evergreen_blit_shaders.c | ||
evergreen_blit_shaders.h | ||
evergreen_cs.c | ||
evergreen_dma.c | ||
evergreen_hdmi.c | ||
evergreen_reg.h | ||
evergreen_smc.h | ||
evergreend.h | ||
Kconfig | ||
kv_dpm.c | ||
kv_dpm.h | ||
kv_smc.c | ||
Makefile | ||
mkregtable.c | ||
ni.c | ||
ni_dma.c | ||
ni_dpm.c | ||
ni_dpm.h | ||
ni_reg.h | ||
nid.h | ||
nislands_smc.h | ||
ObjectID.h | ||
ppsmc.h | ||
pptable.h | ||
r100.c | ||
r100_track.h | ||
r100d.h | ||
r200.c | ||
r300.c | ||
r300_reg.h | ||
r300d.h | ||
r420.c | ||
r420d.h | ||
r500_reg.h | ||
r520.c | ||
r520d.h | ||
r600.c | ||
r600_blit_shaders.c | ||
r600_blit_shaders.h | ||
r600_cs.c | ||
r600_dma.c | ||
r600_dpm.c | ||
r600_dpm.h | ||
r600_hdmi.c | ||
r600_reg.h | ||
r600d.h | ||
radeon.h | ||
radeon_acpi.c | ||
radeon_acpi.h | ||
radeon_agp.c | ||
radeon_asic.c | ||
radeon_asic.h | ||
radeon_atombios.c | ||
radeon_atpx_handler.c | ||
radeon_audio.c | ||
radeon_audio.h | ||
radeon_benchmark.c | ||
radeon_bios.c | ||
radeon_clocks.c | ||
radeon_combios.c | ||
radeon_connectors.c | ||
radeon_cs.c | ||
radeon_cursor.c | ||
radeon_device.c | ||
radeon_display.c | ||
radeon_dp_auxch.c | ||
radeon_dp_mst.c | ||
radeon_drv.c | ||
radeon_drv.h | ||
radeon_encoders.c | ||
radeon_family.h | ||
radeon_fb.c | ||
radeon_fence.c | ||
radeon_gart.c | ||
radeon_gem.c | ||
radeon_i2c.c | ||
radeon_ib.c | ||
radeon_irq_kms.c | ||
radeon_kms.c | ||
radeon_legacy_crtc.c | ||
radeon_legacy_encoders.c | ||
radeon_legacy_tv.c | ||
radeon_mn.c | ||
radeon_mode.h | ||
radeon_object.c | ||
radeon_object.h | ||
radeon_pm.c | ||
radeon_prime.c | ||
radeon_reg.h | ||
radeon_ring.c | ||
radeon_sa.c | ||
radeon_semaphore.c | ||
radeon_sync.c | ||
radeon_test.c | ||
radeon_trace.h | ||
radeon_trace_points.c | ||
radeon_ttm.c | ||
radeon_ucode.c | ||
radeon_ucode.h | ||
radeon_uvd.c | ||
radeon_vce.c | ||
radeon_vm.c | ||
rs100d.h | ||
rs400.c | ||
rs400d.h | ||
rs600.c | ||
rs600d.h | ||
rs690.c | ||
rs690d.h | ||
rs780_dpm.c | ||
rs780_dpm.h | ||
rs780d.h | ||
rv6xx_dpm.c | ||
rv6xx_dpm.h | ||
rv6xxd.h | ||
rv200d.h | ||
rv250d.h | ||
rv350d.h | ||
rv515.c | ||
rv515d.h | ||
rv730_dpm.c | ||
rv730d.h | ||
rv740_dpm.c | ||
rv740d.h | ||
rv770.c | ||
rv770_dma.c | ||
rv770_dpm.c | ||
rv770_dpm.h | ||
rv770_smc.c | ||
rv770_smc.h | ||
rv770d.h | ||
si.c | ||
si_blit_shaders.c | ||
si_blit_shaders.h | ||
si_dma.c | ||
si_dpm.c | ||
si_dpm.h | ||
si_reg.h | ||
si_smc.c | ||
sid.h | ||
sislands_smc.h | ||
smu7.h | ||
smu7_discrete.h | ||
smu7_fusion.h | ||
sumo_dpm.c | ||
sumo_dpm.h | ||
sumo_smc.c | ||
sumod.h | ||
trinity_dpm.c | ||
trinity_dpm.h | ||
trinity_smc.c | ||
trinityd.h | ||
uvd_v1_0.c | ||
uvd_v2_2.c | ||
uvd_v3_1.c | ||
uvd_v4_2.c | ||
vce_v1_0.c | ||
vce_v2_0.c |