From aa095b6d52ca4fa3b053d15c871c6ece34f99d1c Mon Sep 17 00:00:00 2001 From: sin Date: Fri, 30 Jan 2015 16:43:36 +0000 Subject: [PATCH] Add recv() checks --- include/sys/socket.h | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 include/sys/socket.h 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 @@ +/* See LICENSE file for copyright and license details. */ +#ifndef FORTIFY_SYS_SOCKET_H_ +#define FORTIFY_SYS_SOCKET_H_ + +#include_next + +#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 + +#define __errordecl(name, msg) extern void name(void) __attribute__((__error__(msg))) + +__errordecl(__recv_error, "recv: buffer overflow detected"); +static inline __attribute__ ((always_inline)) +ssize_t +__fortify_recv(int sockfd, void *buf, size_t n, int flags) +{ + size_t bos = __builtin_object_size(buf, 0); + + if (__builtin_constant_p(n) && n > bos) + __recv_error(); + + if (n > bos) + __builtin_trap(); + return recv(sockfd, buf, n, flags); +} + +#undef recv +#define recv(sockfd, buf, n, flags) __fortify_recv(sockfd, buf, n, flags) + +#endif + +#endif