From 5f3600b0b89c6200e2763c149a46baaa2bafbc4f Mon Sep 17 00:00:00 2001 From: tokyo4j Date: Mon, 14 Oct 2024 07:55:15 +0900 Subject: [PATCH] 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. --- src/theme.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) 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); - } } /* -- 2.52.0