diff options
author | frits <none@none> | 2006-01-11 17:58:29 -0800 |
---|---|---|
committer | frits <none@none> | 2006-01-11 17:58:29 -0800 |
commit | c4ca7dc0818cca322cfe0ed29355568d6deff0b0 (patch) | |
tree | 220aef194701ecdb87c2d14577275273566d298e /usr/src/lib/libdevinfo/devinfo_devperm.c | |
parent | 8a552b2db9c23aa11e42a38ff4a3a9558e186b8d (diff) | |
download | illumos-joyent-c4ca7dc0818cca322cfe0ed29355568d6deff0b0.tar.gz |
Contributed by Juergen Keil jk@tools.de
6350389 /etc/logindevperm processing is incomplete when there are stale /dev links
6350499 stale usb device link confuses login's /etc/logindevperm code
6350501 libdevinfo/setdevaccess() prints error message from uninitialized errno variable
Diffstat (limited to 'usr/src/lib/libdevinfo/devinfo_devperm.c')
-rw-r--r-- | usr/src/lib/libdevinfo/devinfo_devperm.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/usr/src/lib/libdevinfo/devinfo_devperm.c b/usr/src/lib/libdevinfo/devinfo_devperm.c index b89544510a..b4fb3fb217 100644 --- a/usr/src/lib/libdevinfo/devinfo_devperm.c +++ b/usr/src/lib/libdevinfo/devinfo_devperm.c @@ -20,7 +20,7 @@ * CDDL HEADER END */ /* - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -89,6 +89,7 @@ setdevaccess(char *dev, uid_t uid, gid_t gid, mode_t mode, if (errno == ENOENT) /* no such file */ return (0); err = -1; + local_errno = errno; } while (fdetach(dev) == 0) { @@ -375,9 +376,23 @@ dir_dev_acc(char *path, char *left_to_do, uid_t uid, gid_t gid, mode_t mode, int err = 0; DIR *dirp; struct dirent *direntp; + char errstring[MAX_LINELEN]; /* path must be a valid name */ if (stat(path, &stat_buf) == -1) { + /* + * ENOENT errors are expected errors when there are + * dangling /dev device links. Ignore them silently + */ + if (errno == ENOENT) { + return (0); + } + if (errmsg) { + (void) snprintf(errstring, MAX_LINELEN, + "failed to stat %s: %s\n", path, + strerror(errno)); + (*errmsg)(errstring); + } return (-1); } else { if (!S_ISDIR(stat_buf.st_mode)) { @@ -457,7 +472,6 @@ dir_dev_acc(char *path, char *left_to_do, uid_t uid, gid_t gid, mode_t mode, if (dir_dev_acc(newpath, remainder_path, uid, gid, mode, line, errmsg)) { err = -1; - break; } } } |