From owner-svn-src-head@FreeBSD.ORG Sun Mar 29 20:09:51 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D57A71065670; Sun, 29 Mar 2009 20:09:51 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C44438FC08; Sun, 29 Mar 2009 20:09:51 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n2TK9pe8043629; Sun, 29 Mar 2009 20:09:51 GMT (envelope-from ed@svn.freebsd.org) Received: (from ed@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n2TK9pLQ043627; Sun, 29 Mar 2009 20:09:51 GMT (envelope-from ed@svn.freebsd.org) Message-Id: <200903292009.n2TK9pLQ043627@svn.freebsd.org> From: Ed Schouten Date: Sun, 29 Mar 2009 20:09:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r190529 - head/sys/compat/freebsd32 X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 29 Mar 2009 20:09:53 -0000 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 #include #include +#include #include #include #include @@ -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_ */