Test & fix a bug with dbus.disconnect_signal (#1096)

The code was written so that it assumes that disconnecting the last signal also
removed the corresponding entry in the signal array. This lead e.g. to an
index-out-of-bounds access in some cases.

Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2016-09-18 12:50:40 +02:00 committed by Daniel Hahler
parent 3e562dfa53
commit 75ed165ae6
2 changed files with 37 additions and 0 deletions

View File

@ -92,6 +92,8 @@ signal_disconnect(signal_array_t *arr, const char *name, const void *ref)
if(ref == *func) if(ref == *func)
{ {
cptr_array_remove(&sigfound->sigfuncs, func); cptr_array_remove(&sigfound->sigfuncs, func);
if(sigfound->sigfuncs.len == 0)
signal_array_remove(arr, sigfound);
return true; return true;
} }
} }

35
tests/test-dbus-error.lua Normal file
View File

@ -0,0 +1,35 @@
local runner = require("_runner")
local awful = require("awful")
local calls_done = 0
local function dbus_callback(data)
assert(data.member == "Ping")
calls_done = calls_done + 1
end
dbus.request_name("session", "org.awesomewm.test")
-- Yup, we had a bug that made the following not work
dbus.connect_signal("org.awesomewm.test", dbus_callback)
dbus.disconnect_signal("org.awesomewm.test", dbus_callback)
dbus.connect_signal("org.awesomewm.test", dbus_callback)
for _=1, 2 do
awful.spawn({
"dbus-send",
"--dest=org.awesomewm.test",
"--type=method_call",
"/",
"org.awesomewm.test.Ping",
"string:foo"
})
end
runner.run_steps({ function()
if calls_done >= 2 then
return true
end
end })
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80