bu5hm4n pushed a commit to branch master.

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

commit 3612467c4fda7008eaa9c1b6a9d13983f5e75fc8
Author: Mike Blumenkrantz <[email protected]>
Date:   Mon Jan 27 09:27:41 2020 -0500

    efl/gesture: avoid direct double access in structs
    
    this is functionally wrong (the comparison fails) and also causes SIGBUS on
    arm
    
    Reviewed-by: Marcel Hollerbach <[email protected]>
    Reviewed-by: woochan lee <[email protected]>
    Differential Revision: https://phab.enlightenment.org/D11198
---
 .../evas/gesture/efl_canvas_gesture_recognizer_double_tap.c   |  6 +++---
 src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c    | 11 ++++++-----
 src/lib/evas/gesture/efl_canvas_gesture_recognizer_long_tap.c |  6 +++---
 .../evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c   |  6 +++---
 src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c     |  9 +++++----
 5 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c
index 5359a2b83a..f6c7e0e44c 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c
@@ -45,7 +45,7 @@ 
_efl_canvas_gesture_recognizer_double_tap_efl_canvas_gesture_recognizer_recogniz
                                                                                
   Efl_Canvas_Gesture *gesture, Efl_Object *watched,
                                                                                
   Efl_Canvas_Gesture_Touch *event)
 {
-   double length;
+   double length, start_timeout = pd->start_timeout;
    double timeout = TAP_TIME_OUT;
    Eina_Position2D pos;
    Eina_Vector2 dist;
@@ -54,7 +54,7 @@ 
_efl_canvas_gesture_recognizer_double_tap_efl_canvas_gesture_recognizer_recogniz
    pd->target = watched;
    pd->gesture = gesture;
 
-   if (!pd->start_timeout)
+   if (!EINA_DBL_NONZERO(start_timeout))
      {
         double time;
         Eina_Value *val = _recognizer_config_get(obj, 
"glayer_double_tap_timeout");
@@ -66,7 +66,7 @@ 
_efl_canvas_gesture_recognizer_double_tap_efl_canvas_gesture_recognizer_recogniz
           }
      }
    else
