From 9f8c543dc81f0c4239acae6713f5414eb7dc681d Mon Sep 17 00:00:00 2001 From: sin Date: Fri, 13 Mar 2015 11:00:46 +0000 Subject: Rework fortify implementation to use extern inline Overriding functions with macros is legal in C but a lot of software is not prepared for it. Use the extern inline method to achieve the same result. --- include/sys/socket.h | 53 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 27 deletions(-) (limited to 'include/sys/socket.h') diff --git a/include/sys/socket.h b/include/sys/socket.h index 5e6d679..4602866 100644 --- a/include/sys/socket.h +++ b/include/sys/socket.h @@ -6,62 +6,61 @@ #if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 #ifndef __cplusplus +#undef recv +#undef recvfrom +#undef send +#undef sendto -static inline __attribute__ ((always_inline)) -ssize_t -__fortify_recv(int sockfd, void *buf, size_t n, int flags) +extern ssize_t __recv_orig(int, void *, size_t, int) + __asm__(__USER_LABEL_PREFIX__ "recv"); +extern __inline __attribute__((__always_inline__,__gnu_inline__)) +ssize_t recv(int sockfd, void *buf, size_t n, int flags) { size_t bos = __builtin_object_size(buf, 0); if (n > bos) __builtin_trap(); - return recv(sockfd, buf, n, flags); + return __recv_orig(sockfd, buf, n, flags); } -static inline __attribute__ ((always_inline)) -ssize_t -__fortify_recvfrom(int sockfd, void *buf, size_t n, int flags, - struct sockaddr *sa, socklen_t *salen) +extern ssize_t __recvfrom_orig(int, void *, size_t, int, struct sockaddr *, socklen_t *) + __asm__(__USER_LABEL_PREFIX__ "recvfrom"); +extern __inline __attribute__((__always_inline__,__gnu_inline__)) +ssize_t recvfrom(int sockfd, void *buf, size_t n, int flags, + struct sockaddr *sa, socklen_t *salen) { size_t bos = __builtin_object_size(buf, 0); if (n > bos) __builtin_trap(); - return recvfrom(sockfd, buf, n, flags, sa, salen); + return __recvfrom_orig(sockfd, buf, n, flags, sa, salen); } -static inline __attribute__ ((always_inline)) -ssize_t -__fortify_send(int sockfd, const void *buf, size_t n, int flags) +extern ssize_t __send_orig(int, const void *, size_t, int) + __asm__(__USER_LABEL_PREFIX__ "send"); +extern __inline __attribute__((__always_inline__,__gnu_inline__)) +ssize_t send(int sockfd, const void *buf, size_t n, int flags) { size_t bos = __builtin_object_size(buf, 0); if (n > bos) __builtin_trap(); - return send(sockfd, buf, n, flags); + return __send_orig(sockfd, buf, n, flags); } -static inline __attribute__ ((always_inline)) -ssize_t -__fortify_sendto(int sockfd, const void *buf, size_t n, int flags, - const struct sockaddr *sa, socklen_t salen) +extern ssize_t __sendto_orig(int, const void *, size_t, int, const struct sockaddr *, socklen_t) + __asm__(__USER_LABEL_PREFIX__ "sendto"); +extern __inline __attribute__((__always_inline__,__gnu_inline__)) +ssize_t sendto(int sockfd, const void *buf, size_t n, int flags, + const struct sockaddr *sa, socklen_t salen) { size_t bos = __builtin_object_size(buf, 0); if (n > bos) __builtin_trap(); - return sendto(sockfd, buf, n, flags, sa, salen); + return __sendto_orig(sockfd, buf, n, flags, sa, salen); } -#undef recv -#define recv(sockfd, buf, n, flags) __fortify_recv(sockfd, buf, n, flags) -#undef recvfrom -#define recvfrom(sockfd, buf, n, flags, sa, salen) __fortify_recvfrom(sockfd, buf, n, flags, sa, salen) -#undef send -#define send(sockfd, buf, n, flags) __fortify_send(sockfd, buf, n, flags) -#undef sendto -#define sendto(sockfd, buf, n, flags, sa, salen) __fortify_sendto(sockfd, buf, n, flags, sa, salen) - #endif #endif -- cgit v1.3