summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/libutil/login_fbtab.317
-rw-r--r--lib/libutil/login_fbtab.c110
-rw-r--r--lib/libutil/util.h7
3 files changed, 71 insertions, 63 deletions
diff --git a/lib/libutil/login_fbtab.3 b/lib/libutil/login_fbtab.3
index dfb3344cbf2..ed10ba988af 100644
--- a/lib/libutil/login_fbtab.3
+++ b/lib/libutil/login_fbtab.3
@@ -1,4 +1,4 @@
-.\" $OpenBSD: login_fbtab.3,v 1.7 2001/08/06 10:42:26 mpech Exp $
+.\" $OpenBSD: login_fbtab.3,v 1.8 2002/06/21 16:37:11 millert Exp $
.\"
.\" Copyright 1995 by Wietse Venema. All rights reserved. Some individual
.\" files may be covered by other copyrights.
@@ -15,7 +15,7 @@
.\" warranties, including, without limitation, the implied warranties of
.\" merchantibility and fitness for any particular purpose.
.\"
-.Dd November 8, 1999
+.Dd June 14, 2002
.Dt LOGIN_FBTAB 3
.Os
.Sh NAME
@@ -26,7 +26,7 @@
.Fd #include <sys/types.h>
.Fd #include <util.h>
.Ft void
-.Fn login_fbtab "char *tty" "uid_t uid" "gid_t gid"
+.Fn login_fbtab "const char *tty" "uid_t uid" "gid_t gid"
.Sh DESCRIPTION
The
.Fn login_fbtab
@@ -35,8 +35,6 @@ function reads the
file and implements device security as described in the
.Xr fbtab 5
manual page.
-.Pp
-If errors occur a null string is returned.
.Sh DIAGNOSTICS
Problems are reported via the
.Xr syslogd 8
@@ -54,7 +52,10 @@ Wietse Venema (wietse@wzv.win.tue.nl)
Eindhoven University of Technology
The Netherlands
.Ed
-.Sh BUGS
-This module uses
+.Sh CAVEATS
+Previous versions of this routine used
.Xr strtok 3 ,
-which may cause conflicts with other uses of that same routine.
+which can cause conflicts with other uses of that routine.
+This may be an issue when porting programs to
+.Ox 3.1
+and below.
diff --git a/lib/libutil/login_fbtab.c b/lib/libutil/login_fbtab.c
index d32cc0d9c4d..341228ec0c1 100644
--- a/lib/libutil/login_fbtab.c
+++ b/lib/libutil/login_fbtab.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: login_fbtab.c,v 1.8 2002/02/16 21:27:29 millert Exp $ */
+/* $OpenBSD: login_fbtab.c,v 1.9 2002/06/21 16:37:11 millert Exp $ */
/************************************************************************
* Copyright 1995 by Wietse Venema. All rights reserved. Some individual
@@ -51,10 +51,6 @@
Problems are reported via the syslog daemon with severity
LOG_ERR.
- BUGS
- This module uses strtok(3), which may cause conflicts with other
- uses of that same routine.
-
AUTHOR
Wietse Venema (wietse@wzv.win.tue.nl)
Eindhoven University of Technology
@@ -63,19 +59,20 @@
#include <sys/types.h>
#include <sys/stat.h>
-#include <stdio.h>
-#include <syslog.h>
-#include <string.h>
+
#include <errno.h>
#include <dirent.h>
-#include <unistd.h>
+#include <limits.h>
#include <paths.h>
-
-#include "util.h"
+#include <stdio.h>
+#include <string.h>
+#include <syslog.h>
+#include <unistd.h>
+#include <util.h>
#define _PATH_FBTAB "/etc/fbtab"
-static void login_protect(char *, char *, int, uid_t, gid_t);
+static void login_protect(const char *, int, uid_t, gid_t);
#define WSPACE " \t\n"
@@ -83,37 +80,36 @@ static void login_protect(char *, char *, int, uid_t, gid_t);
* login_fbtab - apply protections specified in /etc/fbtab or logindevperm
*/
void
-login_fbtab(tty, uid, gid)
- char *tty;
- uid_t uid;
- gid_t gid;
+login_fbtab(const char *tty, uid_t uid, gid_t gid)
{
FILE *fp;
- char buf[BUFSIZ], *devname, *cp, *table;
+ char buf[BUFSIZ], *bufp, *devname, *cp;
int prot;
- if ((fp = fopen(table = _PATH_FBTAB, "r")) == NULL)
+ if ((fp = fopen(_PATH_FBTAB, "r")) == NULL)
return;
- while (fgets(buf, sizeof(buf), fp)) {
+ while ((bufp = fgets(buf, sizeof(buf), fp)) != NULL) {
if ((cp = strchr(buf, '#')))
*cp = 0; /* strip comment */
- if ((cp = devname = strtok(buf, WSPACE)) == 0)
+ if ((devname = strsep(&bufp, WSPACE)) == NULL)
continue; /* empty or comment */
if (strncmp(devname, _PATH_DEV, sizeof(_PATH_DEV) - 1) != 0 ||
- (cp = strtok((char *) 0, WSPACE)) == 0 ||
+ (cp = strsep(&bufp, WSPACE)) == NULL ||
*cp != '0' ||
sscanf(cp, "%o", &prot) == 0 ||
prot == 0 ||
(prot & 0777) != prot ||
- (cp = strtok((char *) 0, WSPACE)) == 0) {
- syslog(LOG_ERR, "%s: bad entry: %s", table,
+ (cp = strsep(&bufp, WSPACE)) == NULL) {
+ syslog(LOG_ERR, "%s: bad entry: %s", _PATH_FBTAB,
cp ? cp : "(null)");
continue;
}
- if (strcmp(devname + sizeof(_PATH_DEV) - 1, tty) == 0)
- for (cp = strtok(cp, ":"); cp; cp = strtok(NULL, ":"))
- login_protect(table, cp, prot, uid, gid);
+ if (strcmp(devname + sizeof(_PATH_DEV) - 1, tty) == 0) {
+ bufp = cp;
+ while ((cp = strsep(&bufp, ":")) != NULL)
+ login_protect(cp, prot, uid, gid);
+ }
}
fclose(fp);
}
@@ -122,39 +118,51 @@ login_fbtab(tty, uid, gid)
* login_protect - protect one device entry
*/
static void
-login_protect(table, path, mask, uid, gid)
- char *table;
- char *path;
- int mask;
- uid_t uid;
- gid_t gid;
+login_protect(const char *path, int mask, uid_t uid, gid_t gid)
{
- char buf[BUFSIZ];
- int pathlen = strlen(path);
- struct dirent *ent;
+ char buf[PATH_MAX];
+ size_t pathlen = strlen(path);
DIR *dir;
+ struct dirent *ent;
+
+ if (pathlen >= sizeof(buf)) {
+ errno = ENAMETOOLONG;
+ syslog(LOG_ERR, "%s: %s: %m", _PATH_FBTAB, path);
+ return;
+ }
if (strcmp("/*", path + pathlen - 2) != 0) {
if (chmod(path, mask) && errno != ENOENT)
- syslog(LOG_ERR, "%s: chmod(%s): %m", table, path);
+ syslog(LOG_ERR, "%s: chmod(%s): %m", _PATH_FBTAB, path);
if (chown(path, uid, gid) && errno != ENOENT)
- syslog(LOG_ERR, "%s: chown(%s): %m", table, path);
+ syslog(LOG_ERR, "%s: chown(%s): %m", _PATH_FBTAB, path);
} else {
- strncpy(buf, path, sizeof buf);
- buf[pathlen - 1] = 0;
- if ((dir = opendir(buf)) == 0) {
- syslog(LOG_ERR, "%s: opendir(%s): %m", table, path);
- } else {
- while ((ent = readdir(dir))) {
- if (strcmp(ent->d_name, ".") &&
- strcmp(ent->d_name, "..")) {
- strncpy(buf + pathlen - 1, ent->d_name,
- sizeof(buf) - pathlen - 1);
- login_protect(table, buf, mask,
- uid, gid);
- }
+ /*
+ * This is a wildcard directory (/path/to/whatever/*).
+ * Make a copy of path without the trailing '*' (but leave
+ * the trailing '/' so we can append directory entries.)
+ */
+ memcpy(buf, path, pathlen - 1);
+ buf[pathlen - 1] = '\0';
+ if ((dir = opendir(buf)) == NULL) {
+ syslog(LOG_ERR, "%s: opendir(%s): %m", _PATH_FBTAB,
+ path);
+ return;
+ }
+
+ while ((ent = readdir(dir)) != NULL) {
+ if (strcmp(ent->d_name, ".") != 0 &&
+ strcmp(ent->d_name, "..") != 0) {
+ buf[pathlen - 1] = '\0';
+ if (strlcat(buf, ent->d_name, sizeof(buf))
+ >= sizeof(buf)) {
+ errno = ENAMETOOLONG;
+ syslog(LOG_ERR, "%s: %s: %m",
+ _PATH_FBTAB, path);
+ } else
+ login_protect(buf, mask, uid, gid);
}
- closedir(dir);
}
+ closedir(dir);
}
}
diff --git a/lib/libutil/util.h b/lib/libutil/util.h
index 7245ed03125..ff388e5aa46 100644
--- a/lib/libutil/util.h
+++ b/lib/libutil/util.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: util.h,v 1.21 2002/06/09 22:18:43 fgsch Exp $ */
+/* $OpenBSD: util.h,v 1.22 2002/06/21 16:37:11 millert Exp $ */
/* $NetBSD: util.h,v 1.2 1996/05/16 07:00:22 thorpej Exp $ */
/*-
@@ -100,14 +100,13 @@ void pw_copy(int, int, struct passwd *);
void pw_getconf(char *, size_t, const char *, const char *);
int pw_scan(char *, struct passwd *, int *);
void pw_error(const char *, int, int);
-int openpty(int *, int *, char *, struct termios *,
- struct winsize *);
+int openpty(int *, int *, char *, struct termios *, struct winsize *);
int opendisk(const char *path, int flags, char *buf, size_t buflen,
int iscooked);
pid_t forkpty(int *, char *, struct termios *, struct winsize *);
int getmaxpartitions(void);
int getrawpartition(void);
-void login_fbtab(char *, uid_t, gid_t);
+void login_fbtab(const char *, uid_t, gid_t);
int login_check_expire(struct __sFILE *, struct passwd *, char *, int);
char *readlabelfs(char *, int);
const char *uu_lockerr(int _uu_lockresult);