eina-tiler: fix crash when trying to check intersection between two tilers

Summary:
If one of the given tilers is empty, then crash could be occurred in internal while loop of eina_tiler_intersection.
And fix some memory leaks in eina_tiler_intersection and eina_tiler_equal.

Reviewers: devilhorns, raster, cedric, torori

CC: cedric

Differential Revision: https://phab.enlightenment.org/D996
This commit is contained in:
Gwanglim Lee 2014-06-12 12:33:20 +09:00 committed by Carsten Haitzler (Rasterman)
parent c99449ea09
commit e3f4f4457d
1 changed files with 24 additions and 25 deletions

View File

@ -1430,11 +1430,11 @@ EAPI Eina_Tiler *
eina_tiler_intersection(Eina_Tiler *t1,
Eina_Tiler *t2)
{
Eina_Tiler *t;
Eina_Tiler *t = NULL;
int w, h;
Eina_Iterator *itr1, *itr2;
Eina_Rectangle rect, *rect1, *rect2;
Eina_Iterator *itr1 = NULL, *itr2 = NULL;
Eina_Rectangle rect, *rect1 = NULL, *rect2 = NULL;
EINA_MAGIC_CHECK_TILER(t1, NULL);
EINA_MAGIC_CHECK_TILER(t2, NULL);
@ -1449,10 +1449,13 @@ eina_tiler_intersection(Eina_Tiler *t1,
itr1 = eina_tiler_iterator_new(t1);
itr2 = eina_tiler_iterator_new(t2);
if (!((itr1) && (itr2)))
goto cleanup;
if ((!eina_iterator_next(itr1, (void**)(void*)(&rect1))) && (!rect1))
return NULL;
goto cleanup;
if ((!eina_iterator_next(itr2, (void**)(void*)(&rect2))) && (!rect2))
return NULL;
goto cleanup;
while((rect1) && (rect2))
{
@ -1493,6 +1496,7 @@ eina_tiler_intersection(Eina_Tiler *t1,
break;
}
cleanup:
eina_iterator_free(itr1);
eina_iterator_free(itr2);
@ -1503,8 +1507,8 @@ EAPI Eina_Bool
eina_tiler_equal(Eina_Tiler *t1,
Eina_Tiler *t2)
{
Eina_Iterator *itr1, *itr2;
Eina_Rectangle *rect1, *rect2;
Eina_Iterator *itr1 = NULL, *itr2 = NULL;
Eina_Rectangle *rect1 = NULL, *rect2 = NULL;
Eina_Bool next_t1 = EINA_FALSE, next_t2 = EINA_FALSE;
Eina_Bool r = EINA_FALSE;
@ -1517,31 +1521,28 @@ eina_tiler_equal(Eina_Tiler *t1,
itr1 = eina_tiler_iterator_new(t1);
itr2 = eina_tiler_iterator_new(t2);
if (!((itr1) && (itr2)))
goto cleanup;
if ((!eina_iterator_next(itr1, (void**)(void*)(&rect1))) && (!rect1))
goto first_fail;
goto cleanup;
if ((!eina_iterator_next(itr2, (void**)(void*)(&rect2))) && (!rect2))
goto second_fail;
goto cleanup;
while((rect1) && (rect2))
{
if (eina_rectangles_intersect(rect1, rect2))
{
if ((rect1->x != rect2->x) ||
(rect1->y != rect2->y) ||
(rect1->w != rect2->w) ||
(rect1->h != rect2->h))
{
goto second_fail;
}
}
else
goto second_fail;
if (!eina_rectangles_intersect(rect1, rect2))
break;
if ((rect1->x != rect2->x) || (rect1->y != rect2->y) ||
(rect1->w != rect2->w) || (rect1->h != rect2->h))
break;
next_t1 = eina_iterator_next(itr1, (void**)&rect1);
next_t2 = eina_iterator_next(itr2, (void**)&rect2);
if (next_t1 != next_t2)
goto second_fail;
break;
if (!next_t1 && !next_t2)
break;
@ -1549,13 +1550,11 @@ eina_tiler_equal(Eina_Tiler *t1,
r = EINA_TRUE;
second_fail:
cleanup:
eina_iterator_free(itr1);
first_fail:
eina_iterator_free(itr2);
return r;
}
struct _Eina_Tile_Grid_Slicer_Iterator