Re: [PATCH] Secure login and sulogin on S390x

"Dr. Werner Fink" <[email protected]> Mon, 4 May 2026 13:31:52 +0200
Newsgroups org.kernel.vger.util-linux
Message-ID <[email protected]>
--m7A4WK9JcQLwsVy7
Content-Type: multipart/mixed; protected-headers=v1;
	boundary="zYJTpbyDZJLraOxV"
Content-Disposition: inline
Date: Mon, 4 May 2026 13:31:52 +0200
From: "Dr. Werner Fink" <[email protected]>
To: [email protected]
Subject: Re: [PATCH] Secure login and sulogin on S390x


--zYJTpbyDZJLraOxV
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hi,

just to extend the last patch with a further one ro catch
all corner cases as well.

Werner

--=20
  "Having a smoking section in a restaurant is like having
          a peeing section in a swimming pool." -- Edward Burr

--zYJTpbyDZJLraOxV
Content-Type: text/x-patch; charset=utf-8
Content-Disposition: attachment; filename=x.patch
Content-Transfer-Encoding: quoted-printable

=46rom a6c23b4d8ad84fff4a58855b76b56a261ff8aa5e Mon Sep 17 00:00:00 2001
=46rom: Werner Fink <[email protected]>
Date: Mon, 4 May 2026 13:20:13 +0200
Subject: [PATCH] Ensure to detect all special console case on S390x

Signed-off-by: Werner Fink <[email protected]>
---
 login-utils/sulogin-consoles.c | 46 ++++++++++++++++++++++------------
 1 file changed, 30 insertions(+), 16 deletions(-)

diff --git a/login-utils/sulogin-consoles.c b/login-utils/sulogin-consoles.c
index f09d90ece..4cce4f078 100644
--- a/login-utils/sulogin-consoles.c
+++ b/login-utils/sulogin-consoles.c
@@ -312,7 +312,7 @@ static
 #ifdef __GNUC__
 __attribute__((__hot__))
 #endif
-int append_console(struct list_head *consoles, const char * const name)
+int append_console(struct list_head *consoles, const char * const name, de=
v_t dev)
 {
 	struct console *restrict tail;
 	const struct console *last =3D NULL;
@@ -343,7 +343,29 @@ int append_console(struct list_head *consoles, const c=
har * const name)
 	tail->reset_tty_context =3D NULL;
 	tail->user_tty_context =3D NULL;
 #endif
-
+#if defined(__s390__) || defined(__s390x__)
+	/*
+	 * Stat the device path to determine its major/minor numbers.=20
+	 * This ensures we detect s390x terminal types regardless of whether=20
+	 * the console was found via /proc, /sys, cmdline, or a direct stdin=20
+	 * fallback (e.g. sulogin < /dev/ttyS0).
+	 */
+	if (!dev) {
+		struct stat st;
+		if (stat(name, &st) =3D=3D 0 && S_ISCHR(st.st_mode))
+			dev =3D st.st_rdev;
+	}
+	if (dev) {
+		unsigned int maj =3D major(dev);
+		unsigned int min =3D minor(dev);
+		if (maj =3D=3D 4 && min =3D=3D 64)
+			tail->flags |=3D CON_3215;
+		else if (maj =3D=3D 4 && min >=3D 65)
+			tail->flags |=3D CON_SCLP;
+		else if (maj =3D=3D 227 && min >=3D 1)
+			tail->flags |=3D CON_3270;
+	}
+#endif
 	return 0;
 }
=20
@@ -385,7 +407,7 @@ static int detect_consoles_from_proc(struct list_head *=
consoles)
 		name =3D scandev(dir, comparedev);
 		if (!name)
 			continue;
-		rc =3D append_console(consoles, name);
+		rc =3D append_console(consoles, name, comparedev);
 		free(name);
 		if (rc < 0)
 			goto done;
@@ -394,14 +416,6 @@ static int detect_consoles_from_proc(struct list_head =
*consoles)
 			last =3D list_last_entry(consoles, struct console, entry);
 			if (!strchr(fbuf, 'C'))
 				last->flags |=3D CON_CONSDEV;
