Fix list_copy_head() with empty Lists

list_copy_head() given an empty List would crash from trying to
dereference the List to obtain its length.  Since NIL is how we represent
an empty List, we should just be returning another empty List in this
case.

list_copy_head() is new to v16, so let's fix it now before too many people
start coding around the buggy NIL behavior.

Reported-by: Miroslav Bendik
Discussion: https://postgr.es/m/CAPoEpV02WhawuWnmnKet6BqU63bEu7oec0pJc=nKMtPsHMzTXQ@mail.gmail.com
This commit is contained in:
David Rowley 2023-04-20 10:34:46 +12:00
parent 2584639653
commit e35ded2956

View File

@ -1593,11 +1593,11 @@ list_copy_head(const List *oldlist, int len)
{
List *newlist;
len = Min(oldlist->length, len);
if (len <= 0)
if (oldlist == NIL || len <= 0)
return NIL;
len = Min(oldlist->length, len);
newlist = new_list(oldlist->type, len);
memcpy(newlist->elements, oldlist->elements, len * sizeof(ListCell));