cedric pushed a commit to branch master.

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

commit 32fd16dfc0fce3b736d3f959370859ba63cacbd5
Author: Benjamin Jacobs <[email protected]>
Date:   Mon Jun 6 16:33:54 2016 -0700

    evas: button_mask as unsigned, UB fixes.
    
    Summary:
    * pointer.button is DATA32 which is unsigned, so this changes the
      definition of pointer_button_down_mask accordingly.
    
    * Avoids UB in mask generation:
    lib/evas/canvas/evas_events.c:1348:37: runtime error: left shift of 1 by 31 
places cannot be represented in type 'int'
    
    Subscribers: cedric, jpeg
    
    Differential Revision: https://phab.enlightenment.org/D4019
    
    Signed-off-by: Cedric BAIL <[email protected]>
---
 src/lib/evas/canvas/evas_canvas.eo | 7 ++++---
 src/lib/evas/canvas/evas_events.c  | 6 +++---
 src/lib/evas/canvas/evas_main.c    | 4 ++--
 3 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/lib/evas/canvas/evas_canvas.eo 
b/src/lib/evas/canvas/evas_canvas.eo
index 12f6ed3..807c52c 100644
--- a/src/lib/evas/canvas/evas_canvas.eo
+++ b/src/lib/evas/canvas/evas_canvas.eo
@@ -517,17 +517,18 @@ class Evas.Canvas (Eo.Base, Evas.Common_Interface, 
Efl.Animator,
             Example:
             @code
             extern Evas *evas;
-            int button_mask, i;
+            unsigned int button_mask;
+            int i;
 
             button_mask = evas_pointer_button_down_mask_get(evas);
             printf("Buttons currently pressed:\n");
             for (i = 0; i < 32; i++)
             {
-            if ((button_mask & (1 << i)) != 0) printf("Button %i\n", i + 1);
+            if ((button_mask & (1u << i)) != 0) printf("Button %i\n", i + 1);
             }
             @endcode
             */
-            return: int @warn_unused; [[A bitmask of the currently depressed 
buttons on the canvas.]]
+            return: uint @warn_unused; [[A bitmask of the currently depressed 
buttons on the canvas.]]
          }
       }
 
diff --git a/src/lib/evas/canvas/evas_events.c 
b/src/lib/evas/canvas/evas_events.c
index 67faf11..b3e69e2 100644
--- a/src/lib/evas/canvas/evas_events.c
+++ b/src/lib/evas/canvas/evas_events.c
@@ -1159,7 +1159,7 @@ _canvas_event_feed_mouse_down_internal(Eo *eo_e, int b, 
Evas_Button_Flags flags,
    INF("ButtonEvent:down time=%u x=%d y=%d button=%d downs=%d", timestamp, 
e->pointer.x, e->pointer.y, b, e->pointer.downs);
    if ((b < 1) || (b > 32)) return;
 
-   e->pointer.button |= (1 << (b - 1));
+   e->pointer.button |= (1u << (b - 1));
    e->pointer.downs++;
 
    if (e->is_frozen) return;
@@ -1384,7 +1384,7 @@ _canvas_event_feed_mouse_up_internal(Eo *eo_e, int b, 
Evas_Button_Flags flags,
    if ((b < 1) || (b > 32)) return;
    if (e->pointer.downs <= 0) return;
 
-   e->pointer.button &= ~(1 << (b - 1));
+   e->pointer.button &= ~(1u << (b - 1));
    e->pointer.downs--;
 
    if (e->is_frozen) return;
@@ -1496,7 +1496,7 @@ _canvas_event_feed_mouse_cancel_internal(Eo *eo_e, 
unsigned int timestamp, const
 
    for (i = 0; i < 32; i++)
      {
-        if ((e->pointer.button & (1 << i)))
+        if ((e->pointer.button & (1u << i)))
           _canvas_event_feed_mouse_up_internal(eo_e, i + 1, 0, timestamp, 
data, parent_pe);
      }
    EINA_LIST_FOREACH_SAFE(e->touch_points, l, ll, point)
diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c
index 844b336..516c418 100644
--- a/src/lib/evas/canvas/evas_main.c
+++ b/src/lib/evas/canvas/evas_main.c
@@ -559,10 +559,10 @@ _evas_canvas_pointer_canvas_xy_get(Eo *eo_e EINA_UNUSED, 
Evas_Public_Data *e, Ev
    if (y) *y = e->pointer.y;
 }
 
-EOLIAN static int
+EOLIAN static unsigned int
 _evas_canvas_pointer_button_down_mask_get(Eo *eo_e EINA_UNUSED, 
Evas_Public_Data *e)
 {
-   return (int)e->pointer.button;
+   return e->pointer.button;
 }
 
 EOLIAN static Eina_Bool

-- 


Reply via email to