diff options
author | Michael Albinus <michael.albinus@gmx.de> | 2020-09-02 19:50:14 +0200 |
---|---|---|
committer | Michael Albinus <michael.albinus@gmx.de> | 2020-09-02 19:50:14 +0200 |
commit | 1457e84f4468f4a5f2de8c182596225cb1355afa (patch) | |
tree | 103e57ac490f25e3ccb51534344364a41dfb8a3c /lisp/net/dbus.el | |
parent | 410b16f92d61196af54e91c9de1046246f44b28d (diff) | |
download | emacs-1457e84f4468f4a5f2de8c182596225cb1355afa.tar.gz |
Fix bug in dbus.el
* lisp/net/dbus.el (dbus-register-property)
(dbus-property-handler): Handle properties of the same interface
at different object paths properly. (Bug#43146)
Diffstat (limited to 'lisp/net/dbus.el')
-rw-r--r-- | lisp/net/dbus.el | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/lisp/net/dbus.el b/lisp/net/dbus.el index fdd726ff613..971d3e730ed 100644 --- a/lisp/net/dbus.el +++ b/lisp/net/dbus.el @@ -1484,15 +1484,19 @@ clients from discovering the still incomplete interface." ;; Create a hash table entry. We use nil for the unique name, ;; because the property might be accessed from anybody. - (let ((key (list :property bus interface property)) - (val - (list + (let* ((key (list :property bus interface property)) + ;; Remove possible existing entry, because it must be overwritten. + (val (seq-remove + (lambda (item) + (equal (butlast item) (list nil service path))) + (gethash key dbus-registered-objects-table))) + (entry (list nil service path (cons (if emits-signal (list access :emits-signal) (list access)) - value))))) - (puthash key val dbus-registered-objects-table) + value)))) + (puthash key (cons entry val) dbus-registered-objects-table) ;; Return the object. (list key (list service path)))) @@ -1509,9 +1513,15 @@ It will be registered for all objects created by `dbus-register-property'." (cond ;; "Get" returns a variant. ((string-equal method "Get") - (let ((entry (gethash (list :property bus interface property) - dbus-registered-objects-table))) - (when (string-equal path (nth 2 (car entry))) + (let ((entry + ;; Remove entries not belonging to this case. + (seq-remove + (lambda (item) + (not (string-equal (nth 2 item) path))) + (gethash (list :property bus interface property) + dbus-registered-objects-table)))) + + (when (string-equal path (nth 2 (car entry))) `((:variant ,(cdar (last (car entry)))))))) ;; "Set" expects a variant. |