usb: gadget: f_midi: fix segfault when reading empty id
When midi function is created, 'id' attribute is initialized with
SNDRV_DEFAULT_STR1, which is NULL pointer. Trying to read this attribute
before filling it ends up with segmentation fault.
This commit fix this issue by preventing null pointer dereference. Now
f_midi_opts_id_show() returns empty string when id is a null pointer.
Reproduction path:
$ mkdir functions/midi.0
$ cat functions/midi.0/id
[ 53.130132] Unable to handle kernel NULL pointer dereference at
virtual address
00000000
[ 53.132630] pgd =
ec6cc000
[ 53.135308] [
00000000] *pgd=
6b759831, *pte=
00000000, *ppte=
00000000
[ 53.141530] Internal error: Oops: 17 [#1] PREEMPT SMP ARM
[ 53.146904] Modules linked in: usb_f_midi snd_rawmidi libcomposite
[ 53.153071] CPU: 1 PID: 2936 Comm: cat Not tainted
3.19.0-00041-gcf4b216 #7
[ 53.160010] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[ 53.166088] task:
ee234c80 ti:
ec764000 task.ti:
ec764000
[ 53.171482] PC is at strlcpy+0x8/0x60
[ 53.175128] LR is at f_midi_opts_id_show+0x28/0x3c [usb_f_midi]
[ 53.181019] pc : [<
c0222a9c>] lr : [<
bf01bed0>] psr:
60000053
[ 53.181019] sp :
ec765ef8 ip :
00000141 fp :
00000000
[ 53.192474] r10:
00019000 r9 :
ed7546c0 r8 :
00010000
[ 53.197682] r7 :
ec765f80 r6 :
eb46a000 r5 :
eb46a000 r4 :
ed754734
[ 53.204192] r3 :
ee234c80 r2 :
00001000 r1 :
00000000 r0 :
eb46a000
[ 53.210704] Flags: nZCv IRQs on FIQs off Mode SVC_32 ISA ARM
Segment user
[ 53.217907] Control:
10c5387d Table:
6c6cc04a DAC:
00000015
[ 53.223636] Process cat (pid: 2936, stack limit = 0xec764238)
[ 53.229364] Stack: (0xec765ef8 to 0xec766000)
[ 53.233706] 5ee0:
ed754734 ed7546c0
[ 53.241866] 5f00:
eb46a000 bf01bed0 eb753b80 bf01cc44 eb753b98
bf01b0a4 bf01b08c c0125dd0
[ 53.250025] 5f20:
00002f19 00000000 ec432e00 bf01cce8 c0530c00
00019000 00010000 ec765f80
[ 53.258184] 5f40:
00010000 ec764000 00019000 c00cc4ac ec432e00
c00cc55c 00000017 000081a4
[ 53.266343] 5f60:
00000001 00000000 00000000 ec432e00 ec432e00
00010000 00019000 c00cc620
[ 53.274502] 5f80:
00000000 00000000 00000000 00010000 ffff1000
00019000 00000003 c000e9a8
[ 53.282662] 5fa0:
00000000 c000e7e0 00010000 ffff1000 00000003
00019000 00010000 00019000
[ 53.290821] 5fc0:
00010000 ffff1000 00019000 00000003 7fffe000
00000001 00000000 00000000
[ 53.298980] 5fe0:
00000000 be8c68d4 0000b995 b6f0e3e6 40000070
00000003 00000000 00000000
[ 53.307157] [<
c0222a9c>] (strlcpy) from [<
bf01bed0>]
(f_midi_opts_id_show+0x28/0x3c [usb_f_midi])
[ 53.316006] [<
bf01bed0>] (f_midi_opts_id_show [usb_f_midi]) from
[<
bf01b0a4>] (f_midi_opts_attr_show+0x18/0x24 )
[ 53.327209] [<
bf01b0a4>] (f_midi_opts_attr_show [usb_f_midi]) from
[<
c0125dd0>] (configfs_read_file+0x9c/0xec)
[ 53.337180] [<
c0125dd0>] (configfs_read_file) from [<
c00cc4ac>]
(__vfs_read+0x18/0x4c)
[ 53.345073] [<
c00cc4ac>] (__vfs_read) from [<
c00cc55c>]
(vfs_read+0x7c/0x100)
[ 53.352190] [<
c00cc55c>] (vfs_read) from [<
c00cc620>]
(SyS_read+0x40/0x8c)
[ 53.359056] [<
c00cc620>] (SyS_read) from [<
c000e7e0>]
(ret_fast_syscall+0x0/0x34)
[ 53.366513] Code:
ebffe3d3 e8bd8008 e92d4070 e1a05000 (
e5d14000)
[ 53.372641] ---[ end trace
e4f53a4e233d98d0 ]---
Signed-off-by: Pawel Szewczyk <p.szewczyk@samsung.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>