Skip to content

Commit 200c14a

Browse files
committed
Fix int casts related to XkbWrapGroupIntoRange
1 parent f78ba25 commit 200c14a

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

src/keymap-priv.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
#include "config.h"
1010

11+
#include <assert.h>
12+
#include <stdint.h>
13+
1114
#include "xkbcommon/xkbcommon-names.h"
1215
#include "keymap.h"
1316

@@ -174,8 +177,9 @@ XkbWrapGroupIntoRange(int32_t group,
174177
* C99 says a negative dividend in a modulo operation always
175178
* gives a negative result.
176179
*/
180+
static_assert(XKB_MAX_GROUPS < INT32_MAX, "Max groups don't fit");
177181
if (group < 0)
178-
return ((int) num_groups + (group % (int) num_groups));
182+
return ((int32_t) num_groups + (group % (int32_t) num_groups));
179183
else
180184
return group % num_groups;
181185
}

src/keymap.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313

1414
#include "config.h"
1515

16+
#include <assert.h>
17+
#include <stdint.h>
18+
1619
#include "keymap.h"
1720
#include "text.h"
1821

@@ -35,7 +38,7 @@ xkb_keymap_unref(struct xkb_keymap *keymap)
3538
if (key->groups) {
3639
for (unsigned i = 0; i < key->num_groups; i++) {
3740
if (key->groups[i].levels) {
38-
for (unsigned j = 0; j < XkbKeyNumLevels(key, i); j++) {
41+
for (xkb_level_index_t j = 0; j < XkbKeyNumLevels(key, i); j++) {
3942
if (key->groups[i].levels[j].num_syms > 1)
4043
free(key->groups[i].levels[j].s.syms);
4144
if (key->groups[i].levels[j].num_actions > 1)
@@ -336,7 +339,8 @@ xkb_keymap_num_levels_for_key(struct xkb_keymap *keymap, xkb_keycode_t kc,
336339
if (!key)
337340
return 0;
338341

339-
layout = XkbWrapGroupIntoRange(layout, key->num_groups,
342+
static_assert(XKB_MAX_GROUPS < INT32_MAX, "Max groups don't fit");
343+
layout = XkbWrapGroupIntoRange((int32_t) layout, key->num_groups,
340344
key->out_of_range_group_action,
341345
key->out_of_range_group_number);
342346
if (layout == XKB_LAYOUT_INVALID)
@@ -398,7 +402,8 @@ xkb_keymap_key_get_mods_for_level(struct xkb_keymap *keymap,
398402
if (!key)
399403
return 0;
400404

401-
layout = XkbWrapGroupIntoRange(layout, key->num_groups,
405+
static_assert(XKB_MAX_GROUPS < INT32_MAX, "Max groups don't fit");
406+
layout = XkbWrapGroupIntoRange((int32_t) layout, key->num_groups,
402407
key->out_of_range_group_action,
403408
key->out_of_range_group_number);
404409
if (layout == XKB_LAYOUT_INVALID)
@@ -461,7 +466,8 @@ xkb_keymap_key_get_syms_by_level(struct xkb_keymap *keymap,
461466
if (!key)
462467
goto err;
463468

464-
layout = XkbWrapGroupIntoRange(layout, key->num_groups,
469+
static_assert(XKB_MAX_GROUPS < INT32_MAX, "Max groups don't fit");
470+
layout = XkbWrapGroupIntoRange((int32_t) layout, key->num_groups,
465471
key->out_of_range_group_action,
466472
key->out_of_range_group_number);
467473
if (layout == XKB_LAYOUT_INVALID)

src/state.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222

2323
#include "config.h"
2424

25+
#include <assert.h>
26+
#include <stdint.h>
27+
2528
#include "keymap.h"
2629
#include "keysym.h"
2730
#include "utf8.h"
@@ -132,7 +135,9 @@ xkb_state_key_get_layout(struct xkb_state *state, xkb_keycode_t kc)
132135
if (!key)
133136
return XKB_LAYOUT_INVALID;
134137

135-
return XkbWrapGroupIntoRange(state->components.group, key->num_groups,
138+
static_assert(XKB_MAX_GROUPS < INT32_MAX, "Max groups don't fit");
139+
return XkbWrapGroupIntoRange((int32_t) state->components.group,
140+
key->num_groups,
136141
key->out_of_range_group_action,
137142
key->out_of_range_group_number);
138143
}

0 commit comments

Comments
 (0)