From 4f0c0628a20f89c6238f1f360273ae2556901727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 5 Apr 2021 21:06:48 +0200 Subject: [PATCH] osc: verify OSC 4/104 color index is valid Closes #434 --- CHANGELOG.md | 3 +++ osc.c | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 970c070b..caadf51b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,9 @@ when output scaling was enabled (https://codeberg.org/dnkl/foot/issues/409). * Empty sixels resulted in non-empty images. +* OSC-4/104 out-of-bounds accesses to the color table. This was the + reason pywal turned foot windows transparent + (https://codeberg.org/dnkl/foot/issues/434). ## 1.7.0 diff --git a/osc.c b/osc.c index bf97db52..68783701 100644 --- a/osc.c +++ b/osc.c @@ -575,6 +575,11 @@ osc_dispatch(struct terminal *term) idx += c - '0'; } + if (idx >= ALEN(term->colors.table)) { + LOG_WARN("invalid OSC 4 color index: %u", idx); + break; + } + /* Client queried for current value */ if (strlen(s_color) == 1 && s_color[0] == '?') { uint32_t color = term->colors.table[idx]; @@ -698,7 +703,7 @@ osc_dispatch(struct terminal *term) if (strlen(string) == 0) { LOG_DBG("resetting all colors"); - for (size_t i = 0; i < 256; i++) { + for (size_t i = 0; i < ALEN(term->colors.table); i++) { update_color_in_grids( term, term->colors.table[i], term->colors.default_table[i]); term->colors.table[i] = term->colors.default_table[i]; @@ -717,6 +722,11 @@ osc_dispatch(struct terminal *term) idx += c - '0'; } + if (idx >= ALEN(term->colors.table)) { + LOG_WARN("invalid OSC 104 color index: %u", idx); + continue; + } + LOG_DBG("resetting color #%u", idx); update_color_in_grids( term, term->colors.table[idx], term->colors.default_table[idx]);