From a9ace75f6492304a59ae7b192b05f241e2694764 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Sat, 18 Aug 2018 14:28:15 +0300 Subject: [PATCH] x11: fix undefined behavior when copying the coordinates of ptr movements actions Left shift of a negative integer. For some reason the protocol representation here got really botched (in the spec it is just a nice and simple INT16). Signed-off-by: Ran Benita --- meson.build | 1 + src/x11/keymap.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 9effe29..87193dd 100644 --- a/meson.build +++ b/meson.build @@ -31,6 +31,7 @@ foreach cflag: [ '-Wdate-time', '-Wwrite-strings', '-Wno-documentation-deprecated-sync', + '-fsanitize-undefined-trap-on-error', ] if cc.has_argument(cflag) add_project_arguments(cflag, language: 'c') diff --git a/src/x11/keymap.c b/src/x11/keymap.c index 1642011..701b614 100644 --- a/src/x11/keymap.c +++ b/src/x11/keymap.c @@ -218,8 +218,8 @@ translate_action(union xkb_action *action, const xcb_xkb_action_t *wire) case XCB_XKB_SA_TYPE_MOVE_PTR: action->type = ACTION_TYPE_PTR_MOVE; - action->ptr.x = (wire->moveptr.xLow | (wire->moveptr.xHigh << 8)); - action->ptr.y = (wire->moveptr.yLow | (wire->moveptr.yHigh << 8)); + action->ptr.x = (int16_t) (wire->moveptr.xLow | ((uint16_t) wire->moveptr.xHigh << 8)); + action->ptr.y = (int16_t) (wire->moveptr.yLow | ((uint16_t) wire->moveptr.yHigh << 8)); if (!(wire->moveptr.flags & XCB_XKB_SA_MOVE_PTR_FLAG_NO_ACCELERATION)) action->ptr.flags |= ACTION_ACCEL;