aboutsummaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2022-11-04 13:23:33 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2022-11-14 11:22:42 +0000
commitd488e8d0372d5c79fb2cb1aa6c41a59fbfb62479 (patch)
tree98452943cc8b6bd421cff23ca34886d4474029b3 /libexec
parent312fa66091f9989e64370291e2482eab8d8ab013 (diff)
downloadsrc-d488e8d0372d5c79fb2cb1aa6c41a59fbfb62479.tar.gz
src-d488e8d0372d5c79fb2cb1aa6c41a59fbfb62479.zip
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)
Diffstat (limited to 'libexec')
-rw-r--r--libexec/getty/chat.c32
-rw-r--r--libexec/getty/extern.h2
-rw-r--r--libexec/getty/init.c6
-rw-r--r--libexec/getty/main.c149
-rw-r--r--libexec/getty/subr.c24
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));
}