postgres.git / summary / log / commit / refs

commit    5de77b609cbeffcb0b9a570f3848c60bc99ca7fa
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Sun Oct 06 20:03:48 2024 +0000
First released in: 18.0, 12.21, 13.17, 14.14, 15.9, 16.5, 17.1

    Ignore not-yet-defined Portals in pg_cursors view.
    
    pg_cursor() supposed that any Portal it finds in the hash table must
    have sourceText set up, but there's an edge case where that is not so.
    A newly-created Portal has sourceText = NULL, and that doesn't change
    until PortalDefineQuery is called.  In SPI_cursor_open_internal,
    we perform GetCachedPlan between CreatePortal and PortalDefineQuery,
    and it's possible for user-defined code to execute during that
    planning and cause a fetch from the pg_cursors view, resulting in a
    null-pointer-dereference crash.  (It looks like the same could happen
    in exec_bind_message, but I've not tried to provoke a failure there.)
    
    I considered trying to fix this by setting sourceText sooner, but
    there may be instances of this same calling pattern in extensions,
    and we couldn't be sure they'd get the memo promptly.  It seems
    better to redefine pg_cursor as not showing Portals that have
    not yet had PortalDefineQuery called on them, which we can do by
    just skipping them if sourceText is still NULL.
    
    (Before a1c692358, pg_cursor would instead return a row with NULL
    in the statement column.  We could revert to that behavior but it
    doesn't really seem like a better definition, especially since our
    documentation doesn't suggest that the column could be NULL.)
    
    Per report from PetSerAl.  Back-patch to all supported branches.
    
    Discussion: https://postgr.es/m/CAKygsHTBXLXjwV43kpZa+Cs+XTiaeeJiZdL4cPBm9f4MTdw7wg@mail.gmail.com


src/backend/utils/mmgr/portalmem.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index 06dfa85f04d..fa5123a2ed1 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -1151,6 +1151,9 @@ pg_cursor(PG_FUNCTION_ARGS) /* report only "visible" entries */ if (!portal->visible) continue; + /* also ignore it if PortalDefineQuery hasn't been called yet */ + if (!portal->sourceText) + continue; values[0] = CStringGetTextDatum(portal->name); values[1] = CStringGetTextDatum(portal->sourceText); [parent: ce17de580f90]