aboutsummaryrefslogtreecommitdiff
path: root/socket
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2024-02-08 15:46:18 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2024-02-27 10:52:59 -0300
commit4289b00d4393f490515527864cf09093f4f8c2c4 (patch)
tree153d658fe0ebf9537179bf855b4f7cbb3ef37ffd /socket
parentec307a10865a3e43f611b725fec952a93e4d1893 (diff)
downloadglibc-4289b00d4393f490515527864cf09093f4f8c2c4.tar
glibc-4289b00d4393f490515527864cf09093f4f8c2c4.tar.gz
glibc-4289b00d4393f490515527864cf09093f4f8c2c4.tar.bz2
glibc-4289b00d4393f490515527864cf09093f4f8c2c4.zip
socket: Improve fortify with clang
It improve fortify checks recv, recvfrom, poll, and ppoll. The compile and runtime hecks have similar coverage as with GCC. Checked on aarch64, armhf, x86_64, and i686. Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'socket')
-rw-r--r--socket/bits/socket2.h20
1 files changed, 16 insertions, 4 deletions
diff --git a/socket/bits/socket2.h b/socket/bits/socket2.h
index a88cb64370..04780f320e 100644
--- a/socket/bits/socket2.h
+++ b/socket/bits/socket2.h
@@ -30,14 +30,20 @@ extern ssize_t __REDIRECT (__recv_chk_warn,
__warnattr ("recv called with bigger length than size of destination "
"buffer");
-__fortify_function ssize_t
-recv (int __fd, void *__buf, size_t __n, int __flags)
+__fortify_function __attribute_overloadable__ ssize_t
+recv (int __fd, __fortify_clang_overload_arg0 (void *, ,__buf), size_t __n,
+ int __flags)
+ __fortify_clang_warning_only_if_bos0_lt (__n, __buf,
+ "recv called with bigger length than "
+ "size of destination buffer")
{
size_t sz = __glibc_objsize0 (__buf);
if (__glibc_safe_or_unknown_len (__n, sizeof (char), sz))
return __recv_alias (__fd, __buf, __n, __flags);
+#if !__fortify_use_clang
if (__glibc_unsafe_len (__n, sizeof (char), sz))
return __recv_chk_warn (__fd, __buf, __n, sz, __flags);
+#endif
return __recv_chk (__fd, __buf, __n, sz, __flags);
}
@@ -57,15 +63,21 @@ extern ssize_t __REDIRECT (__recvfrom_chk_warn,
__warnattr ("recvfrom called with bigger length than size of "
"destination buffer");
-__fortify_function ssize_t
-recvfrom (int __fd, void *__restrict __buf, size_t __n, int __flags,
+__fortify_function __attribute_overloadable__ ssize_t
+recvfrom (int __fd, __fortify_clang_overload_arg0 (void *, __restrict, __buf),
+ size_t __n, int __flags,
__SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)
+ __fortify_clang_warning_only_if_bos0_lt (__n, __buf,
+ "recvfrom called with bigger length "
+ "than size of destination buffer")
{
size_t sz = __glibc_objsize0 (__buf);
if (__glibc_safe_or_unknown_len (__n, sizeof (char), sz))
return __recvfrom_alias (__fd, __buf, __n, __flags, __addr, __addr_len);
+#if !__fortify_use_clang
if (__glibc_unsafe_len (__n, sizeof (char), sz))
return __recvfrom_chk_warn (__fd, __buf, __n, sz, __flags, __addr,
__addr_len);
+#endif
return __recvfrom_chk (__fd, __buf, __n, sz, __flags, __addr, __addr_len);
}