This is an automated email from the ASF dual-hosted git repository.

reshke pushed a commit to branch REL_2_STABLE
in repository https://gitbox.apache.org/repos/asf/cloudberry.git

commit 2db0614250639949dbaf8b3fb3b017031b1b185c
Author: Heikki Linnakangas <[email protected]>
AuthorDate: Mon May 11 05:13:51 2026 -0700

    Add timingsafe_bcmp(), for constant-time memory comparison
    
    timingsafe_bcmp() should be used instead of memcmp() or a naive
    for-loop, when comparing passwords or secret tokens, to avoid leaking
    information about the secret token by timing. This commit just
    introduces the function but does not change any existing code to use
    it yet.
    
    This has been initially applied as of 09be39112654 in v18 and newer
    versions, and will be used in all the stable branches for an upcoming
    fix.
    
    Co-authored-by: Jelte Fennema-Nio <[email protected]>
    Discussion: 
https://www.postgresql.org/message-id/[email protected]
    Security: CVE-2026-6478
    Backpatch-through: 14
---
 configure                   | 23 +++++++++++++++++++++++
 configure.ac                |  3 ++-
 src/include/pg_config.h.in  |  7 +++++++
 src/include/port.h          |  4 ++++
 src/port/timingsafe_bcmp.c  | 43 +++++++++++++++++++++++++++++++++++++++++++
 src/tools/msvc/Mkvcbuild.pm |  2 +-
 src/tools/msvc/Solution.pm  |  2 ++
 7 files changed, 82 insertions(+), 2 deletions(-)

diff --git a/configure b/configure
index 9c946381f6b..e6a9e520a88 100755
--- a/configure
+++ b/configure
@@ -19829,6 +19829,16 @@ fi
 cat >>confdefs.h <<_ACEOF
 #define HAVE_DECL_STRNLEN $ac_have_decl
 _ACEOF
+ac_fn_c_check_decl "$LINENO" "timingsafe_bcmp" 
"ac_cv_have_decl_timingsafe_bcmp" "$ac_includes_default"
+if test "x$ac_cv_have_decl_timingsafe_bcmp" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_TIMINGSAFE_BCMP $ac_have_decl
+_ACEOF
 
 
 # We can't use AC_REPLACE_FUNCS to replace these functions, because it
@@ -20182,6 +20192,19 @@ esac
 
 fi
 
+ac_fn_c_check_func "$LINENO" "timingsafe_bcmp" "ac_cv_func_timingsafe_bcmp"
+if test "x$ac_cv_func_timingsafe_bcmp" = xyes; then :
+  $as_echo "#define HAVE_TIMINGSAFE_BCMP 1" >>confdefs.h
+
+else
+  case " $LIBOBJS " in
+  *" timingsafe_bcmp.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS timingsafe_bcmp.$ac_objext"
+ ;;
+esac
+
+fi
+
 
 
 if test "$enable_thread_safety" = yes; then
