tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: add a "notty" flag to ttys(5) for init(8)



At Sat, 17 May 2025 08:41:32 +0000 (UTC), RVP <rvp%SDF.ORG@localhost> wrote:
Subject: Re: add a "notty" flag to ttys(5) for init(8)
>
> On Fri, 18 Apr 2025, Greg A. Woods wrote:
>
> > I figured the best way would be to run it from init(8) so that it would
> > be running at all times while logins are allowed, and so that init(8)
> > could restart it should it ever die.
> >
> > The problem was that monit, like most programs, doesn't want arbitrary
> > arguments on its command line, and the normal way init(8) starts a
> > "getty" is to explicitly pass the terminal name as an additional
> > argument.  I could have named the session "-I", but that's UGLY.
> >
>
> You can already do this with an empty `tty' field:

That arguably exposes a bug in getttyent()!

So, yes, you could do that, though perhaps only for one entry, but I
think it would be very wrong.  It effectively "breaks" getttynam() for
one.  It may make the [wu]tmpx files a bit messy too.

I propose the following fix, though note it could expose further bugs in
callers of getttyent() and/or getttynam():

Index: lib/libc/gen/getttyent.c
===================================================================
RCS file: /cvs/master/m-NetBSD/main/src/lib/libc/gen/getttyent.c,v
retrieving revision 1.26
diff -u -r1.26 getttyent.c
--- lib/libc/gen/getttyent.c	30 Jun 2013 10:07:43 -0000	1.26
+++ lib/libc/gen/getttyent.c	19 May 2025 19:13:32 -0000
@@ -100,8 +100,10 @@
 		errno = 0;
 		line = fparseln(tf, &len, &lineno, NULL, FPARSELN_UNESCALL);
 		if (line == NULL) {
-			if (errno != 0)
-				warn(__func__);
+			if (errno != 0) {
+				warn("%s: %s, %lu",
+				     __func__, _PATH_TTYS, (unsigned long)lineno);
+			}
 			return NULL;
 		}
 		for (p = line; *p && isspace((unsigned char)*p); p++)
@@ -111,7 +113,22 @@
 		free(line);
 	}

-	tty.ty_name = p;
+	if (*p == '\0') {
+		warnx("%s: %s, %lu: no tty name!",
+		      __func__, _PATH_TTYS, (unsigned long)lineno);
+#if 0
+		/*
+		 * XXX arguably this is an error in the entry, but the manual says:
+		 *
+		 *     "If any of the fields pointing to character strings are
+		 *     unspecified, they are returned as null pointers."
+		 */
+		return NULL;
+#else
+		tty.ty_name = NULL;
+#endif
+	} else
+		tty.ty_name = p;
 	p = skip(p, &zapchar);
 	if (*(tty.ty_getty = p) == '\0')
 		tty.ty_getty = tty.ty_type = NULL;

--
					Greg A. Woods <gwoods%acm.org@localhost>

Kelowna, BC     +1 250 762-7675           RoboHack <woods%robohack.ca@localhost>
Planix, Inc. <woods%planix.com@localhost>     Avoncote Farms <woods%avoncote.ca@localhost>

Attachment: pgpM2UxSSTByg.pgp
Description: OpenPGP Digital Signature



Home | Main Index | Thread Index | Old Index