[PATCH libpciaccess] Fix pci_io_handle allocation routines.

Matthieu Herrb matthieu.herrb at laas.fr
Sun Apr 1 23:26:49 PDT 2012


The previous version of new_io_handle()  would invalidate all previous
allocations when realloc moves the base pointer of the ios array.
Since I cannot figure out where this array is useful, just get rid of
it, providing sound stable memory allocation.

Fixes vgaHWSaveFonts() in 1.12 xserver on OpenBSD, but other
sub-systems relaying on pci_io could be affected too.
---
 src/common_io.c |   39 ++++-----------------------------------
 1 files changed, 4 insertions(+), 35 deletions(-)

diff --git a/src/common_io.c b/src/common_io.c
index 5b35e07..f5c9e45 100644
--- a/src/common_io.c
+++ b/src/common_io.c
@@ -28,59 +28,28 @@
 #include "pciaccess.h"
 #include "pciaccess_private.h"
 
-static struct pci_io_handle *ios;
-static unsigned int num_ios;
-
 static struct pci_io_handle *
 new_io_handle(void)
 {
     struct pci_io_handle *new;
 
-    new = realloc(ios, sizeof(struct pci_io_handle) * (num_ios + 1));
+    new = malloc(sizeof(struct pci_io_handle));
     if (!new)
 	return NULL;
 
-    ios = new;
-    num_ios++;
-
-    return ios + num_ios - 1;
+    return new;
 }
 
 static void
 delete_io_handle(struct pci_io_handle *handle)
 {
-    struct pci_io_handle *new;
-    int i = 0;
-
-    if (!handle || !num_ios || (void *)handle < (void *)ios ||
-        (void *)handle > (void *)(ios + num_ios - 1))
-        return;
-
-    for (i = 0; i < num_ios; i++) {
-        if (ios + i == handle) {
-            memmove(&ios[i], &ios[i+1], sizeof(struct pci_io_handle) *
-                                        (num_ios - i - 1));
-            break;
-        }
-    }
-
-    num_ios--;
-    if (num_ios) {
-        new = realloc(ios, sizeof(struct pci_io_handle) * num_ios);
-        if (new)
-            ios = new;
-    } else {
-        free(ios);
-        ios = NULL;
-    }
+    free(handle);
+    return;
 }
 
 _pci_hidden void
 pci_io_cleanup(void)
 {
-    free(ios);
-    ios = NULL;
-    num_ios = 0;
 }
 
 /**
-- 
1.7.6



More information about the xorg-devel mailing list