mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-22 08:58:54 +02:00
GMainContext - Fix GSource iterator if iteration can modify the list
We first have to ref the next source and then unref the previous one. This might be the last reference to the previous source, and freeing the previous source might unref and free the next one which would then leave use with a dangling pointer here. Fixes https://gitlab.gnome.org/GNOME/glib/issues/2031
This commit is contained in:
committed by
Michael Catanzaro
parent
b1771658c2
commit
674e35b7ea
@@ -965,13 +965,17 @@ g_source_iter_next (GSourceIter *iter, GSource **source)
|
||||
* GSourceList to be removed from source_lists (if iter->source is
|
||||
* the only source in its list, and it is destroyed), so we have to
|
||||
* keep it reffed until after we advance iter->current_list, above.
|
||||
*
|
||||
* Also we first have to ref the next source before unreffing the
|
||||
* previous one as unreffing the previous source can potentially
|
||||
* free the next one.
|
||||
*/
|
||||
if (next_source && iter->may_modify)
|
||||
g_source_ref (next_source);
|
||||
|
||||
if (iter->source && iter->may_modify)
|
||||
g_source_unref_internal (iter->source, iter->context, TRUE);
|
||||
iter->source = next_source;
|
||||
if (iter->source && iter->may_modify)
|
||||
g_source_ref (iter->source);
|
||||
|
||||
*source = iter->source;
|
||||
return *source != NULL;
|
||||
|
Reference in New Issue
Block a user