Skip to content

Commit 6f96bb5

Browse files
committed
Prevent use after free in flatten_join_alias_var_optimizer function
This patch prevents several use after free bugs present in flatten_join_alias_var_optimizer. Specifically, the function uses flatten_join_alias_vars function multiple times, and assumes that the original node can be freed immediately after. This is not always the case since under some circumstances flatten_join_alias_vars does not modify its input and simply passes it through without copying. This patch adds conditions to check if the original node can safely be freed, preventing use after free.
1 parent 6e33101 commit 6f96bb5

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

src/backend/optimizer/util/clauses.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5528,35 +5528,41 @@ flatten_join_alias_var_optimizer(Query *query, int queryLevel)
55285528
if (NIL != targetList)
55295529
{
55305530
queryNew->targetList = (List *) flatten_join_alias_vars(queryNew, (Node *) targetList);
5531-
list_free(targetList);
5531+
/* We can free the old list only if it was replaced */
5532+
if (targetList != queryNew->targetList)
5533+
list_free(targetList);
55325534
}
55335535

55345536
List * returningList = queryNew->returningList;
55355537
if (NIL != returningList)
55365538
{
55375539
queryNew->returningList = (List *) flatten_join_alias_vars(queryNew, (Node *) returningList);
5538-
list_free(returningList);
5540+
if (returningList != queryNew->returningList)
5541+
list_free(returningList);
55395542
}
55405543

55415544
Node *havingQual = queryNew->havingQual;
55425545
if (NULL != havingQual)
55435546
{
55445547
queryNew->havingQual = flatten_join_alias_vars(queryNew, havingQual);
5545-
pfree(havingQual);
5548+
if (havingQual != queryNew->havingQual)
5549+
pfree(havingQual);
55465550
}
55475551

55485552
List *scatterClause = queryNew->scatterClause;
55495553
if (NIL != scatterClause)
55505554
{
55515555
queryNew->scatterClause = (List *) flatten_join_alias_vars(queryNew, (Node *) scatterClause);
5552-
list_free(scatterClause);
5556+
if (scatterClause != queryNew->scatterClause)
5557+
list_free(scatterClause);
55535558
}
55545559

55555560
Node *limitOffset = queryNew->limitOffset;
55565561
if (NULL != limitOffset)
55575562
{
55585563
queryNew->limitOffset = flatten_join_alias_vars(queryNew, limitOffset);
5559-
pfree(limitOffset);
5564+
if (limitOffset != queryNew->limitOffset)
5565+
pfree(limitOffset);
55605566
}
55615567

55625568
List *windowClause = queryNew->windowClause;
@@ -5583,7 +5589,8 @@ flatten_join_alias_var_optimizer(Query *query, int queryLevel)
55835589
if (NULL != limitCount)
55845590
{
55855591
queryNew->limitCount = flatten_join_alias_vars(queryNew, limitCount);
5586-
pfree(limitCount);
5592+
if (limitCount != queryNew->limitCount)
5593+
pfree(limitCount);
55875594
}
55885595

55895596
return queryNew;

0 commit comments

Comments
 (0)