mirror of
https://github.com/postgres/postgres.git
synced 2025-06-27 23:21:58 +03:00
Move portal pinning from PL/pgSQL to SPI
PL/pgSQL "pins" internally generated (unnamed) portals so that user code cannot close them by guessing their names. This logic is also useful in other languages and really for any code. So move that logic into SPI. An unnamed portal obtained through SPI_cursor_open() and related functions is now automatically pinned, and SPI_cursor_close() automatically unpins a portal that is pinned. In the core distribution, this affects PL/Perl and PL/Python, preventing users from manually closing cursors created by spi_query and plpy.cursor, respectively. (PL/Tcl does not currently offer any cursor functionality.) Reviewed-by: Andrew Dunstan <andrew.dunstan@2ndquadrant.com>
This commit is contained in:
@ -1175,6 +1175,12 @@ SPI_cursor_open_internal(const char *name, SPIPlanPtr plan,
|
||||
{
|
||||
/* Use a random nonconflicting name */
|
||||
portal = CreateNewPortal();
|
||||
|
||||
/*
|
||||
* Make sure the portal doesn't get closed by the user statements we
|
||||
* execute.
|
||||
*/
|
||||
PinPortal(portal);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1413,6 +1419,9 @@ SPI_cursor_close(Portal portal)
|
||||
if (!PortalIsValid(portal))
|
||||
elog(ERROR, "invalid portal in SPI cursor operation");
|
||||
|
||||
if (portal->portalPinned)
|
||||
UnpinPortal(portal);
|
||||
|
||||
PortalDrop(portal, false);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user