Skip to content

Commit 7871a36

Browse files
committed
Fix detection of the result type of strerror_r().
The method we've traditionally used, of redeclaring strerror_r() to see if the compiler complains of inconsistent declarations, turns out not to work reliably because some compilers only report a warning, not an error. Amazingly, this has gone undetected for years, even though it certainly breaks our detection of whether strerror_r succeeded. Let's instead test whether the compiler will take the result of strerror_r() as a switch() argument. It's possible this won't work universally either, but it's the best idea I could come up with on the spur of the moment. Back-patch of commit 751f532. Buildfarm results indicate that only icc-on-Linux actually has an issue here; perhaps the lack of field reports indicates that people don't build PG for production that way. Discussion: https://postgr.es/m/10877.1537993279@sss.pgh.pa.us
1 parent a8fb03f commit 7871a36

File tree

4 files changed

+15
-17
lines changed

4 files changed

+15
-17
lines changed

config/c-library.m4

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,23 +82,23 @@ AH_VERBATIM(GETTIMEOFDAY_1ARG_,
8282

8383
# PGAC_FUNC_STRERROR_R_INT
8484
# ---------------------------
85-
# Check if strerror_r() returns an int (SUSv3) rather than a char * (GNU libc)
86-
# If so, define STRERROR_R_INT
85+
# Check if strerror_r() returns int (POSIX) rather than char * (GNU libc).
86+
# If so, define STRERROR_R_INT.
87+
# The result is uncertain if strerror_r() isn't provided,
88+
# but we don't much care.
8789
AC_DEFUN([PGAC_FUNC_STRERROR_R_INT],
8890
[AC_CACHE_CHECK(whether strerror_r returns int,
8991
pgac_cv_func_strerror_r_int,
9092
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <string.h>],
91-
[#ifndef _AIX
92-
int strerror_r(int, char *, size_t);
93-
#else
94-
/* Older AIX has 'int' for the third argument so we don't test the args. */
95-
int strerror_r();
96-
#endif])],
93+
[[char buf[100];
94+
switch (strerror_r(1, buf, sizeof(buf)))
95+
{ case 0: break; default: break; }
96+
]])],
9797
[pgac_cv_func_strerror_r_int=yes],
9898
[pgac_cv_func_strerror_r_int=no])])
9999
if test x"$pgac_cv_func_strerror_r_int" = xyes ; then
100100
AC_DEFINE(STRERROR_R_INT, 1,
101-
[Define to 1 if strerror_r() returns a int.])
101+
[Define to 1 if strerror_r() returns int.])
102102
fi
103103
])# PGAC_FUNC_STRERROR_R_INT
104104

configure

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10566,12 +10566,10 @@ else
1056610566
int
1056710567
main ()
1056810568
{
10569-
#ifndef _AIX
10570-
int strerror_r(int, char *, size_t);
10571-
#else
10572-
/* Older AIX has 'int' for the third argument so we don't test the args. */
10573-
int strerror_r();
10574-
#endif
10569+
char buf[100];
10570+
switch (strerror_r(1, buf, sizeof(buf)))
10571+
{ case 0: break; default: break; }
10572+
1057510573
;
1057610574
return 0;
1057710575
}

src/include/pg_config.h.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@
855855
/* Define to 1 if you have the ANSI C header files. */
856856
#undef STDC_HEADERS
857857

858-
/* Define to 1 if strerror_r() returns a int. */
858+
/* Define to 1 if strerror_r() returns int. */
859859
#undef STRERROR_R_INT
860860

861861
/* Define to 1 if your <sys/time.h> declares `struct tm'. */

src/include/pg_config.h.win32

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,7 @@
676676
/* Define to 1 if you have the ANSI C header files. */
677677
#define STDC_HEADERS 1
678678

679-
/* Define to 1 if strerror_r() returns a int. */
679+
/* Define to 1 if strerror_r() returns int. */
680680
/* #undef STRERROR_R_INT */
681681

682682
/* Define to 1 if your <sys/time.h> declares `struct tm'. */

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy