git: d488e8d0372d - stable/13 - getty: code cleanup, part 1

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Mon, 14 Nov 2022 11:23:06 UTC
The branch stable/13 has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=d488e8d0372d5c79fb2cb1aa6c41a59fbfb62479

commit d488e8d0372d5c79fb2cb1aa6c41a59fbfb62479
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2022-11-04 13:23:33 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2022-11-14 11:22:42 +0000

    getty: code cleanup, part 1
    
    * Avoid unnecessary use of `unsigned char *`
    * Use explicit casts when assigning `unsigned char *` to `char *` or vice versa
    * Drop unused global variables (and fix memory leak in `gettable()`)
    * Use `snprintf()` instead of `strcpy()` + `strcat()`
    * Drop spurious braces in switch
    
    Sponsored by:   Klara, Inc.
    Obtained from:  Apple OSS Distributions (in part)
    Differential Revision: https://reviews.freebsd.org/D37263
    
    (cherry picked from commit 8ad7a14ab49b93240676e15f404354775be931f4)
    
    getty: code cleanup, part 2
    
    * Clean up whitespace
    * Reindent
    
    Sponsored by:   Klara, Inc.
    
    (cherry picked from commit f285f41498ebe0bfc1dbe47d67af12ec2d131521)
    
    getty: Avoid NULL deref if stdin is not a tty.
    
    Sponsored by:   Klara, Inc.
    Obtained from:  Apple OSS Distributions
    Differential Revision: https://reviews.freebsd.org/D37265
    
    (cherry picked from commit eb4d86d529e2523a19fd7454976923319954a49d)
---
 libexec/getty/chat.c   |  32 +++++------
 libexec/getty/extern.h |   2 +-
 libexec/getty/init.c   |   6 +-
 libexec/getty/main.c   | 149 +++++++++++++++++++++++++------------------------
 libexec/getty/subr.c   |  24 ++++----
 5 files changed, 109 insertions(+), 104 deletions(-)

diff --git a/libexec/getty/chat.c b/libexec/getty/chat.c
index 0f2def37b028..0a348d6b2ebb 100644
--- a/libexec/getty/chat.c
+++ b/libexec/getty/chat.c
@@ -59,10 +59,10 @@ static volatile int alarmed = 0;
 
 static void   chat_alrm(int);
 static int    chat_unalarm(void);
-static int    getdigit(unsigned char **, int, int);
+static int    getdigit(char **, int, int);
 static char   **read_chat(char **);
 static char   *cleanchr(char **, unsigned char);
-static const char *cleanstr(const unsigned char *, int);
+static const char *cleanstr(const char *, int);
 static const char *result(int);
 static int    chat_expect(const char *);
 static int    chat_send(char const *);
@@ -104,7 +104,7 @@ chat_unalarm(void)
  */
 
 static int
-getdigit(unsigned char **ptr, int base, int max)
+getdigit(char **ptr, int base, int max)
 {
 	int i, val = 0;
 	char * q;
@@ -149,10 +149,10 @@ read_chat(char **chatstr)
 			     p != NULL;
 			     p = strtok(NULL, ws))
 			{
-				unsigned char *q, *r;
+				char *q, *r;
 
 				/* Read escapes */
-				for (q = r = (unsigned char *)p; *r; ++q)
+				for (q = r = p; *r; ++q)
 				{
 					if (*q == '\\')
 					{
@@ -248,7 +248,7 @@ cleanchr(char **buf, unsigned char ch)
 		l = 2;
 		ch &= 0x7f;
 	} else
-	l = 0;
+		l = 0;
 
 	if (ch < 32) {
 		tmp[l++] = '^';
@@ -271,9 +271,9 @@ cleanchr(char **buf, unsigned char ch)
  */
 
 static const char *
-cleanstr(const unsigned char *s, int l)
+cleanstr(const char *s, int l)
 {
-	static unsigned char * tmp = NULL;
+	static char * tmp = NULL;
 	static int tmplen = 0;
 
 	if (tmplen < l * 4 + 1)
@@ -344,7 +344,7 @@ chat_expect(const char *str)
 
 						if (chat_debug & CHATDEBUG_RECEIVE)
 							syslog(LOG_DEBUG, "chat_recv '%s' m=%d",
-								cleanchr(NULL, ch), i);
+							    cleanchr(NULL, ch), i);
 
 						if (ch == str[i])
 							got[i++] = ch;
@@ -365,9 +365,9 @@ chat_expect(const char *str)
 				}
 			}
 			alarm(0);
-        		chat_unalarm();
-        		alarmed = 0;
-        		free(got);
+			chat_unalarm();
+			alarmed = 0;
+			free(got);
 		}
 	}
 
