Skip to content

Commit a335eed

Browse files
committed
c2: Fix scope of predefined target in leaf-matching
Keeping pointers to variables with smaller scope is unsafe as the compiler might choose to optimize them out.
1 parent 2e2b1ee commit a335eed

File tree

1 file changed

+34
-28
lines changed

1 file changed

+34
-28
lines changed

src/c2.c

+34-28
Original file line numberDiff line numberDiff line change
@@ -1330,36 +1330,40 @@ static inline void c2_match_once_leaf(session_t *ps, const struct managed_win *w
13301330

13311331
// Get the value
13321332
// A predefined target
1333+
long predef_target = 0;
13331334
if (pleaf->predef != C2_L_PUNDEFINED) {
1334-
long tgt = 0;
13351335
*perr = false;
13361336
switch (pleaf->predef) {
1337-
case C2_L_PID: tgt = wid; break;
1338-
case C2_L_PX: tgt = w->g.x; break;
1339-
case C2_L_PY: tgt = w->g.y; break;
1340-
case C2_L_PX2: tgt = w->g.x + w->widthb; break;
1341-
case C2_L_PY2: tgt = w->g.y + w->heightb; break;
1342-
case C2_L_PWIDTH: tgt = w->g.width; break;
1343-
case C2_L_PHEIGHT: tgt = w->g.height; break;
1344-
case C2_L_PWIDTHB: tgt = w->widthb; break;
1345-
case C2_L_PHEIGHTB: tgt = w->heightb; break;
1346-
case C2_L_PBDW: tgt = w->g.border_width; break;
1347-
case C2_L_PFULLSCREEN: tgt = win_is_fullscreen(ps, w); break;
1348-
case C2_L_POVREDIR: tgt = w->a.override_redirect; break;
1349-
case C2_L_PARGB: tgt = win_has_alpha(w); break;
1350-
case C2_L_PFOCUSED: tgt = win_is_focused_raw(ps, w); break;
1351-
case C2_L_PWMWIN: tgt = w->wmwin; break;
1352-
case C2_L_PBSHAPED: tgt = w->bounding_shaped; break;
1353-
case C2_L_PROUNDED: tgt = w->rounded_corners; break;
1354-
case C2_L_PCLIENT: tgt = w->client_win; break;
1355-
case C2_L_PLEADER: tgt = w->leader; break;
1337+
case C2_L_PID: predef_target = wid; break;
1338+
case C2_L_PX: predef_target = w->g.x; break;
1339+
case C2_L_PY: predef_target = w->g.y; break;
1340+
case C2_L_PX2: predef_target = w->g.x + w->widthb; break;
1341+
case C2_L_PY2: predef_target = w->g.y + w->heightb; break;
1342+
case C2_L_PWIDTH: predef_target = w->g.width; break;
1343+
case C2_L_PHEIGHT: predef_target = w->g.height; break;
1344+
case C2_L_PWIDTHB: predef_target = w->widthb; break;
1345+
case C2_L_PHEIGHTB: predef_target = w->heightb; break;
1346+
case C2_L_PBDW: predef_target = w->g.border_width; break;
1347+
case C2_L_PFULLSCREEN:
1348+
predef_target = win_is_fullscreen(ps, w);
1349+
break;
1350+
case C2_L_POVREDIR: predef_target = w->a.override_redirect; break;
1351+
case C2_L_PARGB: predef_target = win_has_alpha(w); break;
1352+
case C2_L_PFOCUSED:
1353+
predef_target = win_is_focused_raw(ps, w);
1354+
break;
1355+
case C2_L_PWMWIN: predef_target = w->wmwin; break;
1356+
case C2_L_PBSHAPED: predef_target = w->bounding_shaped; break;
1357+
case C2_L_PROUNDED: predef_target = w->rounded_corners; break;
1358+
case C2_L_PCLIENT: predef_target = w->client_win; break;
1359+
case C2_L_PLEADER: predef_target = w->leader; break;
13561360
default:
13571361
*perr = true;
13581362
assert(0);
13591363
break;
13601364
}
13611365
ntargets = 1;
1362-
targets = &tgt;
1366+
targets = &predef_target;
13631367
}
13641368
// A raw window property
13651369
else {
@@ -1423,18 +1427,20 @@ static inline void c2_match_once_leaf(session_t *ps, const struct managed_win *w
14231427
size_t ntargets = 0;
14241428

14251429
// A predefined target
1430+
const char *predef_target = NULL;
14261431
if (pleaf->predef != C2_L_PUNDEFINED) {
1427-
const char *tgt = NULL;
14281432
switch (pleaf->predef) {
1429-
case C2_L_PWINDOWTYPE: tgt = WINTYPES[w->window_type]; break;
1430-
case C2_L_PNAME: tgt = w->name; break;
1431-
case C2_L_PCLASSG: tgt = w->class_general; break;
1432-
case C2_L_PCLASSI: tgt = w->class_instance; break;
1433-
case C2_L_PROLE: tgt = w->role; break;
1433+
case C2_L_PWINDOWTYPE:
1434+
predef_target = WINTYPES[w->window_type];
1435+
break;
1436+
case C2_L_PNAME: predef_target = w->name; break;
1437+
case C2_L_PCLASSG: predef_target = w->class_general; break;
1438+
case C2_L_PCLASSI: predef_target = w->class_instance; break;
1439+
case C2_L_PROLE: predef_target = w->role; break;
14341440
default: assert(0); break;
14351441
}
14361442
ntargets = 1;
1437-
targets = &tgt;
1443+
targets = &predef_target;
14381444
}
14391445
// An atom type property, convert it to string
14401446
else if (pleaf->type == C2_L_TATOM) {

0 commit comments

Comments
 (0)