mirror of
https://github.com/postgres/postgres.git
synced 2025-07-21 16:02:15 +03:00
Support use of strnlen() in pre-v11 branches.
Back-patch a minimal subset of commitsfffd651e8
and46912d9b1
, to support strnlen() on all platforms without adding any callers. This will be needed by a following bug fix.
This commit is contained in:
23
configure
vendored
23
configure
vendored
@ -13513,6 +13513,16 @@ fi
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_DECL_STRLCPY $ac_have_decl
|
||||
_ACEOF
|
||||
ac_fn_c_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "$ac_includes_default"
|
||||
if test "x$ac_cv_have_decl_strnlen" = xyes; then :
|
||||
ac_have_decl=1
|
||||
else
|
||||
ac_have_decl=0
|
||||
fi
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_DECL_STRNLEN $ac_have_decl
|
||||
_ACEOF
|
||||
|
||||
# This is probably only present on macOS, but may as well check always
|
||||
ac_fn_c_check_decl "$LINENO" "F_FULLFSYNC" "ac_cv_have_decl_F_FULLFSYNC" "#include <fcntl.h>
|
||||
@ -13880,6 +13890,19 @@ esac
|
||||
|
||||
fi
|
||||
|
||||
ac_fn_c_check_func "$LINENO" "strnlen" "ac_cv_func_strnlen"
|
||||
if test "x$ac_cv_func_strnlen" = xyes; then :
|
||||
$as_echo "#define HAVE_STRNLEN 1" >>confdefs.h
|
||||
|
||||
else
|
||||
case " $LIBOBJS " in
|
||||
*" strnlen.$ac_objext "* ) ;;
|
||||
*) LIBOBJS="$LIBOBJS strnlen.$ac_objext"
|
||||
;;
|
||||
esac
|
||||
|
||||
fi
|
||||
|
||||
|
||||
|
||||
case $host_os in
|
||||
|
@ -1548,7 +1548,7 @@ AC_CHECK_DECLS(posix_fadvise, [], [], [#include <fcntl.h>])
|
||||
]) # fi
|
||||
|
||||
AC_CHECK_DECLS(fdatasync, [], [], [#include <unistd.h>])
|
||||
AC_CHECK_DECLS([strlcat, strlcpy])
|
||||
AC_CHECK_DECLS([strlcat, strlcpy, strnlen])
|
||||
# This is probably only present on macOS, but may as well check always
|
||||
AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include <fcntl.h>])
|
||||
|
||||
@ -1640,7 +1640,7 @@ else
|
||||
AC_CHECK_FUNCS([fpclass fp_class fp_class_d class], [break])
|
||||
fi
|
||||
|
||||
AC_REPLACE_FUNCS([crypt fls getopt getrusage inet_aton mkdtemp random rint srandom strerror strlcat strlcpy])
|
||||
AC_REPLACE_FUNCS([crypt fls getopt getrusage inet_aton mkdtemp random rint srandom strerror strlcat strlcpy strnlen])
|
||||
|
||||
case $host_os in
|
||||
|
||||
|
@ -150,6 +150,10 @@
|
||||
don't. */
|
||||
#undef HAVE_DECL_STRLCPY
|
||||
|
||||
/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
|
||||
don't. */
|
||||
#undef HAVE_DECL_STRNLEN
|
||||
|
||||
/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
|
||||
don't. */
|
||||
#undef HAVE_DECL_STRTOLL
|
||||
@ -504,6 +508,9 @@
|
||||
/* Define to 1 if you have the `strlcpy' function. */
|
||||
#undef HAVE_STRLCPY
|
||||
|
||||
/* Define to 1 if you have the `strnlen' function. */
|
||||
#undef HAVE_STRNLEN
|
||||
|
||||
/* Define to use have a strong random number source */
|
||||
#undef HAVE_STRONG_RANDOM
|
||||
|
||||
|
@ -102,6 +102,10 @@
|
||||
don't. */
|
||||
#define HAVE_DECL_SNPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
|
||||
don't. */
|
||||
#define HAVE_DECL_STRNLEN 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
|
||||
don't. */
|
||||
#define HAVE_DECL_STRTOLL 1
|
||||
@ -271,6 +275,9 @@
|
||||
/* Define to 1 if you have the <pam/pam_appl.h> header file. */
|
||||
/* #undef HAVE_PAM_PAM_APPL_H */
|
||||
|
||||
/* Define to 1 if you have the `strnlen' function. */
|
||||
#define HAVE_STRNLEN 1
|
||||
|
||||
/* Define to 1 if you have the `poll' function. */
|
||||
/* #undef HAVE_POLL */
|
||||
|
||||
|
@ -409,6 +409,10 @@ extern size_t strlcat(char *dst, const char *src, size_t siz);
|
||||
extern size_t strlcpy(char *dst, const char *src, size_t siz);
|
||||
#endif
|
||||
|
||||
#if !HAVE_DECL_STRNLEN
|
||||
extern size_t strnlen(const char *str, size_t maxlen);
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_RANDOM)
|
||||
extern long random(void);
|
||||
#endif
|
||||
|
1
src/interfaces/libpq/.gitignore
vendored
1
src/interfaces/libpq/.gitignore
vendored
@ -18,6 +18,7 @@
|
||||
/snprintf.c
|
||||
/strerror.c
|
||||
/strlcpy.c
|
||||
/strnlen.c
|
||||
/thread.c
|
||||
/win32error.c
|
||||
/win32setlocale.c
|
||||
|
@ -38,7 +38,7 @@ OBJS= fe-auth.o fe-auth-scram.o fe-connect.o fe-exec.o fe-misc.o fe-print.o fe-l
|
||||
OBJS += chklocale.o inet_net_ntop.o noblock.o pgstrcasecmp.o pqsignal.o \
|
||||
thread.o
|
||||
# libpgport C files that are needed if identified by configure
|
||||
OBJS += $(filter crypt.o getaddrinfo.o getpeereid.o inet_aton.o open.o system.o snprintf.o strerror.o strlcpy.o win32error.o win32setlocale.o, $(LIBOBJS))
|
||||
OBJS += $(filter crypt.o getaddrinfo.o getpeereid.o inet_aton.o open.o system.o snprintf.o strerror.o strlcpy.o strnlen.o win32error.o win32setlocale.o, $(LIBOBJS))
|
||||
|
||||
ifeq ($(enable_strong_random), yes)
|
||||
OBJS += pg_strong_random.o
|
||||
@ -103,7 +103,7 @@ backend_src = $(top_srcdir)/src/backend
|
||||
# the module is needed (see filter hack in OBJS, above).
|
||||
# When you add a file here, remember to add it in the "clean" target below.
|
||||
|
||||
chklocale.c crypt.c erand48.c getaddrinfo.c getpeereid.c inet_aton.c inet_net_ntop.c noblock.c open.c system.c pgsleep.c pg_strong_random.c pgstrcasecmp.c pqsignal.c snprintf.c strerror.c strlcpy.c thread.c win32error.c win32setlocale.c: % : $(top_srcdir)/src/port/%
|
||||
chklocale.c crypt.c erand48.c getaddrinfo.c getpeereid.c inet_aton.c inet_net_ntop.c noblock.c open.c system.c pgsleep.c pg_strong_random.c pgstrcasecmp.c pqsignal.c snprintf.c strerror.c strlcpy.c strnlen.c thread.c win32error.c win32setlocale.c: % : $(top_srcdir)/src/port/%
|
||||
rm -f $@ && $(LN_S) $< .
|
||||
|
||||
ip.c md5.c base64.c scram-common.c sha2.c sha2_openssl.c saslprep.c unicode_norm.c: % : $(top_srcdir)/src/common/%
|
||||
@ -155,7 +155,7 @@ clean distclean: clean-lib
|
||||
# Might be left over from a Win32 client-only build
|
||||
rm -f pg_config_paths.h
|
||||
# Remove files we (may have) symlinked in from src/port and other places
|
||||
rm -f chklocale.c crypt.c erand48.c getaddrinfo.c getpeereid.c inet_aton.c inet_net_ntop.c noblock.c open.c system.c pgsleep.c pg_strong_random.c pgstrcasecmp.c pqsignal.c snprintf.c strerror.c strlcpy.c thread.c win32error.c win32setlocale.c
|
||||
rm -f chklocale.c crypt.c erand48.c getaddrinfo.c getpeereid.c inet_aton.c inet_net_ntop.c noblock.c open.c system.c pgsleep.c pg_strong_random.c pgstrcasecmp.c pqsignal.c snprintf.c strerror.c strlcpy.c strnlen.c thread.c win32error.c win32setlocale.c
|
||||
rm -f ip.c md5.c base64.c scram-common.c sha2.c sha2_openssl.c saslprep.c unicode_norm.c
|
||||
rm -f encnames.c wchar.c
|
||||
|
||||
|
33
src/port/strnlen.c
Normal file
33
src/port/strnlen.c
Normal file
@ -0,0 +1,33 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* strnlen.c
|
||||
* Fallback implementation of strnlen().
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* src/port/strnlen.c
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "c.h"
|
||||
|
||||
/*
|
||||
* Implementation of posix' strnlen for systems where it's not available.
|
||||
*
|
||||
* Returns the number of characters before a null-byte in the string pointed
|
||||
* to by str, unless there's no null-byte before maxlen. In the latter case
|
||||
* maxlen is returned.
|
||||
*/
|
||||
size_t
|
||||
strnlen(const char *str, size_t maxlen)
|
||||
{
|
||||
const char *p = str;
|
||||
|
||||
while (maxlen-- > 0 && *p)
|
||||
p++;
|
||||
return p - str;
|
||||
}
|
Reference in New Issue
Block a user