Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Make EXEC_BACKEND more convenient on Linux and FreeBSD.
authorMichael Paquier <michael@paquier.xyz>
Wed, 8 Feb 2023 04:09:49 +0000 (13:09 +0900)
committerMichael Paquier <michael@paquier.xyz>
Wed, 8 Feb 2023 04:09:49 +0000 (13:09 +0900)
Try to disable ASLR when building in EXEC_BACKEND mode, to avoid random
memory mapping failures while testing.  For developer use only, no
effect on regular builds.

This has been originally applied as of f3e7806 for v15~, but
recently-added buildfarm member gokiburi tests this configuration on
older branches as well, causing it to fail randomly as ASLR would be
enabled.

Suggested-by: Andres Freund <andres@anarazel.de>
Tested-by: Bossart, Nathan <bossartn@amazon.com>
Discussion: https://postgr.es/m/20210806032944.m4tz7j2w47mant26%40alap3.anarazel.de
Backpatch-through: 12

configure
configure.in
src/bin/pg_ctl/pg_ctl.c
src/common/exec.c
src/include/pg_config.h.in
src/include/port.h
src/test/regress/pg_regress.c
src/tools/msvc/Solution.pm

index d2db555e9e7a8895b85cdda8e506582256bc34aa..19a991aeca7598e89fa5ab8bcbc9b851a41c848c 100755 (executable)
--- a/configure
+++ b/configure
@@ -13363,7 +13363,7 @@ $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
 fi
 
 
-for ac_header in atomic.h copyfile.h execinfo.h getopt.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h wctype.h
+for ac_header in atomic.h copyfile.h execinfo.h getopt.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/personality.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
index 31b4e2b08c8a8969c911a38a11093539c1668d92..3e2767ae52ee5691fb4c294e8f2e5f4e67991529 100644 (file)
@@ -1377,6 +1377,7 @@ AC_CHECK_HEADERS(m4_normalize([
    sys/epoll.h
    sys/event.h
    sys/ipc.h
+   sys/personality.h
    sys/prctl.h
    sys/procctl.h
    sys/pstat.h
index 8ab9ecb78f625841335044179ae5bab33ae1b0d3..01b815d4a0768cdab13df3663376460d341e520c 100644 (file)
@@ -453,6 +453,10 @@ start_postmaster(void)
    fflush(stdout);
    fflush(stderr);
 
+#ifdef EXEC_BACKEND
+   pg_disable_aslr();
+#endif
+
    pm_pid = fork();
    if (pm_pid < 0)
    {
index 8f1147b68a0535edf667397fc82d9955e4c9077a..7f0142fb475102f45e0dfc3cd34cd1b27a72213a 100644 (file)
 #include <sys/wait.h>
 #include <unistd.h>
 
+#ifdef EXEC_BACKEND
+#if defined(HAVE_SYS_PERSONALITY_H)
+#include <sys/personality.h>
+#elif defined(HAVE_SYS_PROCCTL_H)
+#include <sys/procctl.h>
+#endif
+#endif
+
 /* Inhibit mingw CRT's auto-globbing of command line arguments */
 #if defined(WIN32) && !defined(_MSC_VER)
 extern int _CRT_glob = 0; /* 0 turns off globbing; 1 turns it on */
@@ -492,6 +500,31 @@ set_pglocale_pgservice(const char *argv0, const char *app)
    }
 }
 
+#ifdef EXEC_BACKEND
+/*
+ * For the benefit of PostgreSQL developers testing EXEC_BACKEND on Unix
+ * systems (code paths normally exercised only on Windows), provide a way to
+ * disable address space layout randomization, if we know how on this platform.
+ * Otherwise, backends may fail to attach to shared memory at the fixed address
+ * chosen by the postmaster.  (See also the macOS-specific hack in
+ * sysv_shmem.c.)
+ */
+int
+pg_disable_aslr(void)
+{
+#if defined(HAVE_SYS_PERSONALITY_H)
+   return personality(ADDR_NO_RANDOMIZE);
+#elif defined(HAVE_SYS_PROCCTL_H) && defined(PROC_ASLR_FORCE_DISABLE)
+   int         data = PROC_ASLR_FORCE_DISABLE;
+
+   return procctl(P_PID, 0, PROC_ASLR_CTL, &data);
+#else
+   errno = ENOSYS;
+   return -1;
+#endif
+}
+#endif
+
 #ifdef WIN32
 
 /*
index 2711c2ce9bd8205009a911ee4213d2d7b175efa0..2cd221b85a0143f2381453bac23f6e48b3b235b9 100644 (file)
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 #undef HAVE_SYS_IPC_H
 
+/* Define to 1 if you have the <sys/personality.h> header file. */
+#undef HAVE_SYS_PERSONALITY_H
+
 /* Define to 1 if you have the <sys/prctl.h> header file. */
 #undef HAVE_SYS_PRCTL_H
 
index 0c3c8d14e76b557f325e0d6640e9173bf65c1159..70b193657e430f8c3bcd4a42ae86d84efe1bed26 100644 (file)
@@ -115,6 +115,11 @@ extern char *pipe_read_line(char *cmd, char *line, int maxsize);
 /* Doesn't belong here, but this is used with find_other_exec(), so... */
 #define PG_BACKEND_VERSIONSTR "postgres (PostgreSQL) " PG_VERSION "\n"
 
+#ifdef EXEC_BACKEND
+/* Disable ASLR before exec, for developer builds only (in exec.c) */
+extern int pg_disable_aslr(void);
+#endif
+
 
 #if defined(WIN32) || defined(__CYGWIN__)
 #define EXE ".exe"
index 25683a78413151c7e2e2efa3614a10c3fbc3edc7..36cc1707bfa6b939f24fb70a2c580697c9df955c 100644 (file)
@@ -1191,6 +1191,10 @@ spawn_process(const char *cmdline)
    if (logfile)
        fflush(logfile);
 
+#ifdef EXEC_BACKEND
+   pg_disable_aslr();
+#endif
+
    pid = fork();
    if (pid == -1)
    {
index 243d0b64fd0009c11d6ad022c7a4a05c5090d210..4147e8ad2604bf6da5d97ad5ebd67c3850ea93bf 100644 (file)
@@ -380,6 +380,7 @@ sub GenerateFiles
        HAVE_SYS_EPOLL_H                         => undef,
        HAVE_SYS_EVENT_H                         => undef,
        HAVE_SYS_IPC_H                           => undef,
+       HAVE_SYS_PERSONALITY_H                   => undef,
        HAVE_SYS_PRCTL_H                         => undef,
        HAVE_SYS_PROCCTL_H                       => undef,
        HAVE_SYS_PSTAT_H                         => undef,