summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sys/socket.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/include/sys/socket.h b/include/sys/socket.h
new file mode 100644
index 0000000..df15961
--- /dev/null
+++ b/include/sys/socket.h
@@ -0,0 +1,31 @@
1/* See LICENSE file for copyright and license details. */
2#ifndef FORTIFY_SYS_SOCKET_H_
3#define FORTIFY_SYS_SOCKET_H_
4
5#include_next <sys/socket.h>
6
7#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0
8
9#define __errordecl(name, msg) extern void name(void) __attribute__((__error__(msg)))
10
11__errordecl(__recv_error, "recv: buffer overflow detected");
12static inline __attribute__ ((always_inline))
13ssize_t
14__fortify_recv(int sockfd, void *buf, size_t n, int flags)
15{
16 size_t bos = __builtin_object_size(buf, 0);
17
18 if (__builtin_constant_p(n) && n > bos)
19 __recv_error();
20
21 if (n > bos)
22 __builtin_trap();
23 return recv(sockfd, buf, n, flags);
24}
25
26#undef recv
27#define recv(sockfd, buf, n, flags) __fortify_recv(sockfd, buf, n, flags)
28
29#endif
30
31#endif