mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 18:46:05 +00:00
[libc] Add MSAN unpoison annotations to recv funcs (#109844)
Anywhere a struct is returned from the kernel, we need to explicitly unpoison it for MSAN. This patch does that for the recv, recvfrom, recvmsg, and socketpair functions.
This commit is contained in:
parent
5d88fd33ee
commit
aeb18ebbe0
@ -33,6 +33,7 @@ add_entrypoint_object(
|
|||||||
DEPENDS
|
DEPENDS
|
||||||
libc.include.sys_syscall
|
libc.include.sys_syscall
|
||||||
libc.include.sys_socket
|
libc.include.sys_socket
|
||||||
|
libc.src.__support.macros.sanitizer
|
||||||
libc.src.__support.OSUtil.osutil
|
libc.src.__support.OSUtil.osutil
|
||||||
libc.src.errno.errno
|
libc.src.errno.errno
|
||||||
)
|
)
|
||||||
@ -87,6 +88,7 @@ add_entrypoint_object(
|
|||||||
libc.include.sys_syscall
|
libc.include.sys_syscall
|
||||||
libc.hdr.types.struct_sockaddr
|
libc.hdr.types.struct_sockaddr
|
||||||
libc.hdr.types.socklen_t
|
libc.hdr.types.socklen_t
|
||||||
|
libc.src.__support.macros.sanitizer
|
||||||
libc.src.__support.OSUtil.osutil
|
libc.src.__support.OSUtil.osutil
|
||||||
libc.src.errno.errno
|
libc.src.errno.errno
|
||||||
)
|
)
|
||||||
@ -101,6 +103,7 @@ add_entrypoint_object(
|
|||||||
libc.include.sys_syscall
|
libc.include.sys_syscall
|
||||||
libc.hdr.types.struct_sockaddr
|
libc.hdr.types.struct_sockaddr
|
||||||
libc.hdr.types.socklen_t
|
libc.hdr.types.socklen_t
|
||||||
|
libc.src.__support.macros.sanitizer
|
||||||
libc.src.__support.OSUtil.osutil
|
libc.src.__support.OSUtil.osutil
|
||||||
libc.src.errno.errno
|
libc.src.errno.errno
|
||||||
)
|
)
|
||||||
@ -114,6 +117,7 @@ add_entrypoint_object(
|
|||||||
DEPENDS
|
DEPENDS
|
||||||
libc.include.sys_syscall
|
libc.include.sys_syscall
|
||||||
libc.hdr.types.struct_msghdr
|
libc.hdr.types.struct_msghdr
|
||||||
|
libc.src.__support.macros.sanitizer
|
||||||
libc.src.__support.OSUtil.osutil
|
libc.src.__support.OSUtil.osutil
|
||||||
libc.src.errno.errno
|
libc.src.errno.errno
|
||||||
)
|
)
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include "hdr/types/struct_sockaddr.h"
|
#include "hdr/types/struct_sockaddr.h"
|
||||||
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
|
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
|
||||||
#include "src/__support/common.h"
|
#include "src/__support/common.h"
|
||||||
|
#include "src/__support/macros/sanitizer.h"
|
||||||
#include "src/errno/libc_errno.h"
|
#include "src/errno/libc_errno.h"
|
||||||
#include <linux/net.h> // For SYS_SOCKET socketcall number.
|
#include <linux/net.h> // For SYS_SOCKET socketcall number.
|
||||||
#include <sys/syscall.h> // For syscall numbers.
|
#include <sys/syscall.h> // For syscall numbers.
|
||||||
@ -41,6 +42,9 @@ LLVM_LIBC_FUNCTION(ssize_t, recv,
|
|||||||
libc_errno = static_cast<int>(-ret);
|
libc_errno = static_cast<int>(-ret);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MSAN_UNPOISON(buf, ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include "hdr/types/struct_sockaddr.h"
|
#include "hdr/types/struct_sockaddr.h"
|
||||||
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
|
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
|
||||||
#include "src/__support/common.h"
|
#include "src/__support/common.h"
|
||||||
|
#include "src/__support/macros/sanitizer.h"
|
||||||
#include "src/errno/libc_errno.h"
|
#include "src/errno/libc_errno.h"
|
||||||
#include <linux/net.h> // For SYS_SOCKET socketcall number.
|
#include <linux/net.h> // For SYS_SOCKET socketcall number.
|
||||||
#include <sys/syscall.h> // For syscall numbers.
|
#include <sys/syscall.h> // For syscall numbers.
|
||||||
@ -43,6 +44,9 @@ LLVM_LIBC_FUNCTION(ssize_t, recvfrom,
|
|||||||
libc_errno = static_cast<int>(-ret);
|
libc_errno = static_cast<int>(-ret);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MSAN_UNPOISON(buf, ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "hdr/types/struct_msghdr.h"
|
#include "hdr/types/struct_msghdr.h"
|
||||||
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
|
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
|
||||||
#include "src/__support/common.h"
|
#include "src/__support/common.h"
|
||||||
|
#include "src/__support/macros/sanitizer.h"
|
||||||
#include "src/errno/libc_errno.h"
|
#include "src/errno/libc_errno.h"
|
||||||
#include <linux/net.h> // For SYS_SOCKET socketcall number.
|
#include <linux/net.h> // For SYS_SOCKET socketcall number.
|
||||||
#include <sys/syscall.h> // For syscall numbers.
|
#include <sys/syscall.h> // For syscall numbers.
|
||||||
@ -36,6 +37,14 @@ LLVM_LIBC_FUNCTION(ssize_t, recvmsg,
|
|||||||
libc_errno = static_cast<int>(-ret);
|
libc_errno = static_cast<int>(-ret);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unpoison the msghdr, as well as all its components.
|
||||||
|
MSAN_UNPOISON(msg->msg_name, msg->msg_namelen);
|
||||||
|
for (size_t i = 0; i < msg->msg_iovlen; ++i) {
|
||||||
|
MSAN_UNPOISON(msg->msg_iov->iov_base, msg->msg_iov->iov_len);
|
||||||
|
}
|
||||||
|
MSAN_UNPOISON(msg->msg_control, msg->msg_controllen);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,10 +10,9 @@
|
|||||||
|
|
||||||
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
|
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
|
||||||
#include "src/__support/common.h"
|
#include "src/__support/common.h"
|
||||||
|
|
||||||
#include "src/__support/macros/config.h"
|
#include "src/__support/macros/config.h"
|
||||||
|
#include "src/__support/macros/sanitizer.h"
|
||||||
#include "src/errno/libc_errno.h"
|
#include "src/errno/libc_errno.h"
|
||||||
|
|
||||||
#include <linux/net.h> // For SYS_SOCKET socketcall number.
|
#include <linux/net.h> // For SYS_SOCKET socketcall number.
|
||||||
#include <sys/syscall.h> // For syscall numbers.
|
#include <sys/syscall.h> // For syscall numbers.
|
||||||
|
|
||||||
@ -37,6 +36,9 @@ LLVM_LIBC_FUNCTION(int, socketpair,
|
|||||||
libc_errno = -ret;
|
libc_errno = -ret;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MSAN_UNPOISON(sv, sizeof(int) * 2);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# See https://llvm.org/LICENSE.txt for license information.
|
# See https://llvm.org/LICENSE.txt for license information.
|
||||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
|
||||||
# Tests for LLVM libc string.h functions.
|
# Tests for LLVM libc socket.h functions.
|
||||||
|
|
||||||
load("//libc/test:libc_test_rules.bzl", "libc_test")
|
load("//libc/test:libc_test_rules.bzl", "libc_test")
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user