@@ -399,13 +399,13 @@ chat_send(char const *str)
                         unsigned char ch = (unsigned char)*str++;
 
                         if (alarmed)
-        			r = 3;
+				r = 3;
                         else if (ch == PAUSE_CH)
 				usleep(500000); /* 1/2 second */
 			else  {
 				usleep(10000);	/* be kind to modem */
                                 if (write(STDOUT_FILENO, &ch, 1) != 1)
-        		  		r = alarmed ? 3 : 2;
+					r = alarmed ? 3 : 2;
                         }
                 }
                 alarm(0);
@@ -414,7 +414,7 @@ chat_send(char const *str)
 	}
 
         if (chat_debug & CHATDEBUG_SEND)
-          syslog(LOG_DEBUG, "chat_send %s", result(r));
+		syslog(LOG_DEBUG, "chat_send %s", result(r));
 
         return r;
 }
@@ -481,7 +481,7 @@ getty_chat(char *scrstr, int timeout, int debug)
                 }
 
                 if (chat_debug & CHATDEBUG_MISC)
-                  syslog(LOG_DEBUG, "getty_chat %s", result(r));
+			syslog(LOG_DEBUG, "getty_chat %s", result(r));
 
         }
         return r;
diff --git a/libexec/getty/extern.h b/libexec/getty/extern.h
index fbee272d109c..6872acb4f6f7 100644
--- a/libexec/getty/extern.h
+++ b/libexec/getty/extern.h
@@ -48,7 +48,7 @@ const char *autobaud(void);
 int	 delaybits(void);
 void	 edithost(const char *);
 void	 gendefaults(void);
-void	 gettable(const char *, char *);
+void	 gettable(const char *);
 void	 makeenv(char *[]);
 const char *portselector(void);
 void	 set_ttydefaults(int);
diff --git a/libexec/getty/init.c b/libexec/getty/init.c
index ec911ca7223f..79b9601a2be1 100644
--- a/libexec/getty/init.c
+++ b/libexec/getty/init.c
@@ -34,7 +34,7 @@
 static char sccsid[] = "@(#)from: init.c	8.1 (Berkeley) 6/4/93";
 #endif
 static const char rcsid[] =
-  "$FreeBSD$";
+    "$FreeBSD$";
 #endif /* not lint */
 
 /*
@@ -53,7 +53,7 @@ static char nullstr[] = "";
 static char loginprg[] = _PATH_LOGIN;
 static char datefmt[] = "%+";
 
-#define M(a) (&omode.c_cc[a])
+#define M(a) (char *)(&omode.c_cc[a])
 
 struct	gettystrs gettystrs[] = {
 	{ "nx", NULL, NULL },		/* next table */
@@ -123,7 +123,7 @@ struct	gettynums gettynums[] = {
 	{ "dc", 0, 0, 0 },		/* debug chat script value */
 	{ NULL, 0, 0, 0 }
 };
