From: tokyo4j Date: Sun, 13 Oct 2024 22:55:15 +0000 (+0900) Subject: src/theme.c: fix misuse of wl_list_for_each X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=5f3600b0b89c6200e2763c149a46baaa2bafbc4f;p=proto%2Flabwc.git src/theme.c: fix misuse of wl_list_for_each The iterator value of `wl_list_for_each` should never be referenced outside the loop because it points to invalid memory location when the list is empty. --- diff --git a/src/theme.c b/src/theme.c index ae2ae400..c0af2ad6 100644 --- a/src/theme.c +++ b/src/theme.c @@ -297,29 +297,30 @@ load_button(struct theme *theme, struct button *b, int active) buttons[b->type][non_hover_state_set]); } - struct title_button *leftmost_button = NULL; + /* + * If the loaded button is at the corner of the titlebar, also create + * rounded variants. + */ + uint8_t rounded_state_set = b->state_set | LAB_BS_ROUNDED; + + struct title_button *leftmost_button; wl_list_for_each(leftmost_button, &rc.title_buttons_left, link) { + if (leftmost_button->type == b->type) { + create_rounded_buffer(theme, LAB_CORNER_TOP_LEFT, + &buttons[b->type][rounded_state_set], *buffer); + } break; } - struct title_button *rightmost_button = NULL; + struct title_button *rightmost_button; wl_list_for_each_reverse(rightmost_button, &rc.title_buttons_right, link) { + if (rightmost_button->type == b->type) { + create_rounded_buffer(theme, LAB_CORNER_TOP_RIGHT, + &buttons[b->type][rounded_state_set], *buffer); + } break; } - - /* - * If the loaded button is at the corner of the titlebar, also create - * rounded variants. - */ - uint8_t rounded_state_set = b->state_set | LAB_BS_ROUNDED; - if (leftmost_button && leftmost_button->type == b->type) { - create_rounded_buffer(theme, LAB_CORNER_TOP_LEFT, - &buttons[b->type][rounded_state_set], *buffer); - } else if (rightmost_button && rightmost_button->type == b->type) { - create_rounded_buffer(theme, LAB_CORNER_TOP_RIGHT, - &buttons[b->type][rounded_state_set], *buffer); - } } /*