Thread
-
BUG #19092: scram_free() will free on address which was not malloc()-ed in pg_scram_mech
PG Bug reporting form <noreply@postgresql.org> — 2025-10-21T07:43:58Z
The following bug has been logged on the website: Bug reference: 19092 Logged by: NJUEEXRM Email address: 13952878799@163.com PostgreSQL version: 17.0 Operating system: MacOS 12.7.6 Description: The issue is about the only implementation of pg_fe_sasl_mech interface: pg_scram_mech. In the init func of pg_scram_mech, the variable state->password is assigned by variable prep_password, which is prepared in function pg_saslprep(). However, pg_saslprep() will use palloc/pfree or malloc/free determined by FRONTEND marco。If we are in backend env,the prep_password will be palloc-ed in CurrentMemoryContext. The problem is state->password will be released by free() in the free func of pg_scram_mech: scram_free, and will cause 'free on address which was not malloc()-ed' error. This issue occurred when I was attempting to make a connection to Backend via libpq interfaces in Backend itself.
-
Re: BUG #19092: scram_free() will free on address which was not malloc()-ed in pg_scram_mech
Daniel Gustafsson <daniel@yesql.se> — 2025-10-21T13:14:08Z
> On 21 Oct 2025, at 09:43, PG Bug reporting form <noreply@postgresql.org> wrote: > The issue is about the only implementation of pg_fe_sasl_mech interface: > pg_scram_mech. In the init func of pg_scram_mech, the variable > state->password is assigned by variable prep_password, which is prepared in > function pg_saslprep(). However, pg_saslprep() will use palloc/pfree or > malloc/free determined by FRONTEND marco。If we are in backend env,the > prep_password will be palloc-ed in CurrentMemoryContext. The problem is > state->password will be released by free() in the free func of > pg_scram_mech: scram_free, and will cause 'free on address which was not > malloc()-ed' error. Mixing frontend and backend code like that seems to register somewhere on the "break it and you get to keep both pieces" scale. > This issue occurred when I was attempting to make a connection to Backend > via libpq interfaces in Backend itself. You tried to open a new database connection from a backend by embedding a libpq client into the backend? Which problem are you trying to solve, maybe there is an easier way? -- Daniel Gustafsson
-
Re: BUG #19092: scram_free() will free on address which was not malloc()-ed in pg_scram_mech
Tom Lane <tgl@sss.pgh.pa.us> — 2025-10-21T15:06:19Z
Daniel Gustafsson <daniel@yesql.se> writes: >> On 21 Oct 2025, at 09:43, PG Bug reporting form <noreply@postgresql.org> wrote: >> The issue is about the only implementation of pg_fe_sasl_mech interface: >> pg_scram_mech. In the init func of pg_scram_mech, the variable >> state->password is assigned by variable prep_password, which is prepared in >> function pg_saslprep(). However, pg_saslprep() will use palloc/pfree or >> malloc/free determined by FRONTEND > Mixing frontend and backend code like that seems to register somewhere on the > "break it and you get to keep both pieces" scale. We'd really need to see a concrete example to decide whether this is a PG bug or user error. I think the SASL stuff is sufficiently poorly tested that it could be a previously-unknown PG bug, but it's not clear. So: test case, please. >> This issue occurred when I was attempting to make a connection to Backend >> via libpq interfaces in Backend itself. > You tried to open a new database connection from a backend by embedding a libpq > client into the backend? postgres_fdw and dblink both do that. The operation is ticklish enough that we've developed some common infrastructure, which maybe you should be using: see src/include/libpq/libpq-be-fe.h and src/include/libpq/libpq-be-fe-helpers.h. regards, tom lane
-
Re: BUG #19092: scram_free() will free on address which was not malloc()-ed in pg_scram_mech
Michael Paquier <michael@paquier.xyz> — 2025-10-23T00:29:19Z
On Tue, Oct 21, 2025 at 11:06:19AM -0400, Tom Lane wrote: > We'd really need to see a concrete example to decide whether this is > a PG bug or user error. I think the SASL stuff is sufficiently poorly > tested that it could be a previously-unknown PG bug, but it's not clear. [ .. double-checking the code .. ] FWIW, I doubt that this is something we need to worry about and I suspect that there is no action item here. dblink and WAL receivers do their stuff so as the main backend code does not link with libpq, and I doubt that we'd ever want to enter in the territory where FRONTEND becomes a thing in libpq. Of course, I may prove wrong. > So: test case, please. Yes. -- Michael
-
Re: BUG #19092: scram_free() will free on address which was not malloc()-ed in pg_scram_mech
Jacob Champion <jacob.champion@enterprisedb.com> — 2025-10-23T15:05:14Z
On Wed, Oct 22, 2025 at 5:29 PM Michael Paquier <michael@paquier.xyz> wrote: > > So: test case, please. > > Yes. Thirded. The only thing I can think of at the moment -- which a test case would quickly prove or disprove -- is that the symbol visibility is messed up for this particular build in some way, and libpq's pg_saslprep has been incorrectly preempted by postgres' pg_saslprep. But I can't reproduce anything like that with my local macOS build. --Jacob