Commit 6f9d9f1e authored by Matthieu Herrb's avatar Matthieu Herrb
Browse files

Fix pci_io_handle allocation routines.



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.
Signed-off-by: default avatarMatthieu Herrb <matthieu.herrb@laas.fr>
Tested-by: default avatarTormod Volden <debian.tormod@gmail.com>
parent 725f5669
......@@ -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;
}
/**
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment