postgres.git / summary / log / commit / refs

commit    925e10dc57cdf0efb7268a65b411f1e58ac5116d
Author:   Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date:     Fri Oct 03 09:07:10 2014 +0000

    Check for GiST index tuples that don't fit on a page.
    
    The page splitting code would go into infinite recursion if you try to
    insert an index tuple that doesn't fit even on an empty page.
    
    Per analysis and suggested fix by Andrew Gierth. Fixes bug #11555, reported
    by Bryan Seitz (analysis happened over IRC). Backpatch to all supported
    versions.


src/backend/access/gist/gist.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index e6f06c29e51..8bf290257ff 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -1265,6 +1265,23 @@ gistSplit(Relation r, int i; SplitedPageLayout *res = NULL; + /* this should never recurse very deeply, but better safe than sorry */ + check_stack_depth(); + + /* there's no point in splitting an empty page */ + Assert(len > 0); + + /* + * If a single tuple doesn't fit on a page, no amount of splitting will + * help. + */ + if (len == 1) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("index row size %zu exceeds maximum %zu for index \"%s\"", + IndexTupleSize(itup[0]), GiSTPageSize, + RelationGetRelationName(r)))); + memset(v.spl_lisnull, TRUE, sizeof(bool) * giststate->tupdesc->natts); memset(v.spl_risnull, TRUE, sizeof(bool) * giststate->tupdesc->natts); gistSplitByKey(r, page, itup, len, giststate, &v, 0); [parent: 80f9a368be91]