]> xenbits.xensource.com Git - people/tklengyel/xen.git/commitdiff
libs/guest: Fix leak on realloc failure in backup_ptes()
authorEdwin Török <edwin.torok@cloud.com>
Fri, 3 Mar 2023 07:03:19 +0000 (08:03 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 3 Mar 2023 07:03:19 +0000 (08:03 +0100)
From `man 2 realloc`:

  If realloc() fails, the original block is left untouched; it is not freed or moved.

Found using GCC -fanalyzer:

  |  184 |         backup->entries = realloc(backup->entries,
  |      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  |      |         |               | |
  |      |         |               | (91) when ‘realloc’ fails
  |      |         |               (92) ‘old_ptes.entries’ leaks here; was allocated at (44)
  |      |         (90) ...to here

Signed-off-by: Edwin Török <edwin.torok@cloud.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
master commit: 275d13184cfa52ebe4336ed66526ce93716adbe0
master date: 2023-02-27 15:51:23 +0000

tools/libs/guest/xg_offline_page.c

index c594fdba415de8cde8d08e53710b9c0437a8b5a4..ccd0299f0fc7caf71a4cc2f8964d544f77ab2da6 100644 (file)
@@ -181,10 +181,16 @@ static int backup_ptes(xen_pfn_t table_mfn, int offset,
 
     if (backup->max == backup->cur)
     {
-        backup->entries = realloc(backup->entries,
-                            backup->max * 2 * sizeof(struct pte_backup_entry));
+        void *orig = backup->entries;
+
+        backup->entries = realloc(
+            orig, backup->max * 2 * sizeof(struct pte_backup_entry));
+
         if (backup->entries == NULL)
+        {
+            free(orig);
             return -1;
+        }
         else
             backup->max *= 2;
     }