Re: PL/Python: Fix return in the middle of PG_TRY() block.

Nathan Bossart <nathandbossart@gmail.com>

From: Nathan Bossart <nathandbossart@gmail.com>
To: Xing Guo <higuoxing@gmail.com>
Cc: pgsql-hackers@postgresql.org
Date: 2023-01-12T18:44:33Z
Lists: pgsql-hackers
On Thu, Jan 12, 2023 at 11:19:29PM +0800, Xing Guo wrote:
> I was running static analyser against PostgreSQL and found there're 2
> return statements in PL/Python module which is not safe. Patch is
> attached.

Is the problem that PG_exception_stack and error_context_stack aren't
properly reset?

> @@ -690,12 +690,12 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r
>  	PyObject   *volatile pltdata = NULL;
>  	char	   *stroid;
>  
> +	pltdata = PyDict_New();
> +	if (!pltdata)
> +		return NULL;
> +
>  	PG_TRY();
>  	{
> -		pltdata = PyDict_New();
> -		if (!pltdata)
> -			return NULL;
> -
>  		pltname = PLyUnicode_FromString(tdata->tg_trigger->tgname);
>  		PyDict_SetItemString(pltdata, "name", pltname);
>  		Py_DECREF(pltname);

There's another "return" later on in this PG_TRY block.  I wonder if it's
possible to detect this sort of thing at compile time.

-- 
Nathan Bossart
Amazon Web Services: https://aws.amazon.com



Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Move return statements out of PG_TRY blocks.