[PATCH libpciaccess] Fix pci_io_handle allocation routines.

Matthieu Herrb matthieu.herrb at laas.fr
Thu Apr 5 22:49:58 PDT 2012


On Thu, Apr 05, 2012 at 02:16:53PM -0700, Jeremy Huddleston wrote:
> Yep.  Please get this committed before we tag it for the katamari.
> 
> Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>
Hi,

Already pushed 
http://cgit.freedesktop.org/xorg/lib/libpciaccess/commit/?id=6f9d9f1e1b093939bc459be606fba72f1d6dfc76
> 
> 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
> > 
> 

-- 
Matthieu Herrb


More information about the xorg-devel mailing list