diff options
author | Michael Paquier | 2020-08-18 03:24:22 +0000 |
---|---|---|
committer | Michael Paquier | 2020-08-18 03:24:22 +0000 |
commit | 51300b45db95b6fd29f88534ab0739fdc9df1699 (patch) | |
tree | f258992efe2fa7e05becb39673fed19999c922b1 | |
parent | adbe62d04b360bbd408d97e447932d8078485972 (diff) |
Fix use-after-release issue in PL/Sample
Introduced in adbe62d0. Per buildfarm member prion, when using
RELCACHE_FORCE_RELEASE.
-rw-r--r-- | src/test/modules/plsample/plsample.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/test/modules/plsample/plsample.c b/src/test/modules/plsample/plsample.c index 40836690669..80faef506b1 100644 --- a/src/test/modules/plsample/plsample.c +++ b/src/test/modules/plsample/plsample.c @@ -97,6 +97,7 @@ plsample_func_handler(PG_FUNCTION_ARGS) char *proname; Form_pg_type pg_type_entry; Oid result_typioparam; + Oid prorettype; FmgrInfo result_in_func; int numargs; @@ -117,7 +118,6 @@ plsample_func_handler(PG_FUNCTION_ARGS) if (isnull) elog(ERROR, "could not find source text of function \"%s\"", proname); - ReleaseSysCache(pl_tuple); source = DatumGetCString(DirectFunctionCall1(textout, ret)); ereport(NOTICE, (errmsg("source text of function \"%s\": %s", @@ -157,6 +157,10 @@ plsample_func_handler(PG_FUNCTION_ARGS) i, argnames[i], value))); } + /* Type of the result */ + prorettype = pl_struct->prorettype; + ReleaseSysCache(pl_tuple); + /* * Get the required information for input conversion of the return value. * @@ -165,13 +169,13 @@ plsample_func_handler(PG_FUNCTION_ARGS) * we can do here. This returns NULL except if the result type is text, * where the result is the source text of the function. */ - if (pl_struct->prorettype != TEXTOID) + if (prorettype != TEXTOID) PG_RETURN_NULL(); type_tuple = SearchSysCache1(TYPEOID, - ObjectIdGetDatum(pl_struct->prorettype)); + ObjectIdGetDatum(prorettype)); if (!HeapTupleIsValid(type_tuple)) - elog(ERROR, "cache lookup failed for type %u", pl_struct->prorettype); + elog(ERROR, "cache lookup failed for type %u", prorettype); pg_type_entry = (Form_pg_type) GETSTRUCT(type_tuple); result_typioparam = getTypeIOParam(type_tuple); |