summaryrefslogtreecommitdiff
path: root/lisp/net/dbus.el
diff options
context:
space:
mode:
authorMichael Albinus <michael.albinus@gmx.de>2020-09-02 19:50:14 +0200
committerMichael Albinus <michael.albinus@gmx.de>2020-09-02 19:50:14 +0200
commit1457e84f4468f4a5f2de8c182596225cb1355afa (patch)
tree103e57ac490f25e3ccb51534344364a41dfb8a3c /lisp/net/dbus.el
parent410b16f92d61196af54e91c9de1046246f44b28d (diff)
downloademacs-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.el26
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.