From 1af1bbf33b0240991ab58679fa84e2f8fd53d46c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?=
Date: Mon, 5 Oct 2026 12:53:37 +0100 Subject: [PATCH] fold: fix backspace handling with multi-cell characters * src/fold.c (adjust_column): Clamp the column decrement to 0. * tests/fold/fold-characters.sh: Add a test case. * NEWS: Mention the bug fix. --- NEWS | 4 ++++ src/fold.c | 5 +---- tests/fold/fold-characters.sh | 5 +++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 72f904eee..0154ba07d 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,10 @@ GNU coreutils NEWS -*- outline -*- the \u0085 (next line) character as a separator on non-GLIBC platforms. [bug introduced in coreutils-9.11] + 'fold' no longer prematurely wraps lines with a wide character towards + the start of a line, followed by multiple backspaces. + [bug introduced in coreutils-9.8] + 'realpath' without -s, or 'readlink' with -e,-f,-m no longer loop infinitely when resolving a symbolic link which resolves to a path beginning with the symbolic link itself. diff --git a/src/fold.c b/src/fold.c index f49078f01..2d725c3d5 100644 --- a/src/fold.c +++ b/src/fold.c @@ -117,10 +117,7 @@ adjust_column (size_t column, mcel_t g) if (counting_mode != COUNT_BYTES) { if (g.ch == '\b') - { - if (column > 0) - column -= last_character_width; - } + column -= MIN (last_character_width, column); else if (g.ch == '\r') column = 0; else if (g.ch == '\t') diff --git a/tests/fold/fold-characters.sh b/tests/fold/fold-characters.sh index 42fb8f737..cfdee2b3e 100755 --- a/tests/fold/fold-characters.sh +++ b/tests/fold/fold-characters.sh @@ -92,4 +92,9 @@ compare exp4 out4 || fail=1 # Check bad character at EOF test $(env printf '\xC3' | fold | wc -c) = 1 || fail=1 +# Ensure backspace clamps at position 0 +# From v9.8 to v9.12 inclusive, an internal unsigned could wrap, +# causing premature line wrapping. +test $(env printf 'A\uB250\b\bB\n' | fold -w80 | wc -l) = 1 || fail=1 + Exit $fail