Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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)