diff options
author | Maarten Maathuis <madman2003@gmail.com> | 2009-08-07 20:04:53 +0200 |
---|---|---|
committer | Maarten Maathuis <madman2003@gmail.com> | 2009-08-07 20:38:14 +0200 |
commit | 1548e8ae5d28ed0eb6057a1a19cfc84a78ef34dc (patch) | |
tree | a969453cf4e7b4799340e71a749a6a751ed21ed3 /exa/exa_mixed.c | |
parent | e94c7c42ce9d6a194b76ba7e8b3904b180f93a1b (diff) |
exa: fix a potential loophole in "mixed"
- Always free sys_ptr before setting the pixmap to pinned.
Diffstat (limited to 'exa/exa_mixed.c')
-rw-r--r-- | exa/exa_mixed.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c index 47fa6d448..0d2552d8b 100644 --- a/exa/exa_mixed.c +++ b/exa/exa_mixed.c @@ -145,20 +145,22 @@ exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth, pExaPixmap = ExaGetPixmapPriv(pPixmap); if (pExaPixmap) { - if (pPixData) { - if (!exaPixmapIsPinned(pPixmap)) { - free(pExaPixmap->sys_ptr); - - /* We no longer need this. */ - if (pExaPixmap->pDamage) { - DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage); - DamageDestroy(pExaPixmap->pDamage); - pExaPixmap->pDamage = NULL; - } + if (!exaPixmapIsPinned(pPixmap)) { + free(pExaPixmap->sys_ptr); + pExaPixmap->sys_ptr = pPixmap->devPrivate.ptr = NULL; + pExaPixmap->sys_pitch = pPixmap->devKind = 0; + + /* We no longer need this. */ + if (pExaPixmap->pDamage) { + DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage); + DamageDestroy(pExaPixmap->pDamage); + pExaPixmap->pDamage = NULL; } - pExaPixmap->sys_ptr = pPixData; } + if (pPixData) + pExaPixmap->sys_ptr = pPixData; + if (devKind > 0) pExaPixmap->sys_pitch = devKind; |