Skip to content

Commit 77a41e7

Browse files
committed
Fix plpgsql to avoid reference to already-freed memory when returning a
pass-by-reference data type and the RETURN statement is within an EXCEPTION block. Bug introduced by my fix of 2007-01-28 to use per-subtransaction ExprContexts/EStates; since that wasn't back-patched into older branches, only 8.2 and HEAD are affected. Per report from Gary Winslow.
1 parent dfa5887 commit 77a41e7

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

src/pl/plpgsql/src/pl_exec.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.194 2007/04/16 17:21:23 tgl Exp $
11+
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.195 2007/04/19 16:33:24 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -987,6 +987,25 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block)
987987

988988
estate->err_text = gettext_noop("during statement block exit");
989989

990+
/*
991+
* If the block ended with RETURN, we may need to copy the return
992+
* value out of the subtransaction eval_context. This is currently
993+
* only needed for scalar result types --- rowtype values will
994+
* always exist in the function's own memory context.
995+
*/
996+
if (rc == PLPGSQL_RC_RETURN &&
997+
!estate->retisset &&
998+
!estate->retisnull &&
999+
estate->rettupdesc == NULL)
1000+
{
1001+
int16 resTypLen;
1002+
bool resTypByVal;
1003+
1004+
get_typlenbyval(estate->rettype, &resTypLen, &resTypByVal);
1005+
estate->retval = datumCopy(estate->retval,
1006+
resTypByVal, resTypLen);
1007+
}
1008+
9901009
/* Commit the inner transaction, return to outer xact context */
9911010
ReleaseCurrentSubTransaction();
9921011
MemoryContextSwitchTo(oldcontext);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy