Switch order of tests to avoid possible Assert failure for

"array_agg_finalfn(null)".  We should modify pg_proc entries to prevent this
query from being accepted, but let's just make the function itself secure too.
Per my note of today.
This commit is contained in:
Tom Lane 2009-06-09 18:15:04 +00:00
parent f3e122fcdf
commit 59fb29cac6

View File

@ -6,7 +6,7 @@
* Copyright (c) 2003-2009, PostgreSQL Global Development Group * Copyright (c) 2003-2009, PostgreSQL Global Development Group
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/array_userfuncs.c,v 1.28 2009/01/01 17:23:48 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/array_userfuncs.c,v 1.29 2009/06/09 18:15:04 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -520,14 +520,19 @@ array_agg_finalfn(PG_FUNCTION_ARGS)
int dims[1]; int dims[1];
int lbs[1]; int lbs[1];
/*
* Test for null before Asserting we are in right context. This is
* to avoid possible Assert failure in 8.4beta installations, where
* it is possible for users to create NULL constants of type internal.
*/
if (PG_ARGISNULL(0))
PG_RETURN_NULL(); /* returns null iff no input values */
/* cannot be called directly because of internal-type argument */ /* cannot be called directly because of internal-type argument */
Assert(fcinfo->context && Assert(fcinfo->context &&
(IsA(fcinfo->context, AggState) || (IsA(fcinfo->context, AggState) ||
IsA(fcinfo->context, WindowAggState))); IsA(fcinfo->context, WindowAggState)));
if (PG_ARGISNULL(0))
PG_RETURN_NULL(); /* returns null iff no input values */
state = (ArrayBuildState *) PG_GETARG_POINTER(0); state = (ArrayBuildState *) PG_GETARG_POINTER(0);
dims[0] = state->nelems; dims[0] = state->nelems;