hermet pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=b35d2f976267b3b03124108aafb1d56219930ab2

commit b35d2f976267b3b03124108aafb1d56219930ab2
Author: Subodh Kumar <s7158.ku...@samsung.com>
Date:   Fri Aug 28 16:27:21 2015 +0900

    Eina rectangle: Check for valid rectangle before taking intersection
    
    Summary:
    Check for valid rectangle
    
    If any dst or src rectangle has zero width or height,
    intersection should not return true.
    
    @fix
    
    Test Plan: Added test cases
    
    Reviewers: cedric, herdsman, Hermet
    
    Reviewed By: Hermet
    
    Subscribers: shilpasingh, cedric
    
    Differential Revision: https://phab.enlightenment.org/D2990
---
 src/lib/eina/eina_inline_rectangle.x | 22 ++++++++++++++--------
 src/tests/eina/eina_test_rectangle.c | 14 +++++++++++++-
 2 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/src/lib/eina/eina_inline_rectangle.x 
b/src/lib/eina/eina_inline_rectangle.x
index fafe139..5956291 100644
--- a/src/lib/eina/eina_inline_rectangle.x
+++ b/src/lib/eina/eina_inline_rectangle.x
@@ -19,6 +19,14 @@
 #ifndef EINA_INLINE_RECTANGLE_H__
 #define EINA_INLINE_RECTANGLE_H__
 
+static inline Eina_Bool
+eina_rectangle_is_valid(const Eina_Rectangle *r)
+{
+       if (r->w <= 0 || r->h <= 0)
+               return EINA_FALSE;
+       return EINA_TRUE;
+}
+
 static inline int
 eina_spans_intersect(int c1, int l1, int c2, int l2)
 {
@@ -90,6 +98,9 @@ eina_rectangle_union(Eina_Rectangle *dst, const 
Eina_Rectangle *src)
 static inline Eina_Bool
 eina_rectangle_intersection(Eina_Rectangle *dst, const Eina_Rectangle *src)
 {
+       if (!(eina_rectangle_is_valid(dst)) || !(eina_rectangle_is_valid(src)))
+               return EINA_FALSE;
+
        if (!(eina_rectangles_intersect(dst, src)))
                return EINA_FALSE;
 
@@ -116,6 +127,9 @@ eina_rectangle_intersection(Eina_Rectangle *dst, const 
Eina_Rectangle *src)
        if ((dst->y + dst->h) > (src->y + src->h))
                dst->h = src->y + src->h - dst->y;
 
+       if (dst->w == 0 || dst->h == 0)
+               return EINA_FALSE;
+
        return EINA_TRUE;
 }
 
@@ -137,14 +151,6 @@ eina_rectangle_rescale_out(const Eina_Rectangle *out, 
const Eina_Rectangle *in,
        res->h = out->h;
 }
 
-static inline Eina_Bool
-eina_rectangle_is_valid(const Eina_Rectangle *r)
-{
-       if (r->w <= 0 || r->h <= 0)
-               return EINA_FALSE;
-       return EINA_TRUE;
-}
-
 static inline int
 eina_rectangle_max_x(Eina_Rectangle *thiz)
 {
diff --git a/src/tests/eina/eina_test_rectangle.c 
b/src/tests/eina/eina_test_rectangle.c
index 089b68b..08f8384 100644
--- a/src/tests/eina/eina_test_rectangle.c
+++ b/src/tests/eina/eina_test_rectangle.c
@@ -74,7 +74,7 @@ END_TEST
 
 START_TEST(eina_rectangle_union_intersect)
 {
-   Eina_Rectangle r1, r2, r3, r4, r5, r6, rd;
+   Eina_Rectangle r1, r2, r3, r4, r5, r6, r7, r8, rd;
 
    fail_if(!eina_init());
 
@@ -84,6 +84,9 @@ START_TEST(eina_rectangle_union_intersect)
    EINA_RECTANGLE_SET(&r4, 30, 30, 50, 50);
    EINA_RECTANGLE_SET(&r5, 10, 10, 0, 0);
    EINA_RECTANGLE_SET(&r6, 30, 30, 0, 0);
+   EINA_RECTANGLE_SET(&r7, 10, 10, 5, 0);
+   EINA_RECTANGLE_SET(&r8, 10, 10, 0, 5);
+
 
    rd = r1;
 
@@ -111,6 +114,15 @@ START_TEST(eina_rectangle_union_intersect)
            || rd.w != r1.w
            || rd.h != r1.h);
 
+   rd = r6;
+   fail_if(eina_rectangle_intersection(&rd, &r5));
+
+   rd = r7;
+   fail_if(eina_rectangle_intersection(&rd, &r3));
+
+   rd = r8;
+   fail_if(eina_rectangle_intersection(&rd, &r3));
+
    rd = r1;
    eina_rectangle_union(&rd, &r3);
    fail_if(rd.x != 0

-- 


Reply via email to