diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2006-10-11 20:21:04 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2006-10-11 20:21:04 +0000 |
commit | 772c5ba31f31228d81444923ed630a89ff83056a (patch) | |
tree | 99940c1b9ed6399964c20a73fe4f9f09dbe0756b /src/backend/parser/parse_coerce.c | |
parent | 8f2f180ff10034494d947162d080363aab554cfa (diff) | |
download | postgresql-772c5ba31f31228d81444923ed630a89ff83056a.tar.gz postgresql-772c5ba31f31228d81444923ed630a89ff83056a.zip |
Repair incorrect check for coercion of unknown literal to ANYARRAY, a bug
I introduced in 7.4.1 :-(. It's correct to allow unknown to be coerced to
ANY or ANYELEMENT, since it's a real-enough data type, but it most certainly
isn't an array datatype. This can cause a backend crash but AFAICT is not
exploitable as a security hole. Per report from Michael Fuhr.
Note: as fixed in HEAD, this changes a constant in the pg_stats view,
resulting in a change in the expected regression outputs. The back-branch
patches have been hacked to avoid that, so that pre-existing installations
won't start failing their regression tests.
Diffstat (limited to 'src/backend/parser/parse_coerce.c')
-rw-r--r-- | src/backend/parser/parse_coerce.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index 9cfe4391bdc..39ae14ee1fa 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.144 2006/10/04 00:29:55 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.145 2006/10/11 20:21:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -129,11 +129,22 @@ coerce_type(ParseState *pstate, Node *node, return node; } if (targetTypeId == ANYOID || - targetTypeId == ANYARRAYOID || - targetTypeId == ANYELEMENTOID) + targetTypeId == ANYELEMENTOID || + (targetTypeId == ANYARRAYOID && inputTypeId != UNKNOWNOID)) { - /* assume can_coerce_type verified that implicit coercion is okay */ - /* NB: we do NOT want a RelabelType here */ + /* + * Assume can_coerce_type verified that implicit coercion is okay. + * + * Note: by returning the unmodified node here, we are saying that + * it's OK to treat an UNKNOWN constant as a valid input for a + * function accepting ANY or ANYELEMENT. This should be all right, + * since an UNKNOWN value is still a perfectly valid Datum. However + * an UNKNOWN value is definitely *not* an array, and so we mustn't + * accept it for ANYARRAY. (Instead, we will call anyarray_in below, + * which will produce an error.) + * + * NB: we do NOT want a RelabelType here. + */ return node; } if (inputTypeId == UNKNOWNOID && IsA(node, Const)) |