Fix use of uninitialized memory in BKE_scene_objects_as_gset

Share macro for setting BLI_Iterator defaults to ensure
this doesn't happen again in cases the ITER_* macros aren't used.

Oversight in 14d74fb341.
This commit is contained in:
Campbell Barton 2021-04-09 11:34:45 +10:00
parent 3d7e3d5ad0
commit 71da3f31d4
3 changed files with 12 additions and 4 deletions

View File

@ -2033,8 +2033,9 @@ void BKE_scene_collections_iterator_begin(BLI_Iterator *iter, void *data_in)
CollectionsIteratorData *data = MEM_callocN(sizeof(CollectionsIteratorData), __func__);
data->scene = scene;
BLI_ITERATOR_INIT(iter);
iter->data = data;
iter->valid = true;
scene_collections_array(scene, (Collection ***)&data->array, &data->tot);
BLI_assert(data->tot != 0);
@ -2079,6 +2080,8 @@ typedef struct SceneObjectsIteratorData {
static void scene_objects_iterator_begin(BLI_Iterator *iter, Scene *scene, GSet *visited_objects)
{
SceneObjectsIteratorData *data = MEM_callocN(sizeof(SceneObjectsIteratorData), __func__);
BLI_ITERATOR_INIT(iter);
iter->data = data;
/* Lookup list to make sure that each object is only processed once. */

View File

@ -34,13 +34,19 @@ typedef struct BLI_Iterator {
typedef void (*IteratorCb)(BLI_Iterator *iter);
typedef void (*IteratorBeginCb)(BLI_Iterator *iter, void *data_in);
#define BLI_ITERATOR_INIT(iter) \
{ \
(iter)->skip = false; \
(iter)->valid = true; \
} \
((void)0)
#define ITER_BEGIN(callback_begin, callback_next, callback_end, _data_in, _type, _instance) \
{ \
_type _instance; \
IteratorCb callback_end_func = callback_end; \
BLI_Iterator iter_macro; \
iter_macro.skip = false; \
iter_macro.valid = true; \
BLI_ITERATOR_INIT(&iter_macro); \
for (callback_begin(&iter_macro, (_data_in)); iter_macro.valid; callback_next(&iter_macro)) { \
if (iter_macro.skip) { \
iter_macro.skip = false; \

View File

@ -778,7 +778,6 @@ static void rna_Scene_objects_begin(CollectionPropertyIterator *iter, PointerRNA
Scene *scene = (Scene *)ptr->data;
iter->internal.custom = MEM_callocN(sizeof(BLI_Iterator), __func__);
((BLI_Iterator *)iter->internal.custom)->valid = true;
BKE_scene_objects_iterator_begin(iter->internal.custom, (void *)scene);
iter->valid = ((BLI_Iterator *)iter->internal.custom)->valid;
}