From: Mark Nudelman <markn@greenwoodsoftware.com>
Date: Tue, 23 Apr 2024 10:54:50 -0700
Subject: Fix incorrect display when filename contains control chars. Such
 chars should not be printed directly to the screen, but instead passed
 through prchar() or prutfchar().
Origin: https://github.com/gwsw/less/commit/2a642a07d86f7f9484db18cd748bc521e71c997f
Bug-Debian: https://bugs.debian.org/1069681

---
 output.c | 12 ++++++++++--
 prompt.c | 17 ++++++++++++-----
 2 files changed, 22 insertions(+), 7 deletions(-)

--- a/output.c
+++ b/output.c
@@ -32,6 +32,7 @@ extern int screen_trashed;
 extern int any_display;
 extern int is_tty;
 extern int oldbot;
+extern int utf_mode;
 
 #if MSDOS_COMPILER==WIN32C || MSDOS_COMPILER==BORLANDC || MSDOS_COMPILER==DJGPPC
 extern int ctldisp;
@@ -541,6 +542,7 @@ less_printf(fmt, parg)
 	PARG *parg;
 {
 	char *s;
+	char *es;
 	int col;
 
 	col = 0;
@@ -557,11 +559,17 @@ less_printf(fmt, parg)
 			{
 			case 's':
 				s = parg->p_string;
+				es = s + strlen(s);
 				parg++;
 				while (*s != '\0')
 				{
-					putchr(*s++);
-					col++;
+					LWCHAR ch = step_char(&s, +1, es);
+					constant char *ps = utf_mode ? prutfchar(ch) : prchar(ch);
+					while (*ps != '\0')
+					{
+						putchr(*ps++);
+						col++;
+					}
 				}
 				break;
 			case 'd':
--- a/prompt.c
+++ b/prompt.c
@@ -29,6 +29,7 @@ extern int hshift;
 extern int sc_height;
 extern int jump_sline;
 extern int less_is_more;
+extern int utf_mode;
 extern IFILE curr_ifile;
 #if EDITOR
 extern char *editor;
@@ -83,13 +84,17 @@ init_prompt(VOID_PARAM)
 ap_str(s)
 	char *s;
 {
-	int len;
-
-	len = (int) strlen(s);
-	if (mp + len >= message + PROMPT_SIZE)
-		len = (int) (message + PROMPT_SIZE - mp - 1);
-	strncpy(mp, s, len);
-	mp += len;
+	char *es = s + strlen(s);
+	while (*s != '\0')
+	{
+	        LWCHAR ch = step_char(&s, +1, es);
+	        constant char *ps = utf_mode ? prutfchar(ch) : prchar(ch);
+	        size_t plen = strlen(ps);
+	        if (mp + plen >= message + PROMPT_SIZE)
+	                break;
+	        strcpy(mp, ps);
+	        mp += plen;
+	}
 	*mp = '\0';
 }
 
