From: Luca Boccassi Date: Wed, 24 Jun 2026 12:46:04 +0000 (+0100) Subject: string-util: check for short input in previous_ansi_sequence() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f66144cf2acf51dda7e0a44f7590fc102e596c13;p=thirdparty%2Fsystemd.git string-util: check for short input in previous_ansi_sequence() ellipsize_mem() scans backwards for ANSI escape sequences and calls previous_ansi_sequence(s, t - s, ...) as t walks down toward s. When t reaches s + 1 the helper is invoked with length == 1 and computes 'length - 2', which wraps to SIZE_MAX - 1. Follow-up for cb558ab222f0dbda3afd985c2190f35693963ffa --- diff --git a/src/basic/string-util.c b/src/basic/string-util.c index 125d468d476..acd4bd87cf2 100644 --- a/src/basic/string-util.c +++ b/src/basic/string-util.c @@ -285,6 +285,12 @@ static size_t previous_ansi_sequence(const char *s, size_t length, const char ** /* Locate the previous ANSI sequence and save its start in *ret_where and return length. */ + if (length < 2) { + /* Need at least two bytes for an ANSI sequence */ + *ret_where = NULL; + return 0; + } + for (size_t i = length - 2; i > 0; i--) { /* -2 because at least two bytes are needed */ size_t slen = ansi_sequence_length(s + (i - 1), length - (i - 1)); if (slen == 0) diff --git a/src/test/test-string-util.c b/src/test/test-string-util.c index 51f63963a96..970421c7abb 100644 --- a/src/test/test-string-util.c +++ b/src/test/test-string-util.c @@ -9,6 +9,17 @@ #include "strv.h" #include "tests.h" +TEST(ellipsize_mem_ansi_short) { + _cleanup_free_ char *a = ellipsize_mem("X\x1b[m", 4, 1, 50); + assert_se(a); + + _cleanup_free_ char *b = ellipsize_mem(" \x1b[A", 4, 1, 0); + assert_se(b); + + _cleanup_free_ char *c = ellipsize_mem("\x1b[m", 3, 1, 50); + assert_se(c); +} + TEST(xsprintf) { char buf[5];