linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* segfault when CCD are present in two different HOG services
@ 2019-07-16 21:34 mathieu.stephan
  0 siblings, 0 replies; only message in thread
From: mathieu.stephan @ 2019-07-16 21:34 UTC (permalink / raw)
  To: linux-bluetooth

Hello everyone,

We are currently developing a device that contains two HID services.
That device, as it is right now, is properly functioning on Windows & Android.
However, when pairing the device on Linux running bluez 5.50 we do get
segfaults (see attached files).
Our bluetooth device has 4 services : 1 battery service, 2 HID Over
Gatt services and 1 device information service.
With trial and error, we managed to find that we wouldn't get any
crash as long as only 1 HOG service was present.

Here's the interesting part. The two HOG services are made as follows:
- standard keyboard over gatt: protocole mode / report map / 1 INPUT
report / boot INPUT + OUTPUT / HID information / HID Control point
- raw HID over gatt : report map / 1 INPUT report / 1 OUTPUT report /
HID information / HID control point

Looking at the write_ccc in the call stacks we wondered if the
callbacks subscribing to notifications for the INPUT reports were
causing this issue.

We therefore changed the raw HID over gatt (and its report map) to
remove the INPUT report and change it into 1 OUTPUT report (leading to
2 OUTPUT reports): no crash.

We therefore hypothesize that the segfault occurs when subscribing to
notification on a second HOG service...



callstacks:

Program received signal SIGSEGV, Segmentation fault.
ccc_read_cb (status=<optimized out>, pdu=<optimized out>,
len=<optimized out>, user_data=<optimized out>) at
profiles/input/hog-lib.c:377
377 profiles/input/hog-lib.c: No such file or directory.
(gdb) bt
#0  ccc_read_cb (status=<optimized out>, pdu=<optimized out>,
len=<optimized out>, user_data=<optimized out>) at
profiles/input/hog-lib.c:377
#1  0x000055555559d40e in read_char_helper (status=<optimized out>,
rpdu=0x55555587f8d0 "\v", rlen=3, user_data=0x55555589daa0) at
attrib/gatt.c:841
#2  0x000055555559f32b in attrib_callback_result (opcode=<optimized
out>, pdu=0x55555587b5a1, length=<optimized out>,
user_data=0x5555558a39a0) at attrib/gattrib.c:273
#3  0x00005555555f74a8 in handle_rsp (pdu_len=<optimized out>,
pdu=<optimized out>, opcode=<optimized out>, att=0x55555588ff30) at
src/shared/att.c:714
#4  can_read_data (io=<optimized out>, user_data=0x55555588ff30) at
src/shared/att.c:886
#5  0x0000555555600733 in watch_callback (channel=<optimized out>,
cond=<optimized out>, user_data=<optimized out>) at
src/shared/io-glib.c:170
#6  0x00007ffff7b0a285 in g_main_context_dispatch () from
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#7  0x00007ffff7b0a650 in ?? () from /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#8  0x00007ffff7b0a962 in g_main_loop_run () from
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#9  0x0000555555572419 in main (argc=<optimized out>, argv=<optimized
out>) at src/main.c:781


Program received signal SIGSEGV, Segmentation fault.
g_attrib_get_buffer (attrib=attrib@entry=0x31,
len=len@entry=0x7fffffffdfd0) at attrib/gattrib.c:437
437 attrib/gattrib.c: No such file or directory.
(gdb) bt
#0  g_attrib_get_buffer (attrib=attrib@entry=0x31,
len=len@entry=0x7fffffffdfd0) at attrib/gattrib.c:437
#1  0x000055555559eb79 in gatt_write_char (attrib=attrib@entry=0x31,
handle=handle@entry=37, value=value@entry=0x7fffffffe086 "\001",
vlen=vlen@entry=2, func=func@entry=0x555555598050
<report_ccc_written_cb>, user_data=user_data@entry=0x55555589ce20) at
attrib/gatt.c:956
#2  0x00005555555963fc in write_char (hog=0x5555558664f0, attrib=0x31,
handle=<optimized out>, value=value@entry=0x7fffffffe086 "\001",
vlen=vlen@entry=2, func=func@entry=0x555555598050
<report_ccc_written_cb>, user_data=0x5555558624e0) at
profiles/input/hog-lib.c:174
#3  0x000055555559800a in write_ccc (user_data=0x5555558624e0,
handle=<optimized out>, attrib=<optimized out>, hog=<optimized out>)
at profiles/input/hog-lib.c:360
#4  ccc_read_cb (status=<optimized out>, pdu=<optimized out>,
len=<optimized out>, user_data=<optimized out>) at
profiles/input/hog-lib.c:377
#5  0x000055555559d40e in read_char_helper (status=<optimized out>,
rpdu=0x555555876ef0 "\v", rlen=3, user_data=0x55555586cf40) at
attrib/gatt.c:841
#6  0x000055555559f32b in attrib_callback_result (opcode=<optimized
out>, pdu=0x55555587a671, length=<optimized out>,
user_data=0x55555589dfa0) at attrib/gattrib.c:273
#7  0x00005555555f74a8 in handle_rsp (pdu_len=<optimized out>,
pdu=<optimized out>, opcode=<optimized out>, att=0x555555897f00) at
src/shared/att.c:714
#8  can_read_data (io=<optimized out>, user_data=0x555555897f00) at
src/shared/att.c:886
#9  0x0000555555600733 in watch_callback (channel=<optimized out>,
cond=<optimized out>, user_data=<optimized out>) at
src/shared/io-glib.c:170
#10 0x00007ffff7b0a285 in g_main_context_dispatch () from
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#11 0x00007ffff7b0a650 in ?? () from /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#12 0x00007ffff7b0a962 in g_main_loop_run () from
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#13 0x0000555555572419 in main (argc=<optimized out>, argv=<optimized
out>) at src/main.c:781



Program received signal SIGSEGV, Segmentation fault.
enc_write_req (handle=handle@entry=37,
value=value@entry=0x7fffffffe086 "\001", vlen=vlen@entry=2,
pdu=pdu@entry=0x40 <error: Cannot access memory at address 0x40>,
len=0) at attrib/att.c:633
633 attrib/att.c: No such file or directory.
(gdb) bt
#0  enc_write_req (handle=handle@entry=37,
value=value@entry=0x7fffffffe086 "\001", vlen=vlen@entry=2,
pdu=pdu@entry=0x40 <error: Cannot access memory at address 0x40>,
len=0) at attrib/att.c:633
#1  0x000055555559eba0 in gatt_write_char
(attrib=attrib@entry=0x555555874f90, handle=handle@entry=37,
value=value@entry=0x7fffffffe086 "\001", vlen=vlen@entry=2,
func=func@entry=0x555555598050 <report_ccc_written_cb>,
user_data=user_data@entry=0x5555558969b0)
    at attrib/gatt.c:963
#2  0x00005555555963fc in write_char (hog=0x555555883ee0,
attrib=0x555555874f90, handle=<optimized out>,
value=value@entry=0x7fffffffe086 "\001", vlen=vlen@entry=2,
func=func@entry=0x555555598050 <report_ccc_written_cb>,
user_data=0x5555558840e0)
    at profiles/input/hog-lib.c:174
#3  0x000055555559800a in write_ccc (user_data=0x5555558840e0,
handle=<optimized out>, attrib=<optimized out>, hog=<optimized out>)
at profiles/input/hog-lib.c:360
#4  ccc_read_cb (status=<optimized out>, pdu=<optimized out>,
len=<optimized out>, user_data=<optimized out>) at
profiles/input/hog-lib.c:377
#5  0x000055555559d40e in read_char_helper (status=<optimized out>,
rpdu=0x55555587fe00 "\v", rlen=3, user_data=0x55555586d140) at
attrib/gatt.c:841
#6  0x000055555559f32b in attrib_callback_result (opcode=<optimized
out>, pdu=0x55555587b1e1, length=<optimized out>,
user_data=0x55555586c5e0) at attrib/gattrib.c:273
#7  0x00005555555f74a8 in handle_rsp (pdu_len=<optimized out>,
pdu=<optimized out>, opcode=<optimized out>, att=0x55555587dd30) at
src/shared/att.c:714
#8  can_read_data (io=<optimized out>, user_data=0x55555587dd30) at
src/shared/att.c:886
#9  0x0000555555600733 in watch_callback (channel=<optimized out>,
cond=<optimized out>, user_data=<optimized out>) at
src/shared/io-glib.c:170
#10 0x00007ffff7b0a285 in g_main_context_dispatch () from
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#11 0x00007ffff7b0a650 in ?? () from /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#12 0x00007ffff7b0a962 in g_main_loop_run () from
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#13 0x0000555555572419 in main (argc=<optimized out>, argv=<optimized
out>) at src/main.c:781

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-07-16 21:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-16 21:34 segfault when CCD are present in two different HOG services mathieu.stephan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).