mirror of https://gitee.com/openkylin/linux.git
fa2b30af84
In each function, the value apcm is stored in the private_data field of runtime. At the same time the function ct_atc_pcm_free_substream is stored in the private_free field of the same structure. ct_atc_pcm_free_substream dereferences and ultimately frees the value in the private_data field. But each function can exit in an error case with apcm having been freed, in which case a subsequent call to the private_free function would perform a dereference after free. On the other hand, if the private_free field is not initialized, it is NULL, and not invoked (see snd_pcm_detach_substream in sound/core/pcm.c). To avoid the introduction of a dangling pointer, the initializations of the private_data and private_free fields are moved to the end of the function, past any possible free of apcm. This is safe because the previous calls to snd_pcm_hw_constraint_integer and snd_pcm_hw_constraint_minmax, which take runtime as an argument, do not refer to either of these fields. In each function, there is one error case where apcm needs to be freed, and a call to kfree is added. The sematic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // <smpl> @@ expression e,e1,e2,e3; identifier f,free1,free2; expression a; @@ *e->f = a ... when != e->f = e1 when any if (...) { ... when != free1(...,e,...) when != e->f = e2 * kfree(a) ... when != free2(...,e,...) when != e->f = e3 } // </smpl> Signed-off-by: Julia Lawall <julia@diku.dk> Signed-off-by: Takashi Iwai <tiwai@suse.de> |
||
---|---|---|
.. | ||
Makefile | ||
ct20k1reg.h | ||
ct20k2reg.h | ||
ctamixer.c | ||
ctamixer.h | ||
ctatc.c | ||
ctatc.h | ||
ctdaio.c | ||
ctdaio.h | ||
cthardware.c | ||
cthardware.h | ||
cthw20k1.c | ||
cthw20k1.h | ||
cthw20k2.c | ||
cthw20k2.h | ||
ctimap.c | ||
ctimap.h | ||
ctmixer.c | ||
ctmixer.h | ||
ctpcm.c | ||
ctpcm.h | ||
ctresource.c | ||
ctresource.h | ||
ctsrc.c | ||
ctsrc.h | ||
cttimer.c | ||
cttimer.h | ||
ctvmem.c | ||
ctvmem.h | ||
xfi.c |