From 1f8a3f7bccfc84b195218ad0086ebd57049c3490 Mon Sep 17 00:00:00 2001 From: Guillem Jover Date: Tue, 6 Mar 2018 01:39:45 +0100 Subject: Fix function declaration protection for glibc already providing them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On non-glibc based systems we cannot unconditionally use the __GLIBC_PREREQ macro as it gets expanded before evaluation. Instead, if it is undefined, define it to 0. We should also always declare these functions on non-glibc based systems. And on systems with a new enough glibc, which provides these functions, we should still provide the declarations if _GNU_SOURCE is *not* defined. Reported-by: Jörg Krause --- include/bsd/stdlib.h | 3 ++- include/bsd/string.h | 3 ++- include/bsd/sys/cdefs.h | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) --- a/include/bsd/stdlib.h +++ b/include/bsd/stdlib.h @@ -71,7 +71,8 @@ int sradixsort(const unsigned char **bas const unsigned char *table, unsigned endbyte); void *reallocf(void *ptr, size_t size); -#if defined(_GNU_SOURCE) && defined(__GLIBC__) && !__GLIBC_PREREQ(2, 26) +#if !defined(__GLIBC__) || \ + (defined(__GLIBC__) && (!__GLIBC_PREREQ(2, 26) || !defined(_GNU_SOURCE))) void *reallocarray(void *ptr, size_t nmemb, size_t size); #endif --- a/include/bsd/string.h +++ b/include/bsd/string.h @@ -46,7 +46,8 @@ size_t strlcat(char *dst, const char *sr char *strnstr(const char *str, const char *find, size_t str_len); void strmode(mode_t mode, char *str); -#if defined(_GNU_SOURCE) && defined(__GLIBC__) && !__GLIBC_PREREQ(2, 25) +#if !defined(__GLIBC__) || \ + (defined(__GLIBC__) && (!__GLIBC_PREREQ(2, 25) || !defined(_GNU_SOURCE))) void explicit_bzero(void *buf, size_t len); #endif __END_DECLS --- a/include/bsd/sys/cdefs.h +++ b/include/bsd/sys/cdefs.h @@ -59,6 +59,14 @@ #endif /* + * On non-glibc based systems, we cannot unconditionally use the + * __GLIBC_PREREQ macro as it gets expanded before evaluation. + */ +#ifndef __GLIBC_PREREQ +#define __GLIBC_PREREQ(maj, min) 0 +#endif + +/* * Some kFreeBSD headers expect those macros to be set for sanity checks. */ #ifndef _SYS_CDEFS_H_