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:
parent
3e562dfa53
commit
75ed165ae6
|
@ -92,6 +92,8 @@ signal_disconnect(signal_array_t *arr, const char *name, const void *ref)
|
|||
if(ref == *func)
|
||||
{
|
||||
cptr_array_remove(&sigfound->sigfuncs, func);
|
||||
if(sigfound->sigfuncs.len == 0)
|
||||
signal_array_remove(arr, sigfound);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue