]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-40020: Fix realloc leak on failure in growable_comment_array_add (GH-19083)
authorAlexander Riccio <test35965@gmail.com>
Mon, 30 Mar 2020 21:15:59 +0000 (17:15 -0400)
committerGitHub <noreply@github.com>
Mon, 30 Mar 2020 21:15:59 +0000 (23:15 +0200)
Fix a leak and subsequent crash in parsetok.c caused by realloc misuse on a rare codepath.

Realloc returns a null pointer on failure, and then growable_comment_array_deallocate crashes later when it dereferences it.

Misc/NEWS.d/next/Core and Builtins/2020-03-19-21-53-41.bpo-40020.n-26G7.rst [new file with mode: 0644]
Parser/parsetok.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-03-19-21-53-41.bpo-40020.n-26G7.rst b/Misc/NEWS.d/next/Core and Builtins/2020-03-19-21-53-41.bpo-40020.n-26G7.rst
new file mode 100644 (file)
index 0000000..948404b
--- /dev/null
@@ -0,0 +1 @@
+Fix a leak and subsequent crash in parsetok.c caused by realloc misuse on a rare codepath.
index 554455dbc2badf29e59928ae439222735a998b63..cb9472150f2ca8656074b8240d4b0912c7759053 100644 (file)
@@ -37,11 +37,13 @@ growable_comment_array_init(growable_comment_array *arr, size_t initial_size) {
 static int
 growable_comment_array_add(growable_comment_array *arr, int lineno, char *comment) {
     if (arr->num_items >= arr->size) {
-        arr->size *= 2;
-        arr->items = realloc(arr->items, arr->size * sizeof(*arr->items));
-        if (!arr->items) {
+        size_t new_size = arr->size * 2;
+        void *new_items_array = realloc(arr->items, new_size * sizeof(*arr->items));
+        if (!new_items_array) {
             return 0;
         }
+        arr->items = new_items_array;
+        arr->size = new_size;
     }
 
     arr->items[arr->num_items].lineno = lineno;