Re: AtAbort_Portsl problem

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: AtAbort_Portsl problem
Дата
Msg-id 17632.1263780636@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: AtAbort_Portsl problem  (Tatsuo Ishii <ishii@postgresql.org>)
Список pgsql-hackers
Tatsuo Ishii <ishii@postgresql.org> writes:
> The patch addresses the original issue.  The reason why you didn't see
> crash was just you were lucky, I believe. I'm sure that your
> exec_execute_message looks into already-freed-memory.

[ shrug... ]  If it did, it would have crashed, because I invariably
build with --cassert-enabled -> CLOBBER_FREED_MEMORY.

I do now see the risk path you are talking about, I think:

1. bind to some fully_planned prepared statement, causing the Portal  to link directly to a CachedPlan's statement
list;
2. invalidate the prepared statement, so that the CachedPlanSource  drops its reference to the CachedPlan;
3. AbortTransaction, so that AtAbort_Portals runs  PortalReleaseCachedPlan.  This makes the CachedPlan's reference
countgo to zero, so it drops its memory.  Now the Portal's  stmts pointer is dangling;
 
4. try to execute the Portal.

I do not believe it's possible to make this happen through libpq
alone, at least not without a great deal more hacking than you
did on it.  libpq doesn't ever put very much in between binding
a portal and executing it.  But a non-libpq-based client could
easily do it if it intermixed binding and executing a few different
portals.  Also step 2 might happen unluckily through a SI reset
triggered by some concurrent session.

I don't like the proposed patch though since it closes only one of
the paths by which a Portal might drop its reference to a CachedPlan.
I think the right place to clear portal->stmts is in
PortalReleaseCachedPlan.
        regards, tom lane


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: is this a bug?
Следующее
От: Greg Stark
Дата:
Сообщение: Re: Bloom index