]> git.mdlowis.com Git - proto/labwc.git/commitdiff
rcxml: validate total osd field width
authortokyo4j <hrak1529@gmail.com>
Sat, 3 May 2025 11:58:39 +0000 (20:58 +0900)
committerHiroaki Yamamoto <hrak1529@gmail.com>
Sun, 4 May 2025 15:05:24 +0000 (00:05 +0900)
Before this patch, window switcher fields could overflow if the sum of
<windowSwitcher><fields><field width=""> exceeds 100%.

include/osd.h
src/config/rcxml.c
src/osd-field.c

index d20975387ae412c40768f3bae65c51e60de51b24..806b88d4538f1fb6b69ab9a008116858db0b3438 100644 (file)
@@ -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
index 96ba6e2717e820e8ece426593c1d525da16ab6e2..56e47a11441663f69a78d156ff79bba0924ea742 100644 (file)
@@ -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);
index 7465d267d3c6425862e495b86f98af247438b049..5a12e97b5cfad13e2f0fc7056b7343a1fa77141c 100644 (file)
@@ -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");