diff --git a/configure.ac b/configure.ac
index bcc5cf6c6ab..85c18bc94a7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2400,7 +2400,7 @@ AC_CHECK_DECLS(posix_fadvise, [], [], [#include 
<fcntl.h>])
 ]) # fi
 
 AC_CHECK_DECLS(fdatasync, [], [], [#include <unistd.h>])
-AC_CHECK_DECLS([strlcat, strlcpy, strnlen])
+AC_CHECK_DECLS([strlcat, strlcpy, strnlen, timingsafe_bcmp])
 
 # We can't use AC_REPLACE_FUNCS to replace these functions, because it
 # won't handle deployment target restrictions on macOS
@@ -2449,6 +2449,7 @@ AC_REPLACE_FUNCS(m4_normalize([
        strlcpy
        strnlen
        strtof
+       timingsafe_bcmp
 ]))
 
 if test "$enable_thread_safety" = yes; then
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 54de6844f58..be448f49978 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -216,6 +216,10 @@
    don't. */
 #undef HAVE_DECL_STRTOULL
 
+/* Define to 1 if you have the declaration of `timingsafe_bcmp', and to 0 if
+   you don't. */
+#undef HAVE_DECL_TIMINGSAFE_BCMP
+
 /* Define to 1 if you have the `dlopen' function. */
 #undef HAVE_DLOPEN
 
@@ -750,6 +754,9 @@
 /* Define to 1 if you have the <time.h> header file. */
 #undef HAVE_TIME_H
 
+/* Define to 1 if you have the `timingsafe_bcmp' function. */
+#undef HAVE_TIMINGSAFE_BCMP
+
 /* Define to 1 if your compiler understands `typeof' or something similar. */
 #undef HAVE_TYPEOF
 
diff --git a/src/include/port.h b/src/include/port.h
index 837e403c9d4..28d96d67313 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -505,6 +505,10 @@ extern int pqGethostbyname(const char *name,
                                                        struct hostent **result,
                                                        int *herrno);
 
+#if !HAVE_DECL_TIMINGSAFE_BCMP
+extern int     timingsafe_bcmp(const void *b1, const void *b2, size_t len);
+#endif
+
 extern void pg_qsort(void *base, size_t nel, size_t elsize,
                                         int (*cmp) (const void *, const void 
*));
 extern int     pg_qsort_strcmp(const void *a, const void *b);
diff --git a/src/port/timingsafe_bcmp.c b/src/port/timingsafe_bcmp.c
new file mode 100644
index 00000000000..288865f50d1
--- /dev/null
+++ b/src/port/timingsafe_bcmp.c
@@ -0,0 +1,43 @@
+/*
+ * src/port/timingsafe_bcmp.c
+ *
+ *     $OpenBSD: timingsafe_bcmp.c,v 1.3 2015/08/31 02:53:57 guenther Exp $
+ */
+
+/*
+ * Copyright (c) 2010 Damien Miller.  All rights reserved.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "c.h"
+
+#ifdef USE_SSL
+#include <openssl/crypto.h>
+#endif
+
+int
+timingsafe_bcmp(const void *b1, const void *b2, size_t n)
+{
+#ifdef USE_SSL
+       return CRYPTO_memcmp(b1, b2, n);
+#else
+       const unsigned char *p1 = b1,
+                          *p2 = b2;
+       int                     ret = 0;
+
+       for (; n > 0; n--)
+               ret |= *p1++ ^ *p2++;
+       return (ret != 0);
+#endif
+}
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index 3a9246e8578..dd207a3714a 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -114,7 +114,7 @@ sub mkvcbuild
          pread.c preadv.c pwrite.c pwritev.c pg_bitutils.c
          pg_strong_random.c pgcheckdir.c pgmkdirp.c pgsleep.c pgstrcasecmp.c
          pqsignal.c mkdtemp.c qsort.c qsort_arg.c bsearch_arg.c quotes.c 
system.c
-         strerror.c tar.c thread.c
+         strerror.c tar.c thread.c timingsafe_bcmp.c
          win32env.c win32error.c win32security.c win32setlocale.c win32stat.c);
 
        push(@pgportfiles, 'strtof.c') if ($vsVersion < '14.00');
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index e7af4162759..8d76035ed92 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -253,6 +253,7 @@ sub GenerateFiles
                HAVE_DECL_STRNLEN                           => 1,
                HAVE_DECL_STRTOLL                           => 1,
                HAVE_DECL_STRTOULL                          => 1,
+               HAVE_DECL_TIMINGSAFE_BCMP                   => 0,
                HAVE_DLOPEN                                 => undef,
                HAVE_EDITLINE_HISTORY_H                     => undef,
                HAVE_EDITLINE_READLINE_H                    => undef,
@@ -414,6 +415,7 @@ sub GenerateFiles
                HAVE_SYS_UIO_H                           => undef,
                HAVE_SYS_UN_H                            => undef,
                HAVE_TERMIOS_H                           => undef,
+               HAVE_TIMINGSAFE_BCMP                     => undef,
                HAVE_TYPEOF                              => undef,
                HAVE_UCRED_H                             => undef,
                HAVE_UINT64                              => undef,


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to