> | > People did not like that. > | > | Didn't like what "if 1" or "return EBUSY"? > > The return EBUSY... >
Ok, but bug will stay in the system, temporarily. fs/ptyfs/ptyfs_vfsops.c | 16 +++++++++++----- kern/tty_ptm.c | 9 ++++++++- 2 files changed, 19 insertions(+), 6 deletions(-) Ilya.
Index: fs/ptyfs/ptyfs_vfsops.c =================================================================== RCS file: /cvsil/nbcur/src/sys/fs/ptyfs/ptyfs_vfsops.c,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 ptyfs_vfsops.c --- fs/ptyfs/ptyfs_vfsops.c 4 Mar 2014 18:16:03 -0000 1.1.1.1 +++ fs/ptyfs/ptyfs_vfsops.c 19 Mar 2014 17:36:48 -0000 @@ -109,14 +109,16 @@ ptyfs__getpath(struct lwp *l, const stru buf = malloc(MAXBUF, M_TEMP, M_WAITOK); bp = buf + MAXBUF; *--bp = '\0'; - error = getcwd_common(cwdi->cwdi_rdir, rootvnode, &bp, + error = getcwd_common(mp->mnt_vnodecovered, cwdi->cwdi_rdir, &bp, buf, MAXBUF / 2, 0, l); - if (error) /* XXX */ + if (error) { /* Mount point is out of rdir */ + rv = NULL; goto out; + } len = strlen(bp); if (len < sizeof(mp->mnt_stat.f_mntonname)) /* XXX */ - rv += len; + rv += strlen(rv) - len; out: free(buf, M_TEMP); return rv; @@ -128,6 +130,7 @@ ptyfs__makename(struct ptm_pty *pt, stru { struct mount *mp = pt->arg; size_t len; + const char *np; switch (ms) { case 'p': @@ -135,8 +138,11 @@ ptyfs__makename(struct ptm_pty *pt, stru len = snprintf(tbuf, bufsiz, "/dev/null"); break; case 't': - len = snprintf(tbuf, bufsiz, "%s/%llu", ptyfs__getpath(l, mp), - (unsigned long long)minor(dev)); + np = ptyfs__getpath(l, mp); + if (np == NULL) + return EOPNOTSUPP; + len = snprintf(tbuf, bufsiz, "%s/%llu", np, + (unsigned long long)minor(dev)); break; default: return EINVAL; Index: kern/tty_ptm.c =================================================================== RCS file: /cvsil/nbcur/src/sys/kern/tty_ptm.c,v retrieving revision 1.1.1.2 diff -u -p -r1.1.1.2 tty_ptm.c --- kern/tty_ptm.c 17 Mar 2014 11:46:10 -0000 1.1.1.2 +++ kern/tty_ptm.c 19 Mar 2014 17:36:48 -0000 @@ -381,7 +381,9 @@ ptmioctl(dev_t dev, u_long cmd, void *da goto bad; /* now, put the indices and names into struct ptmget */ - return pty_fill_ptmget(l, newdev, cfd, sfd, data); + if ((error = pty_fill_ptmget(l, newdev, cfd, sfd, data)) != 0) + break; /* goto bad2 */ + return 0; default: #ifdef COMPAT_60 error = compat_60_ptmioctl(dev, cmd, data, flag, l); @@ -391,6 +393,11 @@ ptmioctl(dev_t dev, u_long cmd, void *da DPRINTF(("ptmioctl EINVAL\n")); return EINVAL; } +/* bad2: close sfd too */ + fp = fd_getfile(sfd); + if (fp != NULL) { + fd_close(sfd); + } bad: fp = fd_getfile(cfd); if (fp != NULL) {