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--