aboutsummaryrefslogtreecommitdiffstats
path: root/gdbus
AgeCommit message (Collapse)AuthorFilesLines
2016-07-14gdbus/client: Use g_dbus_send_message if callback is not setLuiz Augusto von Dentz1-12/+14
If the user don't set a function it means it doesn't care about the reply so g_dbus_send_message can be used.
2016-07-14gdbus/client: Always call ready callbackLuiz Augusto von Dentz1-3/+3
Call ready callback regardless of the reply to GetManagedObjects since otherwise the user code will be left waiting forever when in fact no proxy will be created.
2015-12-29gdbus: Move typedefs for interwork with strict compilersGrant Erickson1-6/+6
Move enumeration type defintions AFTER the enumerations themselves are declared and defined such that the header works with strict compilers. This occurs when building a plugin, compiled with C++, and occurs on all of: arm-none-linux-gnueabi-g++ (Sourcery G++ Lite 2010q1-202) 4.4.1 arm-poky-linux-gnueabi-g++ (GCC) 4.8.2 g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
2015-12-29gdbus: Fix Memory LeakSaurav Babu1-25/+25
Members of data are allocated memory but not freed only data is freed
2015-12-29gdbus: Drop message replies if the sender requested no replyPhilip Withnall1-1/+2
If the sender flags a D-Bus message as not expecting a reply, it is against system bus policy to send a reply — sending one will result in errors being sent to us by dbus-daemon. Magically drop all replies to messages which request no reply. ofonod is one process which sends BlueZ messages which request no reply, when it is setting up a hands-free agent. This is not a complete fix. In an ideal world, the existing check for G_DBUS_METHOD_FLAG_NOREPLY would be dropped, as the server should be prepared to return a reply to every method, if the client requests and expects one — otherwise the client will time out. However, that’s a much bigger change with a much bigger risk of breaking things, so I’ll stick with this for now.
2015-12-29gdbus: Remove unnecessary empty lineJohan Hedberg1-1/+0
2015-12-29gdbus: add method for immediate property updateJakub Pawlowski2-3/+23
g_dbus_emit_property_changed doesn't send dbus signal immediately. Instead it stores changed properties, and schedule signal to be send at g_iddle_add. Additionally, if this method is called few times for some property, only last value will be sent in property changed signal. If remote device sends lots of notifications, they're all scheduled to be notified using this method. This might result in some notifications being lost. This patch adds new method, that can immediately send property changed signal, instead of sheduling it for nearest iddle moment.
2015-04-20gdbus: Close private connection if setup failsLuiz Augusto von Dentz1-0/+1
Private connection should be properly closed with dbus_connection_close otherwise libdbus exits with the following error: 'The last reference on a connection was dropped without closing the connection. This is a bug in an application. See dbus_connection_unref() documentation for details. Most likely, the application was supposed to call dbus_connection_close(), since this is a private connection.'
2015-04-09gdbus: Fix crash in g_dbus_create_error_valistSzymon Janc1-1/+4
Passing NULL format parameter to vsnprintf results in invalid argument error on glibc. But with some other libc libraries (musl and uClibc) this results in dereferencing NULL pointer and crash due to segmentation fault.
2015-04-09gdbus: Use g_dbus_create_error_valist internallySzymon Janc1-4/+1
There is no need to duplicate code in g_dbus_send_error_valist.
2015-04-07gdbus: Add g_dbus_get_flags functionMichael Janssen2-0/+6
The g_dbus_get_flags function enables detection of when the G_DBUS_FLAG_ENABLE_EXPERIMENTAL is set.
2015-03-26gdbus: Make GDBusClient work without ObjectManagerLuiz Augusto von Dentz1-2/+7
This makes GDBusClient work normally without ObjectManager.
2015-03-26gdbus/client: Allow specifying ObjectManager pathArman Uguray2-6/+22
GDBusClient currently hard-codes "/" as the remote ObjectManager path. This is generally incorrect, as an application can choose to expose an ObjectManager at any well-known path. This patch fixes this by allowing the user to pass in the ObjectManager path by introducing a new conctructor "g_dbus_client_new_full".
2015-03-26gdbus/client: Don't GetManagedObjects w/o handlersArman Uguray1-1/+2
The client code currently issues GetManagedObjects if new handlers are set via g_dbus_client_set_proxy_handlers. An application may set these to NULL before unref'ing a client or to simply prevent further events. Hence, there is no need to refresh objects or properties if all handlers are NULL.
2015-02-24gdbus: Fix not calling disconnect functionSzymon Janc1-3/+4
If daemon gets disconnected from D-Bus sender is NULL. Watches that was explicitly added with NULL sender (ie disconnected_signal in g_dbus_set_disconnect_function) should be called anyway.
2015-02-22gdbus: Don't refresh objects/props if disconnectedArman Uguray1-5/+8
If g_dbus_client_set_proxy_handlers gets called from within a proxy_removed callback, the code may end up refreshing the proxy's properties and incorrectly access the client's proxy_list as it gets freed. This patch fixes this, so that get_managed_objects does nothing if it gets called during a service disconnect.
2014-09-15gdbus: Fix match rule for NameOwnerChangedAlban Crequy1-1/+2
When subscribing to the D-Bus signal NameOwnerChanged from the bus driver, specify the object path and the sender in the match rule. Otherwise, random connections on the bus could impersonate the bus driver.
2014-09-08gdbus: Fix crash when watch is toggled or disconnectedLuiz Augusto von Dentz1-2/+8
This partially reverts 510b32b7156625b9df737c916b7a7a5c6fb285b9 since it still necessary to take a reference before calling dbus_watch_handle since internally it can call watch_info_free as in the following trace: Invalid read of size 8 at 0x121085: watch_func (mainloop.c:105) by 0x4C72694: g_main_context_dispatch (gmain.c:2539) by 0x4C729C7: g_main_context_iterate.isra.23 (gmain.c:3146) by 0x4C72DC1: g_main_loop_run (gmain.c:3340) by 0x120541: main (main.c:551) Address 0x5bbcd90 is 16 bytes inside a block of size 24 free'd at 0x4A079AE: free (vg_replace_malloc.c:427) by 0x4C7837E: g_free (gmem.c:252) by 0x4F708BF: dbus_watch_set_data (dbus-watch.c:614) by 0x4F70938: _dbus_watch_unref (dbus-watch.c:132) by 0x4F6E9A7: _dbus_transport_handle_watch (dbus-transport.c:884) by 0x4F59AFB: _dbus_connection_handle_watch (dbus-connection.c:1497) by 0x4F70AF9: dbus_watch_handle (dbus-watch.c:683) by 0x121084: watch_func (mainloop.c:103) by 0x4C72694: g_main_context_dispatch (gmain.c:2539) by 0x4C729C7: g_main_context_iterate.isra.23 (gmain.c:3146) by 0x4C72DC1: g_main_loop_run (gmain.c:3340) by 0x120541: main (main.c:551)
2014-09-08gdbus: Fix crash when calling g_dbus_add_service_watchLuiz Augusto von Dentz1-1/+0
If g_dbus_add_service_watch is called for service which bus name is already known the following crash can happen: invalid read of size 1 at 0x4C2A2F2: strlen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4E97722: g_strdup (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x405B0C: update_name_cache (watch.c:435) by 0x405C37: update_service (watch.c:593) by 0x4E7A2A5: g_main_context_dispatch (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x4E7A627: ??? (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x4E7AA39: g_main_loop_run (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x4038EA: client_ready (test-gdbus-client.c:1014) by 0x4E9E5E0: ??? (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x4E9E7A5: ??? (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x4E9EB1A: g_test_run_suite (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x403614: main (test-gdbus-client.c:1058) Address 0x5dbe5d0 is 0 bytes inside a block of size 7 free'd at 0x4C28577: free (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4E7FF7E: g_free (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x405B04: update_name_cache (watch.c:434) by 0x405C37: update_service (watch.c:593) by 0x4E7A2A5: g_main_context_dispatch (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x4E7A627: ??? (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x4E7AA39: g_main_loop_run (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x4038EA: client_ready (test-gdbus-client.c:1014) by 0x4E9E5E0: ??? (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x4E9E7A5: ??? (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x4E9EB1A: g_test_run_suite (in /usr/lib64/libglib-2.0.so.0.3800.2) by 0x403614: main (test-gdbus-client.c:1058)
2014-09-08Revert "gdbus: Don't include just added interfaces in GetManagedObjects"Luiz Augusto von Dentz1-7/+1
This actually creates a problem since the code now does flush any pending message on the queue any signal will be send right away before the actual reply to GetManagedObjects which will not contain those interfaces.
2014-09-08gdbus: Fix use after freeAndrei Emeltchenko1-3/+8
Refactor filter_data_remove_callback so that we do not iterate over freed pointer.
2014-09-08gdbus: Avoid reporting GDBusClient disconnect twiceClaudio Takahasi1-2/+12
No matter if disconnection was reported previously, g_dbus_client_unref() was always calling service disconnect callback. This patch fix the following scenario: 1) service disconnects from the bus 2) disconnect callback gets called 3) client calls g_dbus_client_unref(), disconnect callback is called again.
2014-03-24gdbus: Add g_dbus_proxy_set_property_arrayClaudio Takahasi2-0/+92
This patch adds a new gdbus utility function to allow setting a property of fixed, and non-fixed values array.
2014-03-06gdbus: Add g_dbus_client_set_ready_watch()Claudio Takahasi2-1/+20
This patch adds a new gdbus helper to notify the clients that GetManagedObjects reply was received and the last proxy has been informed previously by the proxy_added callback.
2014-02-18gdbus: Replace g_timeout_add with g_idle_addLuiz Augusto von Dentz1-4/+1
Passing 0 as timeout to g_timeout_add should equivalent to g_idle_add.
2014-02-18gdbus: Fix incorrect DBusConnection reference countingAnderson Lizardo1-10/+4
Commit abfc2b0dd5c3e33abfdf1a815b16d492c1751c06 attempted to fix a crash related to improper reference counting, but the main issue was that the reference was taken only during the function call (which is usually unnecessary for single thread), but still passed a pointer to DBusConnection to a function that is called by the mainloop. This left a window where the DBusConnection can be destroyed. Fixes this crash on unit/test-gdbus-client: ==32642== Invalid read of size 4 ==32642== at 0x690D0A6: dbus_connection_ref (in /lib/i386-linux-gnu/libdbus-1.so.3.7.6) ==32642== by 0x804CEDB: message_dispatch (mainloop.c:73) ==32642== by 0x684580E: g_timeout_dispatch (gmain.c:4450) ==32642== by 0x6844A75: g_main_context_dispatch (gmain.c:3065) ==32642== by 0x6844E14: g_main_context_iterate.isra.23 (gmain.c:3712) ==32642== by 0x68452FA: g_main_loop_run (gmain.c:3906) ==32642== by 0x804C7D3: client_connect_disconnect (test-gdbus-client.c:188) ==32642== by 0x6868DB2: g_test_run_suite_internal (gtestutils.c:2067) ==32642== by 0x6868F8D: g_test_run_suite_internal (gtestutils.c:2138) ==32642== by 0x6869320: g_test_run_suite (gtestutils.c:2189) ==32642== by 0x686936B: g_test_run (gtestutils.c:1508) ==32642== by 0x696D4D2: (below main) (libc-start.c:226) ==32642== Address 0x709c6e4 is 140 bytes inside a block of size 144 free'd ==32642== at 0x67E806C: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==32642== by 0x692D62E: dbus_free (in /lib/i386-linux-gnu/libdbus-1.so.3.7.6) ==32642== by 0x690E1C2: ??? (in /lib/i386-linux-gnu/libdbus-1.so.3.7.6) ==32642== by 0x804AAEC: destroy_context (test-gdbus-client.c:104) ==32642== by 0x6868DB2: g_test_run_suite_internal (gtestutils.c:2067) ==32642== by 0x6868F8D: g_test_run_suite_internal (gtestutils.c:2138) ==32642== by 0x6869320: g_test_run_suite (gtestutils.c:2189) ==32642== by 0x686936B: g_test_run (gtestutils.c:1508) ==32642== by 0x696D4D2: (below main) (libc-start.c:226)
2014-02-18gdbus: Fix memory leakAnderson Lizardo1-0/+2
data->conn and data->path must be destroyed before freeing "data".
2013-11-11gdbus: Fix trying to remove already removed sourcesBastien Nocera1-0/+3
When we return FALSE from idle handlers, the source is removed. This will be causing warnings in glib 2.40. See https://bugzilla.gnome.org/show_bug.cgi?id=710724
2013-10-14gdbus: Remove not needed check for NULL DBusPendingCallSzymon Janc1-5/+0
It is now checked by g_dbus_send_message_with_reply() so there is no need to double check that in caller.
2013-10-14gdbus: Check for NULL DBusPendingCall in g_dbus_send_message_with_replySzymon Janc1-1/+10
"Warning: if the connection is disconnected or you try to send Unix file descriptors on a connection that does not support them, the DBusPendingCall will be set to NULL, so be careful with this." Check this in g_dbus_send_message_with_reply so that callers don't need to double check for NULL if g_dbus_send_message_with_reply returned TRUE. This also fix crash if passing FD over D-Bus is blocked e.g. by SELinux policy. bluetoothd[1894]: profiles/audio/avdtp.c:session_cb() bluetoothd[1894]: profiles/audio/avdtp.c:avdtp_parse_cmd() Received SET_CONFIGURATION_CMD bluetoothd[1894]: profiles/audio/a2dp.c:endpoint_setconf_ind() Source 0x6c5000: Set_Configuration_Ind bluetoothd[1894]: profiles/audio/avdtp.c:avdtp_ref() 0x6df360: ref=1 bluetoothd[1894]: profiles/audio/a2dp.c:setup_ref() 0x6d32b0: ref=1 process 1894: arguments to dbus_pending_call_set_notify() were incorrect, assertion "pending != NULL" failed in file dbus-pending-call.c line 636. This is normally a bug in some application using the D-Bus library.
2013-09-12gdbus/client: Use g_dbus_add_properties_watch to track propertiesLuiz Augusto von Dentz1-79/+56
This make the handling much simpler and avoids duplicates of the same match rule.
2013-09-12gdbus/client: Use g_dbus_add_signal_watch to track signalsLuiz Augusto von Dentz1-36/+37
This make the handling much simpler and avoids duplicates of the same match rule.
2013-09-12gdbus/client: Use g_dbus_add_service_watch to track servicesLuiz Augusto von Dentz1-135/+38
This make the handling much simpler and avoids duplicates of the same match rule.
2013-09-12gdbus/watch: Fix crash when disconnecting from D-BusLuiz Augusto von Dentz1-0/+2
When disconnecting from D-Bus a message could be recieved with no sender: Invalid read of size 1 at 0x4A09EE1: strcmp (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x3B03C386B8: g_str_equal (in /usr/lib64/libglib-2.0.so.0.3600.3) by 0x4065D6: message_filter (watch.c:529) by 0x3B0700F9E5: dbus_connection_dispatch (in /usr/lib64/libdbus-1.so.3.7.4) by 0x4052E7: message_dispatch (mainloop.c:76) by 0x3B03C48962: ??? (in /usr/lib64/libglib-2.0.so.0.3600.3) by 0x3B03C47E05: g_main_context_dispatch (in /usr/lib64/libglib-2.0.so.0.3600.3) by 0x3B03C48157: ??? (in /usr/lib64/libglib-2.0.so.0.3600.3) by 0x3B03C48559: g_main_loop_run (in /usr/lib64/libglib-2.0.so.0.3600.3) by 0x4038C5: client_proxy_removed (test-gdbus-client.c:902) by 0x3B03C6B566: ??? (in /usr/lib64/libglib-2.0.so.0.3600.3) by 0x3B03C6B6E5: ??? (in /usr/lib64/libglib-2.0.so.0.3600.3) Address 0x0 is not stack'd, malloc'd or (recently) free'd
2013-09-12gdbus/watch: Fix aborting when removing D-Bus filterLuiz Augusto von Dentz1-17/+8
In case of filter_data having a watch to a service name it may call dbus_connection_remove_filter twice causing libdbus to abort: process 24723: Attempt to remove filter function 0x4063e0 user data (nil), but no such filter has been added To fix this the code will now only attempt to call dbus_connection_remove_filter once in filter_data_free which is the counterpart of filter_data_get where dbus_connection_add_filter is called.
2013-09-12gdbus/watch: Fix crash when g_dbus_remove_watch is called from connect callbackLuiz Augusto von Dentz1-2/+6
at 0x40570C: update_service (watch.c:601) by 0x40584B: service_reply (watch.c:627) by 0x3B0700C511: ??? (in /usr/lib64/libdbus-1.so.3.7.4) by 0x3B0700F740: dbus_connection_dispatch (in /usr/lib64/libdbus-1.so.3.7.4) by 0x405167: message_dispatch (mainloop.c:76) by 0x3B03C48962: ??? (in /usr/lib64/libglib-2.0.so.0.3600.3) by 0x3B03C47E05: g_main_context_dispatch (in /usr/lib64/libglib-2.0.so.0.3600.3) by 0x3B03C48157: ??? (in /usr/lib64/libglib-2.0.so.0.3600.3) by 0x3B03C48559: g_main_loop_run (in /usr/lib64/libglib-2.0.so.0.3600.3) Address 0x4c58a30 is 32 bytes inside a block of size 56 free'd at 0x4A074C4: free (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x3B03C4D9AE: g_free (in /usr/lib64/libglib-2.0.so.0.3600.3) by 0x406102: filter_data_remove_callback (watch.c:378) by 0x405FC0: g_dbus_remove_watch (watch.c:798) by 0x40A22B: g_dbus_client_unref (client.c:1227) by 0x40570B: update_service (watch.c:599) by 0x40584B: service_reply (watch.c:627)
2013-09-10gdbus: Fix emitting PropertiesChanged twiceLuiz Augusto von Dentz1-2/+2
This fixes double emission of PropertiesChanged introduced by flushing changes, the flushing can happen during the pending processing so the pending_prop flag needs to be updated in the beginning and the list of properties can be freed before g_dbus_send_message as it is not required anymore.
2013-09-10gdbus: Avoid calling dbus_connection_send*Luiz Augusto von Dentz2-64/+42
dbus_connection_send* should not be called directly except by g_dbus_send_message.
2013-09-10gdbus: Add g_dbus_send_message_with_replyLuiz Augusto von Dentz2-0/+14
g_dbus_send_message_with_reply flushes pending signals before calling dbus_connection_send_with_reply so it does not alter the message order
2013-09-10gdbus: Fix sending ObjectManager/Properties signals out of orderLuiz Augusto von Dentz1-16/+53
In some cases the order of the messages is altered when a message is sent without processing the pending signals first, currently this affect client_check_order unit test: /gdbus/client_check_order: ** ERROR:unit/test-gdbus-client.c:795:property_check_order: assertion failed: (g_strcmp0(string, "value1") == 0) As can be observed the value of the property is not yet updated because the signal it is still pending, once this fix is applied the test pass: /gdbus/client_check_order: OK Note that the flushing only works when g_dbus_send_message is used so places where dbus_connection_send and other variants are called directly may still change the order.
2013-06-19gdbus: Remove proxies when client disconnectsHenrique Dante de Almeida1-0/+4
Remove proxies and generate proxy_removed callbacks even when there are no corresponding InterfaceRemoved signals. This patch fixes having zombie gdbus proxy object when a server disconnects without sending InterfaceRemoved signals. These objects may interact with new server instances, for example, making InterfaceAdded signals of new objects with the same name be filtered out as duplicated, or staying allocated, but unused, if the new server doesn't reuse the object paths. Note that as a side-effect, the lifetime of a gdbus proxy becomes stricter: it lives at most for the duration of a single connection to a single instance of a server process.
2013-05-08gdbus: Fix using NULL DBusPendingCall when disconnected from D-BusAnderson Lizardo1-0/+5
From D-Bus documentation for dbus_connection_send_with_reply(): "Warning: if the connection is disconnected or you try to send Unix file descriptors on a connection that does not support them, the DBusPendingCall will be set to NULL, so be careful with this." Fix these errors when killing D-Bus daemon with the client still running: process 5712: arguments to dbus_pending_call_set_notify() were incorrect, assertion "pending != NULL" failed in file ../../dbus/dbus-pending-call.c line 596. This is normally a bug in some application using the D-Bus library. process 5712: arguments to dbus_pending_call_unref() were incorrect, assertion "pending != NULL" failed in file ../../dbus/dbus-pending-call.c line 572. This is normally a bug in some application using the D-Bus library.
2013-05-08gdbus: Fix segfault when D-Bus daemon exitsAnderson Lizardo1-0/+2
Fix this crash if D-Bus exits while the client is still connected to it: ==5570== Invalid read of size 1 ==5570== at 0x402D28E: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==5570== by 0x4070E22: g_str_equal (ghash.c:1704) ==5570== by 0x8055F61: message_filter (client.c:1123) ==5570== by 0x4141500: dbus_connection_dispatch (in /lib/i386-linux-gnu/libdbus-1.so.3.5.8) ==5570== by 0x80506F7: message_dispatch (mainloop.c:76) ==5570== by 0x4081A7E: g_timeout_dispatch (gmain.c:3882) ==5570== by 0x4080D85: g_main_context_dispatch (gmain.c:2539) ==5570== by 0x4081124: g_main_context_iterate.isra.21 (gmain.c:3146) ==5570== by 0x408156A: g_main_loop_run (gmain.c:3340) ==5570== by 0x41BF4D2: (below main) (libc-start.c:226) ==5570== Address 0x0 is not stack'd, malloc'd or (recently) free'd ==5570== ==5570==
2013-05-03gdbus: Fix calling GetManagedObjects twice in a rowLuiz Augusto von Dentz1-7/+18
Calling g_dbus_client_new followed by g_dbus_client_set_proxy_handlers cause two calls to GetManagedObjects in a row as GetNameOwner reply is asyncronously it triggers the second call because the handlers have been set by g_dbus_client_set_proxy_handlers.
2013-04-08gdbus: Use gcc builtin instead of g_atomicLucas De Marchi1-6/+6
g_atomic_* end up using G_STATIC_ASSERT, causing gcc 4.8 to yell due to -Wunused-local-typedefs. gdbus/client.c: In function ‘g_dbus_client_ref’: /usr/include/glib-2.0/glib/gmacros.h:162:53: error: typedef ‘_GStaticAssertCompileTimeAssertion_2’ locally defined but not used [-Werror=unused-local-typedefs] #define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1]
2013-04-08gdbus: Fix not calling property_changed callbackLuiz Augusto von Dentz1-13/+10
In case a property did not appear by the time proxy_added was called property_changed has to be called if it appear latter otherwise the application will be unaware of it.
2013-02-23gdbus: Always unreference the message in g_dbus_send_message()Tomasz Bursztyka1-2/+3
A quick fix on g_dbus_send_message(), if check_signal() fails it returns FALSE without unreferencing the message as it should. This patch fixes it.
2013-02-15gdbus: Add g_dbus_proxy_set_removed_watchDenis Kenzior2-0/+20
2013-02-14gdbus: Fix missing PropertiesChanged signalVinicius Costa Gomes1-2/+5
If D-Bus ObjectManager is not supported, InterfacesAdded signal checking needs to be ignored otherwise PropertiesChanged signal will never be sent.
2013-02-11gdbus: Don't call property changed callback during client initMarcel Holtmann1-9/+10
When the client uses ObjectManager to init properties, do not call property changed callbacks. They should only be called once the proxy added has been successfully signaled since the proxy itself provides a full copy of available properties.
2013-02-01gdbus: Fix unpublished interface signal emissionJohan Hedberg1-0/+4
If we haven't published an interface yet (i.e. it's in the data->added list), we should just ignore any property changed indications as the values for the properties will anyway be part of the InterfacesAdded signal.
2013-01-20gdbus: Check for valid path before handling propertiesMarcel Holtmann1-0/+6
2013-01-06gdbus: Fix memory leak on properties_set()Anderson Lizardo1-1/+6
The pointer returned by dbus_message_iter_get_signature() must be freed with dbus_free(). Fixes this memory leak: ==1857== 16 bytes in 1 blocks are definitely lost in loss record 104 of 251 ==1857== at 0x402BF52: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==1857== by 0x415E286: dbus_realloc (in /lib/i386-linux-gnu/libdbus-1.so.3.5.8) ==1857== by 0x415E70B: ??? (in /lib/i386-linux-gnu/libdbus-1.so.3.5.8) ==1857== by 0x415F17B: ??? (in /lib/i386-linux-gnu/libdbus-1.so.3.5.8) ==1857== by 0x414CB33: dbus_message_iter_get_signature (in /lib/i386-linux-gnu/libdbus-1.so.3.5.8) ==1857== by 0x8053239: properties_set (object.c:899) ==1857== by 0x5FFFFF: ??? ==1857==
2013-01-05gdbus: Check signature of property value before calling setterMarcel Holtmann1-0/+5
2013-01-03gdbus: Don't include just added interfaces in GetManagedObjectsLucas De Marchi1-1/+7
If we received a call to ObjectManager.GetManagedObject we should not include in the response the interfaces in data->added. This is because it's not guaranteed that those interfaces will trigger an InterfacesAdded signal, which is the case if the interface is removed in the same mainloop iteration.
2013-01-03gdbus: Simplify generated introspectionLucas De Marchi1-65/+38
The generated introspection is not supposed to be read as is by human, so there's no point in printing the indentation or writing more code to use auto-close tags. If it's desired to read the raw xml file, user can always use other tools to transform the output such as "xmllint --format". This also fixes a missing </property> when property is deprecated.
2013-01-02gdbus: Hold client reference during get name owner replyMarcel Holtmann1-0/+4
2012-12-30gdbus: Call check_signals when sending signals with g_dbus_send_messageLuiz Augusto von Dentz1-0/+9
If message passed to g_dbus_send_message is a signal verify if it is a valid and there really exists an interface with respective signal name.
2012-12-30gdbus: Check if the interface being registered is validLuiz Augusto von Dentz1-6/+36
This prevent registering interfaces that are empty or have all members marked as experiemental.
2012-12-30gdbus: Introduce G_DBUS_PROPERTY_FLAG_EXPERIMENTALLuiz Augusto von Dentz2-18/+33
This flag can be used to mark properties as experimental, marked properties are disabled by default and can be enabled by setting G_DBUS_FLAG_ENABLE_EXPERIMENTAL using g_dbus_set_flags.
2012-12-30gdbus: Introduce G_DBUS_SIGNAL_FLAG_EXPERIMENTALLuiz Augusto von Dentz2-4/+23
This flag can be used to mark signals as experimental, marked signals are disabled by default and can be enabled by setting G_DBUS_FLAG_ENABLE_EXPERIMENTAL using g_dbus_set_flags.
2012-12-30gdbus: Introduce G_DBUS_METHOD_FLAG_EXPERIMENTALLuiz Augusto von Dentz2-3/+45
This flag can be used to mark methods as experimental, marked methods are disable by default and can be enabled by setting G_DBUS_FLAG_ENABLE_EXPERIMENTAL using g_dbus_set_flags.
2012-12-30gdbus: Include changed properties only once per signalMarcel Holtmann1-0/+3
2012-12-29gdbus: Update properties on D-Bus client re-connectionsMarcel Holtmann1-4/+22
2012-12-29gdbus: Add function to manually refresh propertiesMarcel Holtmann2-0/+85
2012-12-29gdbus: Add support for proxy property change notificationsMarcel Holtmann2-4/+30
2012-12-29gdbus: Fix handling of client connect/disconnect signalsMarcel Holtmann1-11/+12
2012-12-29gdbus: Protect standalone proxy creation with client referenceMarcel Holtmann1-10/+8
2012-12-28gdbus: Use object manager only if callback functions are setMarcel Holtmann1-8/+7
2012-12-28gdbus: Use client service name and not hardcoded org.bluezMarcel Holtmann1-1/+1
2012-12-28gdbus: Add support for creating D-Bus proxies without object managerMarcel Holtmann2-62/+147
2012-12-22gdbus: Avoid using g_ptr_array_new_full convenience functionMarcel Holtmann1-1/+2
The g_ptr_array_new_full function only got introduced with GLib 2.30 and to avoid requiring a newer GLib use g_ptr_array_set_free_func instead.
2012-12-19gdbus: Increase the method call timeout to 5 minutesMarcel Holtmann1-1/+3
2012-12-19gdbus: Add helper for sending async error repliesMarcel Holtmann2-0/+38
2012-12-19gdbus: Fix race condition with creating duplicate client proxiesMarcel Holtmann1-0/+23
2012-12-19gdbus: Fix issue with unref of client while parsing interfacesMarcel Holtmann1-0/+8
2012-12-19gdbus: Fix issue with unref of client in connect handlerMarcel Holtmann1-0/+8
2012-12-19gdbus: Add support for D-Bus client method callsMarcel Holtmann2-0/+82
2012-12-19gdbus: Add callback support for handling property changesMarcel Holtmann2-10/+31
2012-12-19gdbus: Handle property changed signals and update propertyMarcel Holtmann1-31/+107
2012-12-19gdbus: Set property changed filter match rule for each proxyMarcel Holtmann1-40/+57
2012-12-19gdbus: Use a GPtrArray for the match rulesMarcel Holtmann1-18/+24
2012-12-19gdbus: Add support for setting D-Bus client basic propertiesMarcel Holtmann2-0/+99
2012-12-19gdbus: Deep copy of variants also requires a signatureMarcel Holtmann1-2/+7
2012-12-19gdbus: Add support for complex D-Bus client propertiesMarcel Holtmann1-16/+46
2012-12-19gdbus: Add support for D-Bus client propertiesMarcel Holtmann2-3/+126
2012-12-19gdbus: Add support for D-Bus client proxiesMarcel Holtmann2-4/+343
2012-12-19gdbus: Add helper functions for simple D-Bus clientsMarcel Holtmann2-0/+355
2012-11-30gdbus: Add g_dbus_add_properties_watch functionLuiz Augusto von Dentz2-0/+33
Convenient function to create watches for D-Bus properties.
2012-11-29gdbus: Don't automatically attach ObjectManagerLucas De Marchi2-21/+36
Let each project attach the object manager interface instead of registering it automatically.
2012-11-29gdbus: Don't register DBus.Properties with no propertiesLucas De Marchi1-3/+6
Delay registering DBus.Properties interface until the moment there are properties on that path. This is needed for objects that currently don't expose any property to not export the interface.
2012-11-26gdbus: Remove not needed NULL pointer checksSzymon Janc1-2/+2
g_strdup returns NULL if argument passed is NULL and there is no need to double check that.
2012-11-26gdbus: Replace leading spaces with tabsSyam Sidhardhan1-4/+4
Trivial formatting fix.
2012-11-26gdbus: Fix compilation error due to missing #definesSyam Sidhardhan1-0/+8
Since these are simple #define strings, we are defining it here instead of upgrading to D-Bus 1.5 or later. Log: CC gdbus/object.o gdbus/object.c: In function ‘properties_set’: gdbus/object.c:876:7: error: ‘DBUS_ERROR_UNKNOWN_PROPERTY’ undeclared (first use in this function) gdbus/object.c:876:7: note: each undeclared identifier is reported only once for each function it appears in gdbus/object.c:881:6: error: ‘DBUS_ERROR_PROPERTY_READ_ONLY’ undeclared (first use in this function) make[1]: *** [gdbus/object.o] Error 1 make: *** [all] Error 2
2012-11-26gdbus: Remove connection from pending_property functionsLucas De Marchi2-20/+17
The reply to a DBus.Properties.Set() method call should go through the same D-Bus connection. Thus remove the DBusConnection parameter from the following functions: - g_dbus_pending_property_success() - g_dbus_pending_property_error_valist() - g_dbus_pending_property_error()
2012-11-26gdbus: Fix invalid memory access during interface removalJohan Hedberg1-6/+6
If an interface is removed from the root path during the same mainloop iteration that it was added we need to check for data->added before doing the check for data->parent == NULL in the remove_interface() function. Otherwise the added interface doesn't get removed from the data->added list and will result in accessing freed memory: ==337== Invalid read of size 8 ==337== at 0x4F65AFA: dbus_message_iter_append_basic (in /usr/lib64/libdbus-1.so.3.7.1) ==337== by 0x1247B5: append_interface (object.c:556) ==337== by 0x4C8DC5C: g_slist_foreach (gslist.c:840) ==337== by 0x1261F7: process_changes (object.c:594) ==337== by 0x126372: generic_unregister (object.c:997) ==337== by 0x4F69669: ??? (in /usr/lib64/libdbus-1.so.3.7.1) ==337== by 0x4F5CE51: dbus_connection_unregister_object_path (in /usr/lib64/libdbus-1.so.3.7.1) ==337== by 0x125E81: object_path_unref (object.c:1236) ==337== by 0x126136: g_dbus_unregister_interface (object.c:1361) ==337== by 0x14CDF0: service_exit (service.c:581) ==337== by 0x177556: plugin_cleanup (plugin.c:242) ==337== by 0x12221F: main (main.c:559) ==337== Address 0x5bc1550 is 0 bytes inside a block of size 56 free'd ==337== at 0x4A079AE: free (vg_replace_malloc.c:427) ==337== by 0x4C7850E: g_free (gmem.c:252) ==337== by 0x125DB0: remove_interface (object.c:671) ==337== by 0x125E3B: object_path_unref (object.c:1230) ==337== by 0x126136: g_dbus_unregister_interface (object.c:1361) ==337== by 0x14CDF0: service_exit (service.c:581) ==337== by 0x177556: plugin_cleanup (plugin.c:242) ==337== by 0x12221F: main (main.c:559)
2012-11-26gdbus: Add g_dbus_get_properties functionJohan Hedberg2-0/+21
This function can be used to construct custom D-Bus messages containing the properties for a specific interface on a given path.
2012-11-26gdbus: Add support for invalidated propertiesJohan Hedberg1-1/+14
If there's a pending property but its exists() callback returns false the property should be considered invalidated and included in the relevant list of the PropertiesChanged signal.
2012-11-26gdbus: Fix processing pending properties in remove_interface()Johan Hedberg1-0/+2
2012-11-26gdbus: Fix up Properties.Set() code pathLucas De Marchi1-3/+7
Minor fixes to make setter actually work: - Add propdata in pending_property_set - Break loop when we are removing propdata from list and we found it - in_args and out_args were swapped - interface and method name arguments were swapped
2012-11-26gdbus: Fix invalid memory access while unregisteringLucas De Marchi1-0/+11
If an interface is added and removed on the same mailoop iteration, ObjectManager would try to send InterfacesAdded signal while running the idler because the interface was added to data->added list. This is easily reproduced by forcing an error path in a plugin registration, like on sap_server_register(), resulting in the following error: ==11795== Invalid read of size 4 ==11795== at 0x496F592: dbus_message_iter_append_basic (dbus-message.c:2598) ==11795== by 0x117B39: append_interface (object.c:554) ==11795== by 0x48955E7: g_slist_foreach (gslist.c:840) ==11795== by 0x11923B: process_changes (object.c:592) ==11795== by 0x11956D: generic_unregister (object.c:980) ==11795== by 0x4973BAC: _dbus_object_tree_unregister_and_unlock (dbus-object-tree.c:516) ==11795== by 0x4965240: dbus_connection_unregister_object_path (dbus-connection.c:5776) ==11795== by 0x1178A5: object_path_unref (object.c:1219) ==11795== by 0x118517: g_dbus_unregister_interface (object.c:1344) ==11795== by 0x19AF5B: sap_exit (sap.c:385) ==11795== by 0x13E9E2: sap_server_register (server.c:1428) ==11795== by 0x13C092: sap_server_probe (manager.c:44) With this patch we don't send the InterfacesAdded signal, removing it from data->added while unregistering.
2012-11-26gdbus: Implement PropertiesChanged signalLucas De Marchi2-2/+109
2012-11-26gdbus: Simplify code for appending propertiesLuiz Augusto von Dentz1-32/+2
This reuse append_properties for GetAll and GetManagedObjects
2012-11-26gdbus: Integrates ObjectManager with Properties interfaceLuiz Augusto von Dentz1-1/+27
This appends the properties and its values when using ObjectManager.
2012-11-26gdbus: Only export ObjectManager interface on root pathLuiz Augusto von Dentz1-2/+15
ObjectManager should be exported only in the root path and list all the children paths.
2012-11-26gdbus: Group interface changes to reduce the amount of signals emittedLuiz Augusto von Dentz1-154/+208
InterfacesAdded and InterfacesRemoved can group all the interfaces changes together in one message.
2012-11-26gdbus: Add support for org.freedesktop.DBus.ObjectManager interfaceLuiz Augusto von Dentz1-10/+237
This implements initial support for ObjectManager, it automatically adds objects to its parents so no action is needed by daemons to get their objects managed by this interface. ObjectManager is part of D-Bus spec since revision 0.17: http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager
2012-11-26gdbus: Add properties into Introspectable interfaceLucas De Marchi1-0/+19
2012-11-26gdbus: Implement DBus.Properties.Set methodLucas De Marchi2-1/+157
Contrary to Get() and GetAll(), Set() is asynchronous so we pass an id to the setter so later it can declare the Set() as successful or otherwise.
2012-11-26gdbus: Implement DBus.Properties.GetAll methodLucas De Marchi1-1/+55
2012-11-26gdbus: Implement DBus.Properties.Get methodLucas De Marchi2-1/+69
2012-11-26gdbus: Add skeleton of DBus.Properties interfaceLucas De Marchi1-0/+46
This interface is responsible for handling properties of all objects in a given path. Right now it only registers itself, doing nothing useful. A conversion to this new layout will be done by subsequent patches. org.freedesktop.org.DBus.Properties spec can be found at http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-properties
2012-11-26gdbus: Use macros to add annotationsLucas De Marchi1-12/+28
Besides being more readable this way it avoids going over 80 chars.
2012-11-26gdbus: Move typedefs upLucas De Marchi1-18/+29
Move the typedefs up so they can be used by functions and callbacks.
2012-10-26gdbus: Fix not freeing list node by using g_slist_delete_linkLuiz Augusto von Dentz1-1/+1
g_slist_remove_link does not free the node which can cause leaks so replace that with g_slist_delete_link which does free memory properly.
2012-10-26gdbus: Refactor filter_data_find()Lucas De Marchi1-38/+5
Now this function is only used for searching the listeners of a connection and the other parameters are not needed anymore.
2012-10-26gdbus: Fix wrong signal handler matchLucas De Marchi1-21/+94
When we add a signal handler with g_dbus_add_signal_watch(), this function tries to multiplex the matches added in libdbus by checking if there's a previous filter_data with the same fields. However, if the field is NULL it accepts as being the same. The result is that the following watches will use the same filter data: watch1 = g_dbus_add_signal_watch(conn, BUS_NAME, NULL, iface, member, cb1, data1, NULL); watch2 = g_dbus_add_signal_watch(conn, BUS_NAME, "/path2", iface, member, cb2, data2, NULL); watch3 = g_dbus_add_signal_watch(conn, BUS_NAME, "/path3", iface, member, cb3, data3, NULL); The result is that when a signal arrives with path == "/path2", all 3 callbacks above will be called, with the same signal delivered to all of them. Another problem is that, if we invert the calls like below, only signals to cb1 will never be trigerred, nonetheless it used path == NULL. watch2 = g_dbus_add_signal_watch(conn, BUS_NAME, "/path2", iface, member, cb2, data2, NULL); watch1 = g_dbus_add_signal_watch(conn, BUS_NAME, NULL, iface, member, cb1, data1, NULL); watch3 = g_dbus_add_signal_watch(conn, BUS_NAME, "/path3", iface, member, cb3, data3, NULL); This is fixed by not multiplexing the matchs with filter data if any of the fields are different, including being NULL. When a signal arrives, if a field is NULL we accept it as a match, but not when adding the signal handler.
2012-10-26gdbus: Fix crash when getting disconnected from the busJohan Hedberg1-4/+5
When getting disconnected from the bus sometimes (maybe always?) dbus_watch_handle() can cause the "info" context to be free'd meaning that we should not try to access it after the call. The only member we need access to is the connection pointer and as the code already has a ref() call for it it's only natural to solve the issue by adding a local variable not dependent on "info". The backtrace of the crash fixed looks as follows: Invalid read of size 8 at 0x121085: watch_func (mainloop.c:105) by 0x4C72694: g_main_context_dispatch (gmain.c:2539) by 0x4C729C7: g_main_context_iterate.isra.23 (gmain.c:3146) by 0x4C72DC1: g_main_loop_run (gmain.c:3340) by 0x120541: main (main.c:551) Address 0x5bbcd90 is 16 bytes inside a block of size 24 free'd at 0x4A079AE: free (vg_replace_malloc.c:427) by 0x4C7837E: g_free (gmem.c:252) by 0x4F708BF: dbus_watch_set_data (dbus-watch.c:614) by 0x4F70938: _dbus_watch_unref (dbus-watch.c:132) by 0x4F6E9A7: _dbus_transport_handle_watch (dbus-transport.c:884) by 0x4F59AFB: _dbus_connection_handle_watch (dbus-connection.c:1497) by 0x4F70AF9: dbus_watch_handle (dbus-watch.c:683) by 0x121084: watch_func (mainloop.c:103) by 0x4C72694: g_main_context_dispatch (gmain.c:2539) by 0x4C729C7: g_main_context_iterate.isra.23 (gmain.c:3146) by 0x4C72DC1: g_main_loop_run (gmain.c:3340) by 0x120541: main (main.c:551)
2012-08-27gdbus: Fix compilation error if macro "error" is definedJaganath Kanakkassery1-2/+2
The variable "signature" used in error is not defined and "args" is now a struct instead of a string.
2012-06-30gdbus: Fix removal of filter after last filter_dataLucas De Marchi1-9/+8
If there's a signal watch that's also watching for name (data->name_watch) currently we are trying to remove the message_filter twice since we may have the following call chain: filter_data_remove_callback() filter_data_free() g_dbus_remove_watch() filter_data_remove_callback() filter_data_free() dbus_connection_remove_filter() dbus_connection_remove_filter() Because of this we can't currently watch for signals passing the bus name. After this patch we don't have this issue anymore. We fix it by removing the filter before calling filter_data_free() if we are the last filter_data and thus avoid calling dbus_connection_remove_filter() twice.
2012-05-22gdbus: Fix incorrectly discarded signalsMikel Astiz1-7/+3
Signals with no arguments were incorrectly filtered out due to the NULL inequality check.
2012-05-18gdbus: do not check signature twiceLucas De Marchi1-5/+0
Message signature is already checked in generic_message(), so there's no need to check again in the callback.
2012-05-18gdbus: add Method.NoReply annotation in introspectionLucas De Marchi1-1/+6
2012-05-18gdbus: add Deprecated annotation in introspectionLucas De Marchi1-2/+17
2012-05-18gdbus: remove signature and reply from tablesLucas De Marchi2-61/+1
2012-05-18gdbus: loop over args to check message signatureLucas De Marchi1-7/+27
2012-05-18gdbus: use GDBusArgInfo to generate introspectionLucas De Marchi1-61/+14
By using GDBusArgInfo in methods and signals, the introspection generation is much simpler and we can add each argument name.
2012-05-18gdbus: add macro for methods marked as NOREPLYLucas De Marchi1-0/+16
2012-05-18gdbus: add and use helpers for table declarationsLucas De Marchi2-1/+88
2012-05-18gdbus: add argument info to methods and signalsLucas De Marchi1-0/+8
2012-05-17gdbus: Constify introspection method tableMarcel Holtmann1-1/+1
2012-05-17gdbus: do not call memset for terminating NULLucas De Marchi1-1/+2
2012-05-17gdbus: return if method signature is malformedLucas De Marchi1-0/+4
2012-04-16gdbus: Remove unneeded NEED_DBUS_WATCH_GET_UNIX_FD checkMarcel Holtmann1-4/+0
2012-04-05gdbus: Use destroy callback for service watchAnderson Lizardo1-1/+1
Even though service watches accepted a "destroy" callback, they were being ignored. This fix properly pass them along so they are called when the watch is removed.
2012-04-05gdbus: Fix white space coding style issueSyam Sidhardhan1-1/+1
- corrected the space before '{'
2011-05-27gdbus: Remove unused result variable from g_dbus_pending_successSzymon Janc1-2/+1
2011-03-09gdbus: Unconditionally remove D-Bus timeoutsGrant Erickson1-3/+0
Address an issue in which the daemon incorrectly handles D-Bus main loop timeouts by only removing timeouts that are not enabled when D-Bus requests a timeout removal.
2011-01-19gdbus: Remove root node 'name' attribute in introspectionDaniel Wagner1-1/+1
generate_introspection_xml generates the root <node> tags with a 'name' attribute. This seems to be a valid attribute but it is not consistent with the way the D-Bus daemon generates empty nodes. For example if we register "/foo/bar", D-Bus daemon will generate for "/foo" a introspection which looks like this: <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> <node> <node name="bar"/> </node> and generate_introspection_xml generates for "/foo/bar": <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> <node name="/foo/bar"> </node> Just don't add the 'name' attribute to the root node. The GLib binding for D-Bus does it the same way.
2011-01-19gdbus: invaldate_parent_data: walk the whole path downDaniel Wagner1-3/+4
Assume there is only one object registerd at "/". If we add a new object at "/foo/bar" the introspection of "/" has to be updated. A new node has to be added at "/". invalidate_parent_data stops invaldating the whole path because the boolean return value of dbus_connection_get_object_path_data is used wrong. If we get a TRUE just go on down in the path, if FALSE is return dbus_connection_get_object_path_data has run out of memory.
2011-01-01gdbus: Update copyright informationMarcel Holtmann5-5/+5
2010-12-10gdbus: fix accessing freed callback dataJohan Hedberg1-5/+5
cb->disc_func or cb->conn_func could remove the callback so this needs to be checked for before continuing processing.
2010-12-08gdbus: explicitly compare pointers to NULLLucas De Marchi3-24/+23
This patch was generated by the following semantic patch (http://coccinelle.lip6.fr/) // <smpl> @fix disable is_null,isnt_null1@ expression *E; @@ - !E + E == NULL // </smpl>
2010-10-13Fix not handling of D-Bus disconnectsLuiz Augusto von Dentz1-0/+4
We where not dispatching data when a bus disconnects which cause Disconnected signal to not be processed and thus causing the process to either not exit or to not trigger callbacks registered with g_dbus_set_disconnect_function. To fix this now we always schedule a dispatch which will make sure data still not processed will make its way to the proper handlers even if disconnected.
2010-09-19Add D-Bus helper library supportMarcel Holtmann5-0/+2378