pgsql: Teach flatten_reloptions() to quote option values safely. - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Teach flatten_reloptions() to quote option values safely.
Date
Msg-id E1aF6J7-0001Bw-E4@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Teach flatten_reloptions() to quote option values safely.

flatten_reloptions() supposed that it didn't really need to do anything
beyond inserting commas between reloption array elements.  However, in
principle the value of a reloption could be nearly anything, since the
grammar allows a quoted string there.  Any restrictions on it would come
from validity checking appropriate to the particular option, if any.

A reloption value that isn't a simple identifier or number could thus lead
to dump/reload failures due to syntax errors in CREATE statements issued
by pg_dump.  We've gotten away with not worrying about this so far with
the core-supported reloptions, but extensions might allow reloption values
that cause trouble, as in bug #13840 from Kouhei Sutou.

To fix, split the reloption array elements explicitly, and then convert
any value that doesn't look like a safe identifier to a string literal.
(The details of the quoting rule could be debated, but this way is safe
and requires little code.)  While we're at it, also quote reloption names
if they're not safe identifiers; that may not be a likely problem in the
field, but we might as well try to be bulletproof here.

It's been like this for a long time, so back-patch to all supported
branches.

Kouhei Sutou, adjusted some by me

Branch
------
REL9_5_STABLE

Details
-------
http://git.postgresql.org/pg/commitdiff/404c45bac64d312033dcf0373f7b1c0133b03afc

Modified Files
--------------
src/backend/utils/adt/ruleutils.c |   63 ++++++++++++++++++++++++++++++-------
1 file changed, 52 insertions(+), 11 deletions(-)


pgsql-committers by date:

Previous
From: Tom Lane
Date:
Subject: pgsql: Teach flatten_reloptions() to quote option values safely.
Next
From: Noah Misch
Date:
Subject: pgsql: Cover heap_page_prune_opt()'s cleanup lock tactic in README.