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 <ran234@gmail.com>
master
Ran Benita 2018-08-18 14:28:15 +03:00
parent f8134c8503
commit a9ace75f64
2 changed files with 3 additions and 2 deletions

View File

@ -31,6 +31,7 @@ foreach cflag: [
'-Wdate-time', '-Wdate-time',
'-Wwrite-strings', '-Wwrite-strings',
'-Wno-documentation-deprecated-sync', '-Wno-documentation-deprecated-sync',
'-fsanitize-undefined-trap-on-error',
] ]
if cc.has_argument(cflag) if cc.has_argument(cflag)
add_project_arguments(cflag, language: 'c') add_project_arguments(cflag, language: 'c')

View File

@ -218,8 +218,8 @@ translate_action(union xkb_action *action, const xcb_xkb_action_t *wire)
case XCB_XKB_SA_TYPE_MOVE_PTR: case XCB_XKB_SA_TYPE_MOVE_PTR:
action->type = ACTION_TYPE_PTR_MOVE; action->type = ACTION_TYPE_PTR_MOVE;
action->ptr.x = (wire->moveptr.xLow | (wire->moveptr.xHigh << 8)); action->ptr.x = (int16_t) (wire->moveptr.xLow | ((uint16_t) wire->moveptr.xHigh << 8));
action->ptr.y = (wire->moveptr.yLow | (wire->moveptr.yHigh << 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)) if (!(wire->moveptr.flags & XCB_XKB_SA_MOVE_PTR_FLAG_NO_ACCELERATION))
action->ptr.flags |= ACTION_ACCEL; action->ptr.flags |= ACTION_ACCEL;