* Introduced change which adds error checking in bootlogd when performing

chdir(). - Provided by Alexander Vickberg

* Add check for console using TIOCGDEV on Linux systems in bootlogd to
  make finding console more robust. - Provided by Alexander Vickberg
This commit is contained in:
Jesse 2022-03-10 13:51:02 -04:00
parent 644ee05aab
commit 124f3c2054
2 changed files with 57 additions and 18 deletions

View File

@ -10,6 +10,10 @@ sysvinit (3.02) unreleased; urgency=low
treats commands as literal and does not launch a shell to interpret them.
* Updated inittab manual page to include overview of symbols which trigger
a shell interpretor and how to disable them using the @ symbol.
* Introduced change which adds error checking in bootlogd when performing
chdir(). - Provided by Alexander Vickberg
* Add check for console using TIOCGDEV on Linux systems in bootlogd to
make finding console more robust. - Provided by Alexander Vickberg
sysvinit (3.01) released; urgency=low

View File

@ -43,6 +43,7 @@
#include <fcntl.h>
#ifdef __linux__
#include <pty.h>
#include <sys/sysmacros.h>
#endif
#ifdef __FreeBSD__
@ -106,13 +107,27 @@ void handler(int sig)
}
/*
* chdir with error message on fail.
*/
static int chdir_int(const char *path)
{
int ret;
if ((ret = chdir(path)) != 0) {
const char *msgprefix = "bootlogd: %s";
char msg[PATH_MAX + sizeof(msgprefix)];
snprintf(msg, sizeof(msg), msgprefix, path);
perror(msg);
}
return ret;
}
/*
* Scan /dev and find the device name.
*/
/*
This function does not appear to be called anymore. Commenting it
out for now, can probably be removed entirely in the future.
static int findtty(char *res, const char *startdir, int rlen, dev_t dev)
{
DIR *dir;
@ -121,13 +136,8 @@ static int findtty(char *res, const char *startdir, int rlen, dev_t dev)
int r = -1;
char *olddir = getcwd(NULL, 0);
if (chdir(startdir) < 0 || (dir = opendir(".")) == NULL) {
int msglen = strlen(startdir) + 11;
char *msg = malloc(msglen);
snprintf(msg, msglen, "bootlogd: %s", startdir);
perror(msg);
free(msg);
chdir(olddir);
if (chdir_int(startdir) < 0 || (dir = opendir(".")) == NULL) {
chdir_int(olddir);
return -1;
}
while ((ent = readdir(dir)) != NULL) {
@ -142,7 +152,7 @@ static int findtty(char *res, const char *startdir, int rlen, dev_t dev)
free(path);
if (0 == r) {
closedir(dir);
chdir(olddir);
chdir_int(olddir);
return 0;
}
continue;
@ -153,22 +163,21 @@ static int findtty(char *res, const char *startdir, int rlen, dev_t dev)
if ( (int) (strlen(ent->d_name) + strlen(startdir) + 1) >= rlen) {
fprintf(stderr, "bootlogd: console device name too long\n");
closedir(dir);
chdir(olddir);
chdir_int(olddir);
return -1;
} else {
snprintf(res, rlen, "%s/%s", startdir, ent->d_name);
closedir(dir);
chdir(olddir);
chdir_int(olddir);
return 0;
}
}
}
closedir(dir);
chdir(olddir);
chdir_int(olddir);
return r;
}
*/
@ -272,7 +281,7 @@ int isconsole(char *s, char *res, int rlen)
int consolenames(struct real_cons *cons, int max_consoles)
{
#ifdef TIOCGDEV
/* This appears to be unused. unsigned int kdev; */
unsigned int kdev;
#endif
struct stat st, st2;
char buf[KERNEL_COMMAND_LENGTH];
@ -343,6 +352,32 @@ dontuse:
p--;
}
if (num_consoles > 0) return num_consoles;
#endif
fstat(0, &st);
if (major(st.st_rdev) != 5 || minor(st.st_rdev) != 1) {
/*
* Old kernel, can find real device easily.
*/
int r = findtty(cons[num_consoles].name, "/dev",
sizeof(cons[num_consoles].name), st.st_rdev);
if (!r)
num_consoles++;
}
if (num_consoles > 0) return num_consoles;
#ifdef TIOCGDEV
# ifndef ENOIOCTLCMD
# define ENOIOCTLCMD 515
# endif
if (ioctl(0, TIOCGDEV, &kdev) == 0) {
int r = findtty(cons[num_consoles].name, "/dev",
sizeof(cons[num_consoles].name), (dev_t)kdev);
if (!r)
num_consoles++;
}
if (num_consoles > 0) return num_consoles;
#endif