diff mbox series

[v1] dbus: Fix add invalid memory during interface removal

Message ID 20250327084128.3315736-1-quic_shuaz@quicinc.com
State New
Headers show
Series [v1] dbus: Fix add invalid memory during interface removal | expand

Commit Message

Shuai Zhang March 27, 2025, 8:41 a.m. UTC
test setp
register_service <uuid>
register_application <uuid>
unregister_service <uuid>
unregister_application
register_service <uuid>
register_application <uuid>   
core dump

invalidate_parent_data is called to add the service to the application's
glist when unregister_service. However, this service has already been
added to the glist of root object in register_service. This results in
services existing in both queues,but only the services in the
application's glist are freed upon removal. A null address is stored
in root object's glist, a crash dump will occur when get_object is called.

Add a check for the parent pointer to avoid adding the service again.

0  0x0000007ff7df6058 in dbus_message_iter_append_basic ()
   from /usr/lib/libdbus-1.so.3
1  0x00000055555a3780 in append_object (data=0x31306666,
  user_data=0x7ffffff760) at /usr/src/debug/bluez5/5.72/gdbus/object.c:1117
2  0x0000007ff7ece0cc in g_slist_foreach () from /usr/lib/libglib-2.0.so.0
3  0x00000055555a37ac in append_object (data=0x5555642cf0,
  user_data=0x7ffffff760) at /usr/src/debug/bluez5/5.72/gdbus/object.c:1122
4  0x0000007ff7ece0cc in g_slist_foreach () from /usr/lib/libglib-2.0.so.0
5  0x00000055555a3630 in get_objects (connection=<optimized out>,
    message=<optimized out>, user_data=0x555563b390)
    at /usr/src/debug/bluez5/5.72/gdbus/object.c:1154
6  0x00000055555a51d0 in process_message (
    connection=connection@entry=0x5555639310,
    message=message@entry=0x5555649ac0,
    method=method@entry=0x55555facf8 <manager_methods>,
    iface_user_data=<optimized out>)
    at /usr/src/debug/bluez5/5.72/gdbus/object.c:246
7  0x00000055555a575c in generic_message (connection=0x5555639310,
    message=0x5555649ac0, user_data=<optimized out>)

Signed-off-by: Shuai Zhang <quic_shuaz@quicinc.com>
---
 gdbus/object.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Shuai Zhang March 31, 2025, 6:53 a.m. UTC | #1
Hi Luiz

On 3/27/2025 11:10 PM, Luiz Augusto von Dentz wrote:
> Hi Shuai,
> 
> On Thu, Mar 27, 2025 at 10:58 AM Luiz Augusto von Dentz
> <luiz.dentz@gmail.com> wrote:
>>
>> Hi Shuai,
>>
>> On Thu, Mar 27, 2025 at 4:41 AM Shuai Zhang <quic_shuaz@quicinc.com> wrote:
>>>
>>> test setp
>>> register_service <uuid>
>>> register_application <uuid>
>>> unregister_service <uuid>
>>> unregister_application
>>> register_service <uuid>
>>> register_application <uuid>
>>> core dump
>>
>> Ok, what exactly are you talking about above, you are not referring to
>> D-Bus api it seems, are these bluetoothctl commands?
> 
> Tried this with bluetoothctl, doesn't seem to trigger any errors:
> 
> https://gist.github.com/Vudentz/7b20ff8b59e3122606a2239e1b63aa8a
> 

This error is a probabilistic issue, and the frequency of reproduction is 
quite high. I have left the reproduction commit in your GitHub glist.

>>
>>> invalidate_parent_data is called to add the service to the application's
>>> glist when unregister_service. However, this service has already been
>>> added to the glist of root object in register_service. This results in
>>> services existing in both queues,but only the services in the
>>> application's glist are freed upon removal. A null address is stored
>>> in root object's glist, a crash dump will occur when get_object is called.
>>>
>>> Add a check for the parent pointer to avoid adding the service again.
>>>
>>> 0  0x0000007ff7df6058 in dbus_message_iter_append_basic ()
>>>    from /usr/lib/libdbus-1.so.3
>>> 1  0x00000055555a3780 in append_object (data=0x31306666,
>>>   user_data=0x7ffffff760) at /usr/src/debug/bluez5/5.72/gdbus/object.c:1117
>>> 2  0x0000007ff7ece0cc in g_slist_foreach () from /usr/lib/libglib-2.0.so.0
>>> 3  0x00000055555a37ac in append_object (data=0x5555642cf0,
>>>   user_data=0x7ffffff760) at /usr/src/debug/bluez5/5.72/gdbus/object.c:1122
>>> 4  0x0000007ff7ece0cc in g_slist_foreach () from /usr/lib/libglib-2.0.so.0
>>> 5  0x00000055555a3630 in get_objects (connection=<optimized out>,
>>>     message=<optimized out>, user_data=0x555563b390)
>>>     at /usr/src/debug/bluez5/5.72/gdbus/object.c:1154
>>> 6  0x00000055555a51d0 in process_message (
>>>     connection=connection@entry=0x5555639310,
>>>     message=message@entry=0x5555649ac0,
>>>     method=method@entry=0x55555facf8 <manager_methods>,
>>>     iface_user_data=<optimized out>)
>>>     at /usr/src/debug/bluez5/5.72/gdbus/object.c:246
>>> 7  0x00000055555a575c in generic_message (connection=0x5555639310,
>>>     message=0x5555649ac0, user_data=<optimized out>)
>>>
>>> Signed-off-by: Shuai Zhang <quic_shuaz@quicinc.com>
>>> ---
>>>  gdbus/object.c | 3 ++-
>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/gdbus/object.c b/gdbus/object.c
>>> index 7b0476f1a..d87a81160 100644
>>> --- a/gdbus/object.c
>>> +++ b/gdbus/object.c
>>> @@ -809,7 +809,8 @@ static struct generic_data *invalidate_parent_data(DBusConnection *conn,
>>>
>>>         if (child == NULL || g_slist_find(data->objects, child) != NULL)
>>>                 goto done;
>>> -
>>> +       if(g_slist_find(parent->objects, child) != NULL)
>>> +               goto done;
>>
>> Use empty lines after if statements, and keep the one you are removing.
>>
>>
>>>         data->objects = g_slist_prepend(data->objects, child);
>>>         child->parent = data;
>>>
>>> --
>>> 2.34.1
>>>
>>>
>>
>>
>> --
>> Luiz Augusto von Dentz
> 
> 
>
diff mbox series

Patch

diff --git a/gdbus/object.c b/gdbus/object.c
index 7b0476f1a..d87a81160 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -809,7 +809,8 @@  static struct generic_data *invalidate_parent_data(DBusConnection *conn,
 
 	if (child == NULL || g_slist_find(data->objects, child) != NULL)
 		goto done;
-
+	if(g_slist_find(parent->objects, child) != NULL)
+		goto done;
 	data->objects = g_slist_prepend(data->objects, child);
 	child->parent = data;