diff options
author | kib <kib@FreeBSD.org> | 2016-01-13 12:01:28 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2016-01-13 12:01:28 +0000 |
commit | 0f1ad490766ad165a63459482430d90902e54839 (patch) | |
tree | bfda7f7f852050034599110e8956c91843a0340f | |
parent | 68e22a452aec426140d0683d3512db10fb3037c6 (diff) | |
download | FreeBSD-src-0f1ad490766ad165a63459482430d90902e54839.zip FreeBSD-src-0f1ad490766ad165a63459482430d90902e54839.tar.gz |
Switch legacy pty clone handler to use make_dev_s(9). Add
MAKEDEV_CHECKNAME flag to the call, this is required to not panic on
race between the clone and destructing the closed master.
Reported by and discussed with: bde
Tested by: pho (as part of the larger patch)
Sponsored by: The FreeBSD Foundation
MFC after: 3 weeks
-rw-r--r-- | sys/dev/pty/pty.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/sys/dev/pty/pty.c b/sys/dev/pty/pty.c index 5e2d822..666ee87 100644 --- a/sys/dev/pty/pty.c +++ b/sys/dev/pty/pty.c @@ -97,6 +97,8 @@ static void pty_clone(void *arg, struct ucred *cr, char *name, int namelen, struct cdev **dev) { + struct make_dev_args mda; + int error; /* Cloning is already satisfied. */ if (*dev != NULL) @@ -117,8 +119,17 @@ pty_clone(void *arg, struct ucred *cr, char *name, int namelen, return; /* Create the controller device node. */ - *dev = make_dev_credf(MAKEDEV_REF, &ptydev_cdevsw, 0, - NULL, UID_ROOT, GID_WHEEL, 0666, "%s", name); + make_dev_args_init(&mda); + mda.mda_flags = MAKEDEV_CHECKNAME | MAKEDEV_REF; + mda.mda_devsw = &ptydev_cdevsw; + mda.mda_uid = UID_ROOT; + mda.mda_gid = GID_WHEEL; + mda.mda_mode = 0666; + error = make_dev_s(&mda, dev, "%s", name); + if (error != 0) { + printf("pty_clone: failed to create %s: %d\n", name, error); + *dev = NULL; + } } static int |