mirror of
https://github.com/opnsense/src.git
synced 2026-06-11 09:41:03 -04:00
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 commit8ad7a14ab4) getty: code cleanup, part 2 * Clean up whitespace * Reindent Sponsored by: Klara, Inc. (cherry picked from commitf285f41498) 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 commiteb4d86d529)
This commit is contained in:
parent
312fa66091
commit
d488e8d037
5 changed files with 112 additions and 107 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
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);
|
||||
/*
|
||||
* 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 (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);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue