svn commit: r190529 - head/sys/compat/freebsd32

Ed Schouten ed at FreeBSD.org
Sun Mar 29 13:09:52 PDT 2009


Author: ed
Date: Sun Mar 29 20:09:51 2009
New Revision: 190529
URL: http://svn.freebsd.org/changeset/base/190529

Log:
  Emulate the FIODGNAME ioctl in our 32-bit emulator.
  
  It's quite strange that nobody reported this issue before. It turns out
  functions like ttyname(), ptsname() and fdevname() don't work in
  compat32. This means it't not even possible to run applications like
  script(1) inside a 32-bit FreeBSD jail.
  
  Fix this by converting 32-bit fiodgname_arg structures to their 64-bit
  equivalent.
  
  Reported by:	kris
  Tested by:	kris

Modified:
  head/sys/compat/freebsd32/freebsd32_ioctl.c
  head/sys/compat/freebsd32/freebsd32_ioctl.h

Modified: head/sys/compat/freebsd32/freebsd32_ioctl.c
==============================================================================
--- head/sys/compat/freebsd32/freebsd32_ioctl.c	Sun Mar 29 18:14:45 2009	(r190528)
+++ head/sys/compat/freebsd32/freebsd32_ioctl.c	Sun Mar 29 20:09:51 2009	(r190529)
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <sys/cdio.h>
 #include <sys/fcntl.h>
+#include <sys/filio.h>
 #include <sys/file.h>
 #include <sys/ioccom.h>
 #include <sys/mdioctl.h>
@@ -178,6 +179,22 @@ freebsd32_ioctl_ioc_read_toc(struct thre
 	return error;
 }
 
+static int
+freebsd32_ioctl_fiodgname(struct thread *td,
+    struct freebsd32_ioctl_args *uap, struct file *fp)
+{
+	struct fiodgname_arg fgn;
+	struct fiodgname_arg32 fgn32;
+	int error;
+
+	if ((error = copyin(uap->data, &fgn32, sizeof fgn32)) != 0)
+		return (error);
+	CP(fgn32, fgn, len);
+	PTRIN_CP(fgn32, fgn, buf);
+	error = fo_ioctl(fp, FIODGNAME, (caddr_t)&fgn, td->td_ucred, td);
+	fdrop(fp, td);
+	return (error);
+}
 
 int
 freebsd32_ioctl(struct thread *td, struct freebsd32_ioctl_args *uap)
@@ -210,6 +227,9 @@ freebsd32_ioctl(struct thread *td, struc
 	case CDIOREADTOCHEADER_32:
 		return freebsd32_ioctl_ioc_toc_header(td, uap, fp);
 
+	case FIODGNAME_32:
+		return freebsd32_ioctl_fiodgname(td, uap, fp);
+
 	default:
 		fdrop(fp, td);
 		ap.fd = uap->fd;

Modified: head/sys/compat/freebsd32/freebsd32_ioctl.h
==============================================================================
--- head/sys/compat/freebsd32/freebsd32_ioctl.h	Sun Mar 29 18:14:45 2009	(r190528)
+++ head/sys/compat/freebsd32/freebsd32_ioctl.h	Sun Mar 29 20:09:51 2009	(r190529)
@@ -62,11 +62,17 @@ struct md_ioctl32 {
 	int		md_pad[MDNPAD32]; /* padding for future ideas */
 };
 
+struct fiodgname_arg32 {
+	int		len;
+	caddr_t32	buf;
+};
+
 #define	CDIOREADTOCENTRYS_32 _IOWR('c', 5, struct ioc_read_toc_entry32)
 #define	CDIOREADTOCHEADER_32 _IOR('c', 4, struct ioc_toc_header32)
 #define	MDIOCATTACH_32	_IOC(IOC_INOUT, 'm', 0, sizeof(struct md_ioctl32) + 4)
 #define	MDIOCDETACH_32	_IOC(IOC_INOUT, 'm', 1, sizeof(struct md_ioctl32) + 4)
 #define	MDIOCQUERY_32	_IOC(IOC_INOUT, 'm', 2, sizeof(struct md_ioctl32) + 4)
 #define	MDIOCLIST_32	_IOC(IOC_INOUT, 'm', 3, sizeof(struct md_ioctl32) + 4)
+#define	FIODGNAME_32	_IOW('f', 120, struct fiodgname_arg32)
 
 #endif	/* _COMPAT_FREEBSD32_IOCTL_H_ */


More information about the svn-src-all mailing list