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/select.h | 10 ++++------ include/sys/socket.h | 53 ++++++++++++++++++++++++++-------------------------- 2 files changed, 30 insertions(+), 33 deletions(-) (limited to 'include/sys') diff --git a/include/sys/select.h b/include/sys/select.h index c73613d..7838041 100644 --- a/include/sys/select.h +++ b/include/sys/select.h @@ -7,9 +7,8 @@ #ifndef __cplusplus -static inline __attribute__ ((always_inline)) -int -__fortify_FD_CLR(int fd, fd_set *set) +static __inline __attribute__((__always_inline__,__gnu_inline__)) +int __fortify_FD_CLR(int fd, fd_set *set) { size_t bos = __builtin_object_size(set, 0); @@ -18,9 +17,8 @@ __fortify_FD_CLR(int fd, fd_set *set) return FD_CLR(fd, set); } -static inline __attribute__ ((always_inline)) -int -__fortify_FD_SET(int fd, fd_set *set) +static __inline __attribute__((__always_inline__,__gnu_inline__)) +int __fortify_FD_SET(int fd, fd_set *set) { size_t bos = __builtin_object_size(set, 0); 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