-#if defined(__s390__) || defined(__s390x__)
-			if (maj =3D=3D 4 && min =3D=3D 64)
-				last->flags |=3D CON_3215;
-			if (maj =3D=3D 4 && min >=3D 65)
-				last->flags |=3D CON_SCLP;
-			else if (maj =3D=3D 227 && min >=3D 1)
-				last->flags |=3D CON_3270;
-#endif
 		}
 	}
=20
@@ -461,7 +475,7 @@ static int detect_consoles_from_sysfs(struct list_head =
*consoles)
 		name =3D scandev(dir, comparedev);
 		if (!name)
 			continue;
-		rc =3D append_console(consoles, name);
+		rc =3D append_console(consoles, name, comparedev);
 		free(name);
 		if (rc < 0)
 			goto done;
@@ -549,7 +563,7 @@ static int detect_consoles_from_cmdline(struct list_hea=
d *consoles)
 		name =3D scandev(dir, comparedev);
 		if (!name)
 			continue;
-		rc =3D append_console(consoles, name);
+		rc =3D append_console(consoles, name, comparedev);
 		free(name);
 		if (rc < 0)
 			goto done;
@@ -607,7 +621,7 @@ static int detect_consoles_from_tiocgdev(struct list_he=
ad *consoles,
 			goto done;
 		}
 	}
-	rc =3D append_console(consoles, name);
+	rc =3D append_console(consoles, name, comparedev);
 	free(name);
 	if (rc < 0)
 		goto done;
@@ -721,7 +735,7 @@ int detect_consoles(const char *device, const int fallb=
ack, struct list_head *co
 		closedir(dir);
=20
 		if (name) {
-			rc =3D append_console(consoles, name);
+			rc =3D append_console(consoles, name, comparedev);
 			free(name);
 			if (rc < 0)
 				return rc;
@@ -798,7 +812,7 @@ fallback:
 		n =3D strdup(name);
 		if (!n)
 			return -ENOMEM;
-		rc =3D append_console(consoles, n);
+		rc =3D append_console(consoles, n, 0);
 		free(n);
 		if (rc < 0)
 			return rc;
--=20
2.51.0


--zYJTpbyDZJLraOxV--

--m7A4WK9JcQLwsVy7
Content-Type: application/pgp-signature; name=signature.asc

-----BEGIN PGP SIGNATURE-----

iQJgBAABCABKFiEEGwa/WjgpkPvLonW+UOkNVR3Bay4FAmn4g6gsFIAAAAAAFQAO
cGthLWFkZHJlc3NAZ251cGcub3Jnd2VybmVyQHN1c2UuZGUACgkQUOkNVR3Bay6x
+g//QvogPiNIpGHJXG6aZHR/X4C/1m7iL+1zxEW8AG7KPPCXTX9ZM58OP435N5l4
uf6su/yi7AlhRmvTqS+Eyme+HyX+11qvoOy1SvPuJSkheInYVaN23LE1ardtqud/
z3OLs99WO3HOTd01Ke/+WcPAbQopt+Wh3YLLNjoVdCxj9obOCbXWv1Fhq44ub055
T8I14zLZ5+dnfsh/dYcjMa1n70IfbkPEHdSbv2Ey8TCGRglI7JFuxPpFvjcHJUBH
bI7/s8NoOz0M2Cv7cFQhO+8dlUDvuvsJZ0cMtDtQsR1E147yNlk7rWK2XX93zXyK
YUaMvnwfHgmcw4o5mTCT/P5m2RUzwNhXFW2fCJ+rD+b7dxubtpdymKWnkhuCVJwp
QejGQWe2U7iyhQt5d+1f3kEnhdnBJXL035uYHpSM03+LmliyROwGq0U+Tms9f0ce
Doq+FgrzB5OfuxxQ5O1vTo4BhP77v+hmpQlX52Jc2QAz0Mj1ZafHKerdPJVDpUjR
ZMpsRBXxcOvNTw7YjpgOokz3rU/lfuUDy4BaiONIeiysk2YP4a/H2kVuYAtQX//I
3C/BohuR1o6NkoIEKKjNW1j6nPgRD7NizHkDFIRhNJ1tHhdCQVwD7DClLVe4rIES
CCMEOEe4ViJTZ6b3u8bzPFHU8Vl0dGczZZlnQygN84Db4U4=
=fZqG
-----END PGP SIGNATURE-----

--m7A4WK9JcQLwsVy7--