-     timeout = pd->start_timeout;
+     timeout = start_timeout;
 
    switch (efl_gesture_touch_state_get(event))
      {
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c
index 582edc392b..3b89ebec32 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c
@@ -185,7 +185,7 @@ 
_efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_recognize(Eo
                                                                              
Efl_Canvas_Gesture *gesture, Efl_Object *watched,
                                                                              
Efl_Canvas_Gesture_Touch *event)
 {
-   double angle;
+   double angle, line_angle;
    Eina_Value *val;
    unsigned char glayer_continues_enable;
    Efl_Canvas_Gesture_Recognizer_Result result = 
EFL_GESTURE_RECOGNIZER_RESULT_CANCEL;
@@ -258,12 +258,13 @@ 
_efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_recognize(Eo
    _vector_get(pd->st_line, efl_gesture_touch_cur_point_get(event),
                &pd->line_length, &angle);
 
+   line_angle = pd->line_angle;
    if (pd->t_st)
      {
-        if (pd->line_angle >= 0.0)
+        if ((line_angle > 0.0) || EINA_DBL_EQ(line_angle, 0.0))
           {
              double line_distance_tolerance, line_angular_tolerance;
-             double a = fabs(angle - pd->line_angle);
+             double a = fabs(angle - line_angle);
              double d = (tan(DEG2RAD(a))) * pd->line_length;
 
              val = _recognizer_config_get(obj, 
"glayer_line_distance_tolerance");
@@ -306,12 +307,12 @@ 
_efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_recognize(Eo
              line_min_length *= pd->finger_size;
 
              if (pd->line_length >= line_min_length)
-               fd->angle = pd->line_angle = angle;
+               line_angle = fd->angle = pd->line_angle = angle;
           }
 
         if (pd->t_end)
           {
-             if (pd->line_angle < 0.0)
+             if (line_angle < 0.0)
                {
                   _reset_recognizer(pd);
 
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_long_tap.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_long_tap.c
index 83e792f78c..86879037bc 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_long_tap.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_long_tap.c
@@ -44,7 +44,7 @@ 
_efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_recognize(
                                                                                
 Efl_Object *watched,
                                                                                
 Efl_Canvas_Gesture_Touch *event)
 {
-   double length; // Manhattan distance
+   double length, start_timeout = pd->start_timeout; // Manhattan distance
    double timeout = EFL_GESTURE_LONG_TAP_TIME_OUT;
    Eina_Position2D pos;
    Eina_Vector2 dist;
@@ -53,7 +53,7 @@ 
_efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_recognize(
    pd->target = watched;
    pd->gesture = gesture;
 
-   if (!pd->start_timeout)
+   if (!EINA_DBL_NONZERO(start_timeout))
      {
         double time;
         Eina_Value *val = _recognizer_config_get(obj, 
"glayer_long_tap_start_timeout");
@@ -65,7 +65,7 @@ 
_efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_recognize(
           }
      }
    else
-     timeout = pd->start_timeout;
+     timeout = start_timeout;
 
    switch (efl_gesture_touch_state_get(event))
      {
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c
index 47443c4845..9c7a70a2e4 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c
@@ -44,7 +44,7 @@ 
_efl_canvas_gesture_recognizer_triple_tap_efl_canvas_gesture_recognizer_recogniz
                                                                                
   Efl_Canvas_Gesture *gesture, Efl_Object *watched,
                                                                                
   Efl_Canvas_Gesture_Touch *event)
 {
-   double length;
+   double length, start_timeout = pd->start_timeout;
    double timeout = TAP_TIME_OUT;
    Eina_Position2D pos;
    Eina_Vector2 dist;
@@ -53,7 +53,7 @@ 
_efl_canvas_gesture_recognizer_triple_tap_efl_canvas_gesture_recognizer_recogniz
    pd->target = watched;
    pd->gesture = gesture;
 
-   if (!pd->start_timeout)
+   if (!EINA_DBL_NONZERO(start_timeout))
      {
         double time;
         Eina_Value *val = _recognizer_config_get(obj, 
"glayer_double_tap_timeout");
@@ -65,7 +65,7 @@ 
_efl_canvas_gesture_recognizer_triple_tap_efl_canvas_gesture_recognizer_recogniz
           }
      }
    else
-     timeout = pd->start_timeout;
+     timeout = start_timeout;
 
    switch (efl_gesture_touch_state_get(event))
      {
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c
index 5747af49ca..7cb06315ab 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c
@@ -76,7 +76,7 @@ _zoom_compute(Efl_Canvas_Gesture_Recognizer_Zoom_Data *pd,
               Evas_Coord yy2,
               double zoom_finger_factor)
 {
-   double rt = 1.0;
+   double rt = 1.0, zoom_distance_tolerance = pd->zoom_distance_tolerance;
    //TODO: Enable below code if the zoom momentum is need
    //unsigned int tm_end = (pd->zoom_mv.cur.timestamp > 
pd->zoom_mv1.cur.timestamp) ?
    //   pd->zoom_mv.cur.timestamp : pd->zoom_mv1.cur.timestamp;
@@ -93,7 +93,7 @@ _zoom_compute(Efl_Canvas_Gesture_Recognizer_Zoom_Data *pd,
         return zd->zoom;
      }
 
-   if (pd->zoom_distance_tolerance) /* zoom tolerance <> ZERO, means
+   if (EINA_DBL_NONZERO(zoom_distance_tolerance)) /* zoom tolerance <> ZERO, 
means
                                     * zoom action NOT started yet */
      {
         /* avoid jump with zoom value when break tolerance */
@@ -147,6 +147,7 @@ 
_efl_canvas_gesture_recognizer_zoom_efl_canvas_gesture_recognizer_recognize(Eo *
    Efl_Canvas_Gesture_Zoom_Data *zd = efl_data_scope_get(gesture, 
EFL_CANVAS_GESTURE_ZOOM_CLASS);
    Efl_Canvas_Gesture_Touch_Data *td = efl_data_scope_get(event, 
EFL_CANVAS_GESTURE_TOUCH_CLASS);
    Efl_Canvas_Gesture_Recognizer_Data *rd = efl_data_scope_get(obj, 
EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
+   double zoom_distance_tolerance = pd->zoom_distance_tolerance;
 
    //FIXME: Wheel zoom test first here.
 
@@ -164,7 +165,7 @@ 
_efl_canvas_gesture_recognizer_zoom_efl_canvas_gesture_recognizer_recognize(Eo *
 
    rd->continues = EINA_TRUE;
 
-   if (!pd->zoom_distance_tolerance && !pd->calc_temp)
+   if (!EINA_DBL_NONZERO(zoom_distance_tolerance) && !pd->calc_temp)
      {
         pd->calc_temp = EINA_TRUE;
         val = _recognizer_config_get(obj, "glayer_zoom_distance_tolerance");
@@ -239,7 +240,7 @@ 
_efl_canvas_gesture_recognizer_zoom_efl_canvas_gesture_recognizer_recognize(Eo *
                                   pd->zoom_mv.cur.pos.y, 
pd->zoom_mv1.cur.pos.x,
                                   pd->zoom_mv1.cur.pos.y, 
pd->zoom_finger_factor);
 
-         if (!pd->zoom_distance_tolerance)
+         if (!EINA_DBL_NONZERO(zoom_distance_tolerance))
            {
               double d = zd->zoom - pd->next_step;
 

-- 


Reply via email to