From 1457e84f4468f4a5f2de8c182596225cb1355afa Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Wed, 2 Sep 2020 19:50:14 +0200 Subject: [PATCH] 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) --- lisp/net/dbus.el | 26 ++++++++++++++++++-------- 1 file 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. -- 2.39.2