summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rowley <drowley@postgresql.org>2023-04-20 10:34:46 +1200
committerDavid Rowley <drowley@postgresql.org>2023-04-20 10:34:46 +1200
commite35ded29566f679e52888a8d34468bb51bc78bed (patch)
treeb8a8119636e4e5e92cfc660287e5886c0d7eb8de
parent2584639653eec13726a25d6ea8a4b42153185723 (diff)
downloadpostgresql-e35ded29566f679e52888a8d34468bb51bc78bed.tar.gz
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
-rw-r--r--src/backend/nodes/list.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/backend/nodes/list.c b/src/backend/nodes/list.c
index a709d23ef1..750ee5a7e5 100644
--- a/src/backend/nodes/list.c
+++ b/src/backend/nodes/list.c
@@ -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));