From: Bruce Momjian <bruce@momjian.us>
To: Thomas Munro <thomas.munro@gmail.com>
Cc: walther@technowledgy.de, Peter Eisentraut <peter@eisentraut.org>
Cc: Christophe Pettus <xof@thebuild.com>
Cc: Andrew Dunstan <andrew@dunslane.net>
Cc: PostgreSQL Bugs <pgsql-bugs@lists.postgresql.org>
Cc: Tom Lane <tgl@sss.pgh.pa.us>
Subject: Re: Regression tests fail with musl libc because libpq.so can't be loaded
Date: Thu, 21 Mar 2024 20:07:14 -0400
Message-ID: <ZfzLsiXbguTDatiZ@momjian.us> (raw)
In-Reply-To: <CA+hUKGJAkTZUa9JGr-zsadaqsN=K0P71t-1L2t2=MQFDMc4GuQ@mail.gmail.com>
References: <4093813.1710899588@sss.pgh.pa.us>
<CA+hUKGKNK5V8XwwJJZm36s3EUy8V51xu4XiE8=26n=Wq3OGd4A@mail.gmail.com>
<4095435.1710900216@sss.pgh.pa.us>
<CA+hUKGK2cSx3dveMqBD+E9N=zJ0WawBcbk_jnPqmdWBM0DT_3Q@mail.gmail.com>
<477fa513-6bf0-456d-8d24-1e22a19df671@technowledgy.de>
<ZfrmN4WHuJgD95fw@momjian.us>
<CA+hUKGJzC4rr2Yr=QZyx9W83Wv=TVJHndKF1anjNLNXVUM7TqQ@mail.gmail.com>
<f98cd8de-1c66-491a-8409-e62c09932080@technowledgy.de>
<36690fcf-f0c8-4d60-af49-6a7efa0e2b14@technowledgy.de>
<CA+hUKGJAkTZUa9JGr-zsadaqsN=K0P71t-1L2t2=MQFDMc4GuQ@mail.gmail.com>
On Fri, Mar 22, 2024 at 11:42:52AM +1300, Thomas Munro wrote:
> On Fri, Mar 22, 2024 at 9:30 AM <walther@technowledgy.de> wrote:
> > > 4. The upstream (musl) suggestion of which I sent a PoC was to "exec
> > > yourself with a bigger argv".
> >
> > We could do this in HEAD now ...
>
> Just a thought: if we want to go this way, do we need a new exec call?
> We already control the initial exec in pg_ctl.c.
>
> > > Could we even use the exec-approach as the fallback in all other cases
> > > except BSDs and Windows and get rid of PS_USE_NONE?
> >
> > ... and then remove PS_USE_NONE at the beginning of the v18 cycle.
> >
> > This would give a bit more time for those "other systems", which were
> > previously falling back PS_USE_NONE and would then clobber argv, too.
>
> RIght. It's unspecified by POSIX whether ps shows changes to those
> strings (and there are systems that don't), but it can't hurt to do so
> anyway, and it'd be better than having a PS_USE_NONE code path that is
> untested. I dimly recall that it turned out that PS_USE_NONE was
> actually broken for a while without anyone noticing.
Actually, I was thinking the opposite. Since the musl libc is widely
used, it will be tested, and I don't want to disable process display
updates for such a common platform.
I suggest we use the #ifdef test to continue our existing behavior for
the libraries we know about, like glibc, and use the LD_* process title
truncation hack for libc's we don't recognize.
Attached is a prototype patch which implements this based on previous
patches.
--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com
Only you can decide what is important to you.
Attachments:proctitle.diff (text/x-diff, 1.2K) downloaddiff --git a/src/backend/utils/misc/ps_status.c b/src/backend/utils/misc/ps_status.cindex 5d829e6e483..154862f9fb0 100644--- a/src/backend/utils/misc/ps_status.c+++ b/src/backend/utils/misc/ps_status.c@@ -151,7 +151,32 @@ save_ps_display_args(int argc, char **argv)
for (i = 0; environ[i] != NULL; i++)
{
if (end_of_area + 1 == environ[i])
- end_of_area = environ[i] + strlen(environ[i]);+ {++ /* Do this for Linux libc libraries that might be unsafe. */+#if ! defined(__linux__) || (! defined(__GLIBC__) && defined(__UCLIBC__ ))+ /*+ * If we see variables that the musl runtime linker is known+ * to stash pointers to, give up so we don't break later calls+ * to dlopen().+ */+ if (strstr(environ[i], "LD_LIBRARY_PATH=") == environ[i] ||+ strstr(environ[i], "LD_PRELOAD=") == environ[i])+ {+ /*+ * We can overwrite the name, but stop at the equals sign.+ * Future loops will not find contiguous space, but we+ * don't break early because we want to count the total+ * number.+ */+ end_of_area = strchr(environ[i], '=');+ }+ else+#endif+ {+ end_of_area = environ[i] + strlen(environ[i]);+ }+ }
}
ps_buffer = argv[0];
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-bugs@postgresql.org
Cc: bruce@momjian.us, thomas.munro@gmail.com, peter@eisentraut.org, xof@thebuild.com, andrew@dunslane.net, pgsql-bugs@lists.postgresql.org, tgl@sss.pgh.pa.us
Subject: Re: Regression tests fail with musl libc because libpq.so can't be loaded
In-Reply-To: <ZfzLsiXbguTDatiZ@momjian.us>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox