> | > 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) {

Reply via email to