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; --
