wibox.drawable: Fix a possible crash

LGI does not protect against use-after-free issues that can occur due to
using an object after finalisation. This manifests itself as occasional
crashes on Travis in cairo_region_union_rectangle() (AFAIK no one ran
into this issue in real-world usage).

Since visible drawables are always strongly reachable, the issue can
only occur with invisible drawables. The previous commit made sure that
those are fully repainted when they become visible, so we can just
ignore redraws for those and fix the crash issue.

Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2016-10-04 21:27:10 +02:00
parent 650b01eb71
commit 9b51779f2f
1 changed files with 3 additions and 7 deletions

View File

@ -266,6 +266,7 @@ function drawable:set_fg(c)
end end
function drawable:_inform_visible(visible) function drawable:_inform_visible(visible)
self._visible = visible
if visible then if visible then
visible_drawables[self] = true visible_drawables[self] = true
-- The wallpaper or widgets might have changed -- The wallpaper or widgets might have changed
@ -407,13 +408,8 @@ function drawable.new(d, widget_context_skeleton, drawable_name)
-- Set up our callbacks for repaints -- Set up our callbacks for repaints
ret._redraw_callback = function(hierar, arg) ret._redraw_callback = function(hierar, arg)
-- XXX: lgi will lead us into memory-corruption-land when we use an -- Avoid crashes when a drawable was partly finalized and dirty_area is broken.
-- object after it was GC'd. Try to detect this situation by checking if if not ret._visible then
-- the drawable is still valid. This is only a weak indication, but it
-- seems to be the best that we can do. The problem is that the drawable
-- could not yet be GC'd, but is pending finalisation, while the
-- cairo.Region below was already GC'd. This would still lead to corruption.
if not ret.drawable.valid then
return return
end end
if ret._widget_hierarchy_callback_arg ~= arg then if ret._widget_hierarchy_callback_arg ~= arg then