• Julia Lawall's avatar
    ALSA: sound/pci/ctxfi/ctpcm.c: Remove potential for use after free · fa2b30af
    Julia Lawall authored
    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: default avatarJulia Lawall <julia@diku.dk>
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    fa2b30af
ctpcm.c 11 KB