Commit e8e0929d7290cab7c5b1a3e5f5f54f73daf38038
Committed by
Takashi Iwai
1 parent
4b3be6afa4
Exists in
master
and in
39 other branches
ALSA: sound/parisc: Move dereference after NULL test
If the NULL test on h is needed in snd_harmony_mixer_init, then the dereference should be after the NULL test. Actually, there is a sequence of calls: snd_harmony_create, then snd_harmony_pcm_init, and then snd_harmony_mixer_init. snd_harmony_create initializes h, but may indeed leave it as NULL. There was no NULL test at the beginning of snd_harmony_pcm_init, so I have added one. The NULL test in snd_harmony_mixer_init is then not necessary, but in case the ordering of the calls changes, I have left it, and moved the dereference after it. A simplified version of the semantic match that detects this problem is as follows (http://coccinelle.lip6.fr/): // <smpl> @match exists@ expression x, E; identifier fld; @@ * x->fld ... when != \(x = E\|&x\) * x == NULL // </smpl> Signed-off-by: Julia Lawall <julia@diku.dk> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Showing 1 changed file with 5 additions and 1 deletions Side-by-side Diff
sound/parisc/harmony.c
... | ... | @@ -624,6 +624,9 @@ |
624 | 624 | struct snd_pcm *pcm; |
625 | 625 | int err; |
626 | 626 | |
627 | + if (snd_BUG_ON(!h)) | |
628 | + return -EINVAL; | |
629 | + | |
627 | 630 | harmony_disable_interrupts(h); |
628 | 631 | |
629 | 632 | err = snd_pcm_new(h->card, "harmony", 0, 1, 1, &pcm); |
630 | 633 | |
... | ... | @@ -865,11 +868,12 @@ |
865 | 868 | static int __devinit |
866 | 869 | snd_harmony_mixer_init(struct snd_harmony *h) |
867 | 870 | { |
868 | - struct snd_card *card = h->card; | |
871 | + struct snd_card *card; | |
869 | 872 | int idx, err; |
870 | 873 | |
871 | 874 | if (snd_BUG_ON(!h)) |
872 | 875 | return -EINVAL; |
876 | + card = h->card; | |
873 | 877 | strcpy(card->mixername, "Harmony Gain control interface"); |
874 | 878 | |
875 | 879 | for (idx = 0; idx < HARMONY_CONTROLS; idx++) { |