Re: ExecAppendAsyncEventWait() in REL_14_STABLE can corrupt PG_exception_stack

Etsuro Fujita <etsuro.fujita@gmail.com>

From: Etsuro Fujita <etsuro.fujita@gmail.com>
To: Michael Paquier <michael@paquier.xyz>
Cc: Alexander Pyhalov <a.pyhalov@postgrespro.ru>, Pgsql Hackers <pgsql-hackers@postgresql.org>
Date: 2024-03-21T10:59:50Z
Lists: pgsql-hackers

Attachments

On Sun, Feb 25, 2024 at 6:34 PM Etsuro Fujita <etsuro.fujita@gmail.com> wrote:

> > On Fri, Feb 23, 2024 at 01:21:14PM +0300, Alexander Pyhalov wrote:
> > > Recent commit 555276f8594087ba15e0d58e38cd2186b9f39f6d introduced final
> > > cleanup of node->as_eventset in ExecAppendAsyncEventWait().
> > > Unfortunately, now this function can return in the middle of TRY/FINALLY
> > > block, without restoring PG_exception_stack.
> > >
> > > We found this while working on our FDW. Unfortunately, I couldn't reproduce
> > > the issue with postgres_fdw, but it seems it is also affected.
>
> I think this would happen when FDWs configure no events; IIRC I think
> while the core allows them to do so, postgres_fdw does not do so, so
> this would never happen with it.

I was wrong; as you pointed out, this would affect postgres_fdw as
well.  See commit 1ec7fca85, which is my commit, but I forgot it
completely.  :-(

As I said before, the patch looks good to me.  I tweaked comments in
ExecAppendAsyncEventWait() a bit.  Attached is an updated patch.  In
the patch I also fixed a confusing comment in a related function in
postgres_fdw.c about handling of the in-process request that might be
useless to process.

Sorry, it took more time than expected to get back to this thread.

Best regards,
Etsuro Fujita

Commits

  1. Fix bogus coding in ExecAppendAsyncEventWait().

  2. Fix resource leak when a FDW's ForeignAsyncRequest function fails

  3. postgres_fdw: Fix handling of pending asynchronous requests.

  4. Add support for asynchronous execution.