diff options
| author | Andrzej Pietrasiewicz <andrzej.p@samsung.com> | 2014-10-16 07:33:26 -0400 |
|---|---|---|
| committer | Felipe Balbi <balbi@ti.com> | 2014-11-05 14:36:05 -0500 |
| commit | d23b4c3ee2d5cbdeaec9f8e7d8a9bdcc73836fb9 (patch) | |
| tree | e12ed1da81a3977cd865ab428baad52075a83089 /drivers/usb/gadget/function | |
| parent | 6e58ed578e2c65442b7a02deecc96e482c701654 (diff) | |
usb: gadget: f_midi: check kstrdup() return value
kstrdup() might fail, so check its return value and react appropriately.
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/gadget/function')
| -rw-r--r-- | drivers/usb/gadget/function/f_midi.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c index bf329578c957..a920eee9e878 100644 --- a/drivers/usb/gadget/function/f_midi.c +++ b/drivers/usb/gadget/function/f_midi.c | |||
| @@ -654,6 +654,14 @@ static struct snd_rawmidi_ops gmidi_out_ops = { | |||
| 654 | .trigger = f_midi_out_trigger | 654 | .trigger = f_midi_out_trigger |
| 655 | }; | 655 | }; |
| 656 | 656 | ||
| 657 | static inline void f_midi_unregister_card(struct f_midi *midi) | ||
| 658 | { | ||
| 659 | if (midi->card) { | ||
| 660 | snd_card_free(midi->card); | ||
| 661 | midi->card = NULL; | ||
| 662 | } | ||
| 663 | } | ||
| 664 | |||
| 657 | /* register as a sound "card" */ | 665 | /* register as a sound "card" */ |
| 658 | static int f_midi_register_card(struct f_midi *midi) | 666 | static int f_midi_register_card(struct f_midi *midi) |
| 659 | { | 667 | { |
| @@ -715,10 +723,7 @@ static int f_midi_register_card(struct f_midi *midi) | |||
| 715 | return 0; | 723 | return 0; |
| 716 | 724 | ||
| 717 | fail: | 725 | fail: |
| 718 | if (midi->card) { | 726 | f_midi_unregister_card(midi); |
| 719 | snd_card_free(midi->card); | ||
| 720 | midi->card = NULL; | ||
| 721 | } | ||
| 722 | return err; | 727 | return err; |
| 723 | } | 728 | } |
| 724 | 729 | ||
| @@ -967,15 +972,23 @@ int __init f_midi_bind_config(struct usb_configuration *c, | |||
| 967 | midi->func.disable = f_midi_disable; | 972 | midi->func.disable = f_midi_disable; |
| 968 | 973 | ||
| 969 | midi->id = kstrdup(id, GFP_KERNEL); | 974 | midi->id = kstrdup(id, GFP_KERNEL); |
| 975 | if (id && !midi->id) { | ||
| 976 | status = -ENOMEM; | ||
| 977 | goto kstrdup_fail; | ||
| 978 | } | ||
| 970 | midi->buflen = buflen; | 979 | midi->buflen = buflen; |
| 971 | midi->qlen = qlen; | 980 | midi->qlen = qlen; |
| 972 | 981 | ||
| 973 | status = usb_add_function(c, &midi->func); | 982 | status = usb_add_function(c, &midi->func); |
| 974 | if (status) | 983 | if (status) |
| 975 | goto setup_fail; | 984 | goto add_fail; |
| 976 | 985 | ||
| 977 | return 0; | 986 | return 0; |
| 978 | 987 | ||
| 988 | add_fail: | ||
| 989 | kfree(midi->id); | ||
| 990 | kstrdup_fail: | ||
| 991 | f_midi_unregister_card(midi); | ||
| 979 | setup_fail: | 992 | setup_fail: |
| 980 | for (--i; i >= 0; i--) | 993 | for (--i; i >= 0; i--) |
| 981 | kfree(midi->in_port[i]); | 994 | kfree(midi->in_port[i]); |
