summaryrefslogtreecommitdiffstats
path: root/sys/compat/freebsd32
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-09-03 09:05:16 +0000
committerkib <kib@FreeBSD.org>2014-09-03 09:05:16 +0000
commit15564950f5fcd05b0111be37d81d69683d9f1a61 (patch)
treee676f35f8829528c885ece1ee564cc674eb1e604 /sys/compat/freebsd32
parent36aab21b56eda2d5b672607f2026f9cf4ba60510 (diff)
downloadFreeBSD-src-15564950f5fcd05b0111be37d81d69683d9f1a61.zip
FreeBSD-src-15564950f5fcd05b0111be37d81d69683d9f1a61.tar.gz
MFC r270691:
Fix handling of the third argument for fcntl(2). The native syscall uses long for arg, which needs translation.
Diffstat (limited to 'sys/compat/freebsd32')
-rw-r--r--sys/compat/freebsd32/freebsd32_misc.c25
-rw-r--r--sys/compat/freebsd32/syscalls.master3
2 files changed, 27 insertions, 1 deletions
diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c
index b07826d..a095a6e 100644
--- a/sys/compat/freebsd32/freebsd32_misc.c
+++ b/sys/compat/freebsd32/freebsd32_misc.c
@@ -3072,3 +3072,28 @@ freebsd32_procctl(struct thread *td, struct freebsd32_procctl_args *uap)
return (kern_procctl(td, uap->idtype, PAIR32TO64(id_t, uap->id),
uap->com, data));
}
+
+int
+freebsd32_fcntl(struct thread *td, struct freebsd32_fcntl_args *uap)
+{
+ intptr_t tmp;
+
+ switch (uap->cmd) {
+ /*
+ * Do unsigned conversion for arg when operation
+ * interprets it as flags or pointer.
+ */
+ case F_SETLK_REMOTE:
+ case F_SETLKW:
+ case F_SETLK:
+ case F_GETLK:
+ case F_SETFD:
+ case F_SETFL:
+ tmp = (unsigned int)(uap->arg);
+ break;
+ default:
+ tmp = uap->arg;
+ break;
+ }
+ return (kern_fcntl(td, uap->fd, uap->cmd, tmp));
+}
diff --git a/sys/compat/freebsd32/syscalls.master b/sys/compat/freebsd32/syscalls.master
index 90c3e75..f14fb76 100644
--- a/sys/compat/freebsd32/syscalls.master
+++ b/sys/compat/freebsd32/syscalls.master
@@ -200,7 +200,8 @@
89 AUE_GETDTABLESIZE NOPROTO { int getdtablesize(void); }
90 AUE_DUP2 NOPROTO { int dup2(u_int from, u_int to); }
91 AUE_NULL UNIMPL getdopt
-92 AUE_FCNTL NOPROTO { int fcntl(int fd, int cmd, long arg); }
+92 AUE_FCNTL STD { int freebsd32_fcntl(int fd, int cmd, \
+ int arg); }
93 AUE_SELECT STD { int freebsd32_select(int nd, fd_set *in, \
fd_set *ou, fd_set *ex, \
struct timeval32 *tv); }
OpenPOWER on IntegriCloud