From cb58156904ec3e3401c8600b784485c36b978716 Mon Sep 17 00:00:00 2001 From: tokyo4j Date: Sat, 3 May 2025 20:58:39 +0900 Subject: [PATCH] rcxml: validate total osd field width Before this patch, window switcher fields could overflow if the sum of exceeds 100%. --- include/osd.h | 2 +- src/config/rcxml.c | 4 +++- src/osd-field.c | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/osd.h b/include/osd.h index d2097538..806b88d4 100644 --- a/include/osd.h +++ b/include/osd.h @@ -59,7 +59,7 @@ void osd_field_get_content(struct window_switcher_field *field, struct window_switcher_field *osd_field_create(void); void osd_field_arg_from_xml_node(struct window_switcher_field *field, const char *nodename, const char *content); -bool osd_field_validate(struct window_switcher_field *field); +bool osd_field_is_valid(struct window_switcher_field *field); void osd_field_free(struct window_switcher_field *field); #endif // LABWC_OSD_H diff --git a/src/config/rcxml.c b/src/config/rcxml.c index 96ba6e27..56e47a11 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -1941,9 +1941,11 @@ validate(void) validate_actions(); /* OSD fields */ + int field_width_sum = 0; struct window_switcher_field *field, *field_tmp; wl_list_for_each_safe(field, field_tmp, &rc.window_switcher.fields, link) { - if (!osd_field_validate(field)) { + field_width_sum += field->width; + if (!osd_field_is_valid(field) || field_width_sum > 100) { wlr_log(WLR_ERROR, "Deleting invalid window switcher field %p", field); wl_list_remove(&field->link); osd_field_free(field); diff --git a/src/osd-field.c b/src/osd-field.c index 7465d267..5a12e97b 100644 --- a/src/osd-field.c +++ b/src/osd-field.c @@ -352,7 +352,7 @@ osd_field_arg_from_xml_node(struct window_switcher_field *field, } bool -osd_field_validate(struct window_switcher_field *field) +osd_field_is_valid(struct window_switcher_field *field) { if (field->content == LAB_FIELD_NONE) { wlr_log(WLR_ERROR, "Invalid OSD field: no content set"); -- 2.52.0