Re: Bug#1135587: screen: screen no longer works on big-endian systems

John Paul Adrian Glaubitz <[email protected]>
Newsgroups gmane.linux.debian.ports.s390,gmane.linux.debian.ports.powerpc,gmane.linux.debian.ports.sparc
Message-ID <80f9b3d3d0053f825e30d66dfe7931048b660cbf.camel@physik.fu-berlin.de>
Control: tags -1 +patch
Control: tags -1 +upstream

Hi Pranav,

On Mon, 2026-05-04 at 12:11 +0200, John Paul Adrian Glaubitz wrote:
> Hi Pranav,
> 
> On Mon, 2026-05-04 at 09:46 +0000, Pranav P wrote:
> > There seems to be a fix for this here in https://savannah.gnu.org/bugs/?67607
> > (https://cgit.git.savannah.gnu.org/cgit/screen.git/diff/?h=screen-v5&id=ccd0b27504707e4f3099f0b9fd7a89489c6973fb)
> > 
> > I have tested this patch on my s390x machine and it does seem to work fine.
> 
> Thanks for the heads-up! I'll test it on both big-endian PowerPC and SPARC.

I can confirm that the attached patch extracted from the commit above fixes the problem.

Adrian

-- 
 .''`.  John Paul Adrian Glaubitz
: :' :  Debian Developer
`. `'   Physicist
  `-    GPG: 62FF 8A75 84E0 2956 9546  0006 7426 3B37 F5B5 F913
screen-fix-input-on-big-endian.patch (text/x-patch, 7 KB)
From ccd0b27504707e4f3099f0b9fd7a89489c6973fb Mon Sep 17 00:00:00 2001
From: Alexander Naumov <[email protected]>
Date: Sat, 3 Jan 2026 17:26:27 +0100
Subject: Fix: unable to type in screen on big-endian systems
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Thanks to Petr Sumbera <[email protected]>
and Dan Horák <[email protected]>

bug#67607
---
 src/telnet.c |  2 +-
 src/telnet.h |  2 +-
 src/window.c | 38 +++++++++++++++++++-------------------
 src/window.h |  6 +++---
 4 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/src/telnet.c b/src/telnet.c
index 69d75ee..c70e2da 100644
--- a/src/telnet.c
+++ b/src/telnet.c
@@ -228,7 +228,7 @@ void TelProcessLine(char **bufpp, size_t *lenp)
 	*lenp = 0;
 }
 
