summaryrefslogtreecommitdiffstats
path: root/sys/compat/linux/linux_socket.c
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2007-04-14 10:35:09 +0000
committerrwatson <rwatson@FreeBSD.org>2007-04-14 10:35:09 +0000
commitc4b43c46c906a35a302c13d4b22acc1f93e75de1 (patch)
tree31e4fc91e53d41cf1f54d7039bbd37159948f7e6 /sys/compat/linux/linux_socket.c
parentb2e4c77a02a90972acaa19099d19be9f1dffa3a3 (diff)
downloadFreeBSD-src-c4b43c46c906a35a302c13d4b22acc1f93e75de1.zip
FreeBSD-src-c4b43c46c906a35a302c13d4b22acc1f93e75de1.tar.gz
Some Linux applications (ping) pass a non-NULL msg_control argument to
sendmsg() while using a 0-length msg_controllen. This isn't allowed in the FreeBSD system call ABI, so detect this case and set msg_control to NULL. This allows Linux ping to work. Submitted by: rdivacky
Diffstat (limited to 'sys/compat/linux/linux_socket.c')
-rw-r--r--sys/compat/linux/linux_socket.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c
index 9a90c57..553a657 100644
--- a/sys/compat/linux/linux_socket.c
+++ b/sys/compat/linux/linux_socket.c
@@ -1028,6 +1028,16 @@ linux_sendmsg(struct thread *td, struct linux_sendmsg_args *args)
error = copyin(PTRIN(linux_args.msg), &msg, sizeof(msg));
if (error)
return (error);
+
+ /*
+ * Some Linux applications (ping) define a non-NULL control data
+ * pointer, but a msg_controllen of 0, which is not allowed in the
+ * FreeBSD system call interface. NULL the msg_control pointer in
+ * order to handle this case. This should be checked, but allows the
+ * Linux ping to work.
+ */
+ if (msg.msg_control != NULL && msg.msg_controllen == 0)
+ msg.msg_control = NULL;
error = copyiniov(msg.msg_iov, msg.msg_iovlen, &iov, EMSGSIZE);
if (error)
return (error);
OpenPOWER on IntegriCloud