diff options
author | Russell King <rmk@arm.linux.org.uk> | 2015-06-01 20:51:35 +0100 |
---|---|---|
committer | Russell King <rmk@arm.linux.org.uk> | 2015-06-29 12:58:33 +0100 |
commit | 9be28a238209b2a0f91c86804627d2c2c34889fd (patch) | |
tree | 983fb86782bd9a10c499f9f01b5e0b31c705ab63 | |
parent | a15881bf0e2f63420fefe0e3dda0e7f6a7a9ebb0 (diff) |
etnaviv: fix double-free caused by xrandr shadow handling
Switching the output mode between reflected and normal causes the Xorg
cached scratch pixmap to end up with etnaviv private data pointing at
a freed etnaviv_pixmap. A subsequent use of the scratch pixmap then
causes glibc to complain about a double-free. Fix this.
Signed-off-by: Russell King <rmk@arm.linux.org.uk>
-rw-r--r-- | etnaviv/etnaviv.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/etnaviv/etnaviv.c b/etnaviv/etnaviv.c index e509571..c0ff00e 100644 --- a/etnaviv/etnaviv.c +++ b/etnaviv/etnaviv.c @@ -138,6 +138,8 @@ static void etnaviv_free_pixmap(PixmapPtr pixmap) if (vPix) { struct etnaviv *etnaviv; + etnaviv_set_pixmap_priv(pixmap, NULL); + etnaviv = etnaviv_get_screen_priv(pixmap->drawable.pScreen); switch (vPix->batch_state) { @@ -514,7 +516,6 @@ static Bool etnaviv_CloseScreen(CLOSE_SCREEN_ARGS_DECL) pixmap = pScreen->GetScreenPixmap(pScreen); etnaviv_free_pixmap(pixmap); - etnaviv_set_pixmap_priv(pixmap, NULL); etnaviv_accel_shutdown(etnaviv); @@ -798,7 +799,6 @@ static Bool etnaviv_DestroyPixmap(PixmapPtr pixmap) dbg("Destroying pixmap %p\n", pixmap); #endif etnaviv_free_pixmap(pixmap); - etnaviv_set_pixmap_priv(pixmap, NULL); } return etnaviv->DestroyPixmap(pixmap); } @@ -1088,13 +1088,10 @@ static Bool etnaviv_import_dmabuf(ScreenPtr pScreen, PixmapPtr pPixmap, int fd) { struct etnaviv *etnaviv = etnaviv_get_screen_priv(pScreen); struct etnaviv_format fmt = { .swizzle = DE_SWIZZLE_ARGB, }; - struct etnaviv_pixmap *vpix = etnaviv_get_pixmap_priv(pPixmap); + struct etnaviv_pixmap *vpix; struct etna_bo *bo; - if (vpix) { - etnaviv_free_pixmap(pPixmap); - etnaviv_set_pixmap_priv(pPixmap, NULL); - } + etnaviv_free_pixmap(pPixmap); switch (pPixmap->drawable.bitsPerPixel) { case 16: |