-int DoTelnet(char *buf, size_t *lenp, int f)
+int DoTelnet(char *buf, int *lenp, int f)
 {
 	int echo = !fore->w_telropts[TO_ECHO];
 	int cmode = fore->w_telropts[TO_SGA];
diff --git a/src/telnet.h b/src/telnet.h
index fefcc0a..792a93a 100644
--- a/src/telnet.h
+++ b/src/telnet.h
@@ -9,7 +9,7 @@
 int TelOpenAndConnect(Window *);
 int TelIsline(Window *);
 void TelProcessLine(char **, size_t *);
-int DoTelnet(char *, size_t *, int);
+int DoTelnet(char *, int *, int);
 int TelIn(Window *, char *, size_t, int);
 void TelBreak(Window *);
 void TelWindowSize(Window *);
diff --git a/src/window.c b/src/window.c
index cee06fd..68fc006 100644
--- a/src/window.c
+++ b/src/window.c
@@ -61,7 +61,7 @@ static void WinRedisplayLine(int, int, int, int);
 static void WinClearLine(int, int, int, int);
 static int WinResize(int, int);
 static void WinRestore(void);
-static int DoAutolf(char *, size_t *, int);
+static int DoAutolf(char *, int *, int);
 static void ZombieProcess(char **, size_t *);
 static void win_readev_fn(Event *, void *);
 static void win_writeev_fn(Event *, void *);
@@ -74,9 +74,9 @@ static void win_silenceev_fn(Event *, void *);
 static void win_destroyev_fn(Event *, void *);
 
 static int ForkWindow(Window *, char **, char *);
-static void zmodem_found(Window *, int, char *, size_t);
+static void zmodem_found(Window *, int, char *, int);
 static void zmodemFin(char *, size_t, void *);
-static int zmodem_parse(Window *, char *, size_t);
+static int zmodem_parse(Window *, char *, int);
 
 bool VerboseCreate = false;		/* XXX move this to user.h */
 
@@ -191,10 +191,10 @@ const struct LayFuncs WinLf = {
 	NULL
 };
 
-static int DoAutolf(char *buf, size_t *lenp, int fr)
+static int DoAutolf(char *buf, int *lenp, int fr)
 {
 	char *p;
-	size_t len = *lenp;
+	int len = *lenp;
 	int trunc = 0;
 
 	for (p = buf; len > 0; p++, len--) {
@@ -215,7 +215,7 @@ static int DoAutolf(char *buf, size_t *lenp, int fr)
 
 static void WinProcess(char **bufpp, size_t *lenp)
 {
-	size_t l2 = 0, f, *ilen, l = *lenp, trunc;
+	int l2 = 0, f, *ilen, l = *lenp, trunc;
 	char *ibuf;
 
 	fore = (Window *)flayer->l_data;
@@ -291,7 +291,7 @@ static void WinProcess(char **bufpp, size_t *lenp)
 
 static void ZombieProcess(char **bufpp, size_t *lenp)
 {
-	size_t l = *lenp;
+	int l = *lenp;
 	char *buf = *bufpp, b1[10], b2[10];
 
 	fore = (Window *)flayer->l_data;
@@ -699,7 +699,7 @@ int MakeWindow(struct NewWindow *newwin)
 	p->w_readev.data = p->w_writeev.data = (char *)p;
 	p->w_readev.handler = win_readev_fn;
 	p->w_writeev.handler = win_writeev_fn;
-	p->w_writeev.condpos = (int *)&p->w_inlen;
+	p->w_writeev.condpos = &p->w_inlen;
 	evenq(&p->w_readev);
 	evenq(&p->w_writeev);
 	p->w_paster.pa_slowev.type = EV_TIMEOUT;
@@ -1344,7 +1344,7 @@ int winexec(char **av)
 	pwin->p_readev.data = pwin->p_writeev.data = (char *)w;
 	pwin->p_readev.handler = pseu_readev_fn;
 	pwin->p_writeev.handler = pseu_writeev_fn;
-	pwin->p_writeev.condpos = (int *)&pwin->p_inlen;
+	pwin->p_writeev.condpos = &pwin->p_inlen;
 	if (pwin->p_fdpat & (F_PFRONT << F_PSHIFT * 2 | F_PFRONT << F_PSHIFT))
 		evenq(&pwin->p_readev);
 	evenq(&pwin->p_writeev);
@@ -1378,7 +1378,7 @@ void FreePseudowin(Window *w)
 	}
 	evdeq(&pwin->p_readev);
 	evdeq(&pwin->p_writeev);
-	if (w->w_readev.condneg == (int *)&pwin->p_inlen)
+	if (w->w_readev.condneg == &pwin->p_inlen)
 		w->w_readev.condpos = w->w_readev.condneg = NULL;
 	evenq(&w->w_readev);
 	free((char *)pwin);
@@ -1484,7 +1484,7 @@ static void win_readev_fn(Event *event, void *data)
 		size = IOSIZE - p->w_pwin->p_inlen;
 		if (size <= 0) {
 			event->condpos = &const_IOSIZE;
-			event->condneg = (int *)&p->w_pwin->p_inlen;
+			event->condneg = &p->w_pwin->p_inlen;
 			return;
 		}
 	}
@@ -1563,7 +1563,7 @@ static void win_resurrect_zombie_fn(Event *event, void *data)
 static void win_writeev_fn(Event *event, void *data)
 {
 	Window *p = (Window *)data;
-	size_t len;
+	int len;
 	if (p->w_inlen) {
 		if ((len = write(event->fd, p->w_inbuf, p->w_inlen)) <= 0)
 			len = p->w_inlen;	/* dead window */
@@ -1600,7 +1600,7 @@ static void pseu_readev_fn(Event *event, void *data)
 		size = IOSIZE - p->w_inlen;
 		if (size <= 0) {
 			event->condpos = &const_IOSIZE;
-			event->condneg = (int *)&p->w_inlen;
+			event->condneg = &p->w_inlen;
 			return;
 		}
 	}
@@ -1643,7 +1643,7 @@ static void pseu_writeev_fn(Event *event, void *data)
 {
 	Window *p = (Window *)data;
 	struct pseudowin *pw = p->w_pwin;
-	size_t len;
+	int len;
 
 	if (pw->p_inlen == 0)
 		return;
@@ -1683,10 +1683,10 @@ static void win_destroyev_fn(Event *event, void *data)
 	WindowDied(p, p->w_exitstatus, 1);
 }
 
-static int zmodem_parse(Window *p, char *bp, size_t len)
+static int zmodem_parse(Window *p, char *bp, int len)
 {
 	char *b2 = bp;
-	for (size_t i = 0; i < len; i++, b2++) {
+	for (int i = 0; i < len; i++, b2++) {
 		if (p->w_zauto == 0) {
 			for (; i < len; i++, b2++)
 				if (*b2 == 030)
@@ -1756,14 +1756,14 @@ static void zmodemFin(char *buf, size_t len, void *data)
 	}
 }
 
-static void zmodem_found(Window *p, int send, char *bp, size_t len)
+static void zmodem_found(Window *p, int send, char *bp, int len)
 {
 	char *s;
 	size_t n;
 
 	/* check for abort sequence */
 	n = 0;
-	for (size_t i = 0; i < len; i++)
+	for (int i = 0; i < len; i++)
 		if (bp[i] != 030)
 			n = 0;
 		else if (++n > 4)
@@ -1792,7 +1792,7 @@ static void zmodem_found(Window *p, int send, char *bp, size_t len)
 		display = d;
 		evdeq(&D_blockedev);
 		D_readev.condpos = &const_IOSIZE;
-		D_readev.condneg = (int *)&p->w_inlen;
+		D_readev.condneg = &p->w_inlen;
 		ClearAll();
 		GotoPos(0, 0);
 		SetRendition(&mchar_blank);
diff --git a/src/window.h b/src/window.h
index 3834650..e1c1a68 100644
--- a/src/window.h
+++ b/src/window.h
@@ -79,7 +79,7 @@ struct pseudowin {
 	char	p_cmd[MAXSTR];
 	char	p_tty[MAXSTR];
 	char	p_inbuf[IOSIZE];	/* buffered writing to p_ptyfd */
-	size_t	p_inlen;
+	int	p_inlen;
 };
 
 /* bits for fdpat: */
@@ -157,9 +157,9 @@ struct Window {
 	int	 w_poll_zombie_timeout;
 	int	 w_ptyfd;		/* fd of the master pty */
 	char	 w_inbuf[IOSIZE];
-	size_t	 w_inlen;
+	int	 w_inlen;
 	char	 w_outbuf[IOSIZE];
-	size_t	 w_outlen;
+	int	 w_outlen;
 	bool	 w_aflag;		/* (-a option) */
 	bool	 w_dynamicaka;		/* should we change name */
 	char	*w_title;		/* name of the window */
-- 
cgit v1.2.3
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.