[PATCH libpciaccess] Fix pci_io_handle allocation routines.

Jeremy Huddleston jeremyhu at apple.com
Thu Apr 5 14:16:53 PDT 2012


Yep.  Please get this committed before we tag it for the katamari.

Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>

On Apr 1, 2012, at 23:26, Matthieu Herrb wrote:

> 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
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 



More information about the xorg-devel mailing list