]> granicus.if.org Git - postgresql/commitdiff
Check get_tle_by_resno() result before deref
authorStephen Frost <sfrost@snowman.net>
Mon, 15 Jul 2013 18:53:17 +0000 (14:53 -0400)
committerStephen Frost <sfrost@snowman.net>
Mon, 15 Jul 2013 19:04:19 +0000 (15:04 -0400)
When creating a sort to support a group by, we need to look up the
target entry in the target list by the resno using get_tle_by_resno().
This particular code-path didn't check the result prior to attempting
to dereference it, while all other callers did.  While I can't see a
way for this usage of get_tle_by_resno() to fail (you can't ask for
a column to be sorted on which isn't included in the group by), it's
probably best to check that we didn't end up with a NULL somehow
anyway than risk the segfault.

I'm willing to back-patch this if others feel it's necessary, but my
guess is new features are what might tickle this rather than anything
existing.

Missing check spotted by the Coverity scanner.

src/backend/optimizer/plan/createplan.c

index 52bab79007e66d80205a07da08bc4437c424232c..2560e9cbc1ee47134ad7d5fcc58324d1e1eec913 100644 (file)
@@ -4188,6 +4188,9 @@ make_sort_from_groupcols(PlannerInfo *root,
                SortGroupClause *grpcl = (SortGroupClause *) lfirst(l);
                TargetEntry *tle = get_tle_by_resno(sub_tlist, grpColIdx[numsortkeys]);
 
+               if (!tle)
+                       elog(ERROR, "could not retrive tle for sort-from-groupcols");
+
                sortColIdx[numsortkeys] = tle->resno;
                sortOperators[numsortkeys] = grpcl->sortop;
                collations[numsortkeys] = exprCollation((Node *) tle->expr);