At Sat, 17 May 2025 08:41:32 +0000 (UTC), RVP <r...@sdf.org> 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 <gwo...@acm.org>

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

Attachment: pgpuzAJ13O2RP.pgp
Description: OpenPGP Digital Signature

Reply via email to