-  
+
 
 struct	gettyflags gettyflags[] = {
 	{ "ht",	0, 0, 0, 0 },		/* has tabs */
diff --git a/libexec/getty/main.c b/libexec/getty/main.c
index 743a0508c561..fad3811adcf6 100644
--- a/libexec/getty/main.c
+++ b/libexec/getty/main.c
@@ -58,6 +58,7 @@ __FBSDID("$FreeBSD$");
 #include <libutil.h>
 #include <setjmp.h>
 #include <signal.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <syslog.h>
@@ -100,10 +101,7 @@ static char	name[MAXLOGNAME*3];
 static char	ttyn[32];
 
 #define	OBUFSIZ		128
-#define	TABBUFSIZ	512
 
-static char	defent[TABBUFSIZ];
-static char	tabent[TABBUFSIZ];
 static const char	*tname;
 
 static char	*env[128];
@@ -191,7 +189,7 @@ main(int argc, char *argv[])
 	gethostname(hostname, sizeof(hostname) - 1);
 	hostname[sizeof(hostname) - 1] = '\0';
 	if (hostname[0] == '\0')
-		strcpy(hostname, "Amnesiac");
+		snprintf(hostname, sizeof(hostname), "Amnesiac");
 
 	/*
 	 * Limit running time to deal with broken or dead lines.
@@ -201,7 +199,7 @@ main(int argc, char *argv[])
 	limit.rlim_cur = GETTY_TIMEOUT;
 	(void)setrlimit(RLIMIT_CPU, &limit);
 
-	gettable("default", defent);
+	gettable("default");
 	gendefaults();
 	tname = "default";
 	if (argc > 1)
@@ -214,83 +212,87 @@ main(int argc, char *argv[])
 	 * that the file descriptors are already set up for us.
 	 * J. Gettys - MIT Project Athena.
 	 */
-	if (argc <= 2 || strcmp(argv[2], "-") == 0)
-	    strcpy(ttyn, ttyname(STDIN_FILENO));
-	else {
-	    strcpy(ttyn, _PATH_DEV);
-	    strlcat(ttyn, argv[2], sizeof(ttyn));
-	    if (strcmp(argv[0], "+") != 0) {
-		chown(ttyn, 0, 0);
-		chmod(ttyn, 0600);
-		revoke(ttyn);
-
-		/*
-		 * Do the first scan through gettytab.
-		 * Terminal mode parameters will be wrong until
-		 * defttymode() called, but they're irrelevant for
-		 * the initial setup of the terminal device.
-		 */
-		dogettytab();
-
-		/*
-		 * Init or answer modem sequence has been specified.
-		 */
-		if (IC || AC) {
-			if (!opentty(ttyn, O_RDWR|O_NONBLOCK))
-				exit(1);
-			defttymode();
-			setttymode(1);
+	if (argc <= 2 || strcmp(argv[2], "-") == 0) {
+		char *n = ttyname(STDIN_FILENO);
+		if (n == NULL) {
+			syslog(LOG_ERR, "ttyname: %m");
+			exit(1);
 		}
+		snprintf(ttyn, sizeof(ttyn), "%s", n);
+	} else {
+		snprintf(ttyn, sizeof(ttyn), "%s%s", _PATH_DEV, argv[2]);
+		if (strcmp(argv[0], "+") != 0) {
+			chown(ttyn, 0, 0);
+			chmod(ttyn, 0600);
+			revoke(ttyn);
+
+			/*
+			 * Do the first scan through gettytab.
+			 * Terminal mode parameters will be wrong until
+			 * defttymode() called, but they're irrelevant for
+			 * the initial setup of the terminal device.
+			 */
+			dogettytab();
 
-		if (IC) {
-			if (getty_chat(IC, CT, DC) > 0) {
-				syslog(LOG_ERR, "modem init problem on %s", ttyn);
-				(void)tcsetattr(STDIN_FILENO, TCSANOW, &tmode);
-				exit(1);
+			/*
+			 * Init or answer modem sequence has been specified.
+			 */
+			if (IC || AC) {
+				if (!opentty(ttyn, O_RDWR|O_NONBLOCK))
+					exit(1);
+				defttymode();
+				setttymode(1);
 			}
-		}
-
-		if (AC) {
-			fd_set rfds;
-			struct timeval to;
-			int i;
 
-			FD_ZERO(&rfds);
-			FD_SET(0, &rfds);
-        		to.tv_sec = RT;
-        		to.tv_usec = 0;
-			i = select(32, &rfds, NULL, NULL, RT ? &to : NULL);
-        		if (i < 0) {
-				syslog(LOG_ERR, "select %s: %m", ttyn);
-			} else if (i == 0) {
-				syslog(LOG_NOTICE, "recycle tty %s", ttyn);
-				(void)tcsetattr(STDIN_FILENO, TCSANOW, &tmode);
-				exit(0);  /* recycle for init */
+			if (IC) {
+				if (getty_chat(IC, CT, DC) > 0) {
+					syslog(LOG_ERR, "modem init problem on %s", ttyn);
+					(void)tcsetattr(STDIN_FILENO, TCSANOW, &tmode);
+					exit(1);
+				}
 			}
-			i = getty_chat(AC, CT, DC);
-			if (i > 0) {
-				syslog(LOG_ERR, "modem answer problem on %s", ttyn);
-				(void)tcsetattr(STDIN_FILENO, TCSANOW, &tmode);
-				exit(1);
+
+			if (AC) {
+				fd_set rfds;
+				struct timeval to;
+				int i;
+
+				FD_ZERO(&rfds);
+				FD_SET(0, &rfds);
+				to.tv_sec = RT;
+				to.tv_usec = 0;
+				i = select(32, &rfds, NULL, NULL, RT ? &to : NULL);
+				if (i < 0) {
+					syslog(LOG_ERR, "select %s: %m", ttyn);
+				} else if (i == 0) {
+					syslog(LOG_NOTICE, "recycle tty %s", ttyn);
+					(void)tcsetattr(STDIN_FILENO, TCSANOW, &tmode);
+					exit(0);  /* recycle for init */
+				}
+				i = getty_chat(AC, CT, DC);
+				if (i > 0) {
+					syslog(LOG_ERR, "modem answer problem on %s", ttyn);
+					(void)tcsetattr(STDIN_FILENO, TCSANOW, &tmode);
+					exit(1);
+				}
+			} else { /* maybe blocking open */
+				if (!opentty(ttyn, O_RDWR | (NC ? O_NONBLOCK : 0 )))
+					exit(1);
 			}
-		} else { /* maybe blocking open */
-			if (!opentty(ttyn, O_RDWR | (NC ? O_NONBLOCK : 0 )))
-				exit(1);
 		}
-	    }
 	}
 
 	defttymode();
 	for (;;) {
 
 		/*
-		 * if a delay was specified then sleep for that 
+		 * if a delay was specified then sleep for that
 		 * number of seconds before writing the initial prompt
 		 */
 		if (first_sleep && DE) {
-		    sleep(DE);
-		    /* remove any noise */
-		    (void)tcflush(STDIN_FILENO, TCIOFLUSH);
+			sleep(DE);
+			/* remove any noise */
+			(void)tcflush(STDIN_FILENO, TCIOFLUSH);
 		}
 		first_sleep = 0;
 
@@ -318,7 +320,7 @@ main(int argc, char *argv[])
 				char * cp;
 
 				while ((cp = get_line(fd)) != NULL) {
-					  putf(cp);
+					putf(cp);
 				}
 				close(fd);
 			}
@@ -439,7 +441,7 @@ opentty(const char *tty, int flags)
 			return 0;
 		sleep(60);
 	}
-	if (login_tty(i) < 0) { 
+	if (login_tty(i) < 0) {
 		if (daemon(0,0) < 0) {
 			syslog(LOG_ERR,"daemon: %m");
 			close(i);
@@ -555,7 +557,7 @@ getname(void)
 		   See RFC1662.
 		   Derived from code from Michael Hancock, <michaelh@cet.co.jp>
 		   and Erik 'PPP' Olson, <eriko@wrq.com>
-		 */
+		*/
 
 		if (PP && (cs == PPP_FRAME)) {
 			ppp_state = 1;
@@ -564,7 +566,7 @@ getname(void)
 		} else if (ppp_state == 2 && cs == PPP_ESCAPE) {
 			ppp_state = 3;
 		} else if ((ppp_state == 2 && cs == PPP_CONTROL)
-			|| (ppp_state == 3 && cs == PPP_CONTROL_ESCAPED)) {
+		    || (ppp_state == 3 && cs == PPP_CONTROL_ESCAPED)) {
 			ppp_state = 4;
 		} else if (ppp_state == 4 && cs == PPP_LCP_HI) {
 			ppp_state = 5;
@@ -761,7 +763,7 @@ putf(const char *cp)
 			puts(editedhost);
 			break;
 
-		case 'd': {
+		case 'd':
 			t = (time_t)0;
 			(void)time(&t);
 			if (Lo)
@@ -785,7 +787,6 @@ putf(const char *cp)
 		case 'v':
 			puts(kerninfo.version);
 			break;
-		}
 
 		case '%':
 			putchr('%');
@@ -801,9 +802,9 @@ putf(const char *cp)
 static void
 dogettytab(void)
 {
-	
+
 	/* Read the database entry. */
-	gettable(tname, tabent);
+	gettable(tname);
 
 	/*
 	 * Avoid inheriting the parity values from the default entry
diff --git a/libexec/getty/subr.c b/libexec/getty/subr.c
index 9958d193aa60..68682df6d5bd 100644
--- a/libexec/getty/subr.c
+++ b/libexec/getty/subr.c
@@ -34,7 +34,7 @@
 static char sccsid[] = "@(#)from: subr.c	8.1 (Berkeley) 6/4/93";
 #endif
 static const char rcsid[] =
-  "$FreeBSD$";
+    "$FreeBSD$";
 #endif /* not lint */
 
 /*
@@ -60,8 +60,9 @@ static const char rcsid[] =
  * Get a table entry.
  */
 void
-gettable(const char *name, char *buf)
+gettable(const char *name)
 {
+	char *buf = NULL;
 	struct gettystrs *sp;
 	struct gettynums *np;
 	struct gettyflags *fp;
@@ -155,6 +156,7 @@ gettable(const char *name, char *buf)
 			fp->value = 1 ^ fp->invrt;
 		}
 	}
+	free(buf);
 }
 
 void
@@ -186,8 +188,8 @@ setdefaults(void)
 
 	for (sp = gettystrs; sp->field; sp++)
 		if (!sp->value)
-			sp->value = !sp->defalt ? sp->defalt
-						: strdup(sp->defalt);
+			sp->value = !sp->defalt ?
+			    sp->defalt : strdup(sp->defalt);
 	for (np = gettynums; np->field; np++)
 		if (!np->set)
 			np->value = np->defalt;
@@ -202,13 +204,15 @@ charnames[] = {
 	&SU, &DS, &RP, &FL, &WE, &LN, 0
 };
 
+#define CV(a) (char *)(&tmode.c_cc[a])
+
 static char *
 charvars[] = {
-	&tmode.c_cc[VERASE], &tmode.c_cc[VKILL], &tmode.c_cc[VINTR],
-	&tmode.c_cc[VQUIT], &tmode.c_cc[VSTART], &tmode.c_cc[VSTOP],
-	&tmode.c_cc[VEOF], &tmode.c_cc[VEOL], &tmode.c_cc[VSUSP],
-	&tmode.c_cc[VDSUSP], &tmode.c_cc[VREPRINT], &tmode.c_cc[VDISCARD],
-	&tmode.c_cc[VWERASE], &tmode.c_cc[VLNEXT], 0
+	CV(VERASE), CV(VKILL), CV(VINTR),
+	CV(VQUIT), CV(VSTART), CV(VSTOP),
+	CV(VEOF), CV(VEOL), CV(VSUSP),
+	CV(VDSUSP), CV(VREPRINT), CV(VDISCARD),
+	CV(VWERASE), CV(VLNEXT), 0
 };
 
 void
@@ -505,7 +509,7 @@ edithost(const char *pattern)
 	 * In case of any errors, or if the pattern did not match, pass
 	 * the original hostname as is.
 	 */
- copyasis:
+copyasis:
 	strlcpy(editedhost, HN, sizeof(editedhost));
 }