Make plperl safe against functions that are redefined while running.

Tom Lane <tgl@sss.pgh.pa.us>

Commit: ef06dca97504cda3cff852314532338c86d3ccc5
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: 2012-09-10T00:33:03Z
Releases: 9.1.6
Make plperl safe against functions that are redefined while running.

validate_plperl_function() supposed that it could free an old
plperl_proc_desc struct immediately upon detecting that it was stale.
However, if a plperl function is called recursively, this could result
in deleting the struct out from under an outer invocation, leading to
misbehavior or crashes.  Add a simple reference-count mechanism to
ensure that such structs are freed only when the last reference goes
away.

Per investigation of bug #7516 from Marko Tiikkaja.  I am not certain
that this error explains his report, because he says he didn't have
any recursive calls --- but it's hard to see how else it could have
crashed right there.  In any case, this definitely fixes some problems
in the area.

Back-patch to all active branches.

Files

PathChange+/−
src/pl/plperl/expected/plperl.out modified +18 −0
src/pl/plperl/plperl.c modified +71 −33
src/pl/plperl/sql/plperl.sql modified +10 −0