| diff --git a/dix/dixfonts.c b/dix/dixfonts.c |
| index feb765d..2e34d37 100644 |
| --- a/dix/dixfonts.c |
| +++ b/dix/dixfonts.c |
| @@ -1425,6 +1425,7 @@ doImageText(ClientPtr client, ITclosurePtr c) |
| GC *pGC; |
| unsigned char *data; |
| ITclosurePtr new_closure; |
| + ITclosurePtr old_closure; |
| |
| /* We're putting the client to sleep. We need to |
| save some state. Similar problem to that handled |
| @@ -1436,12 +1437,14 @@ doImageText(ClientPtr client, ITclosurePtr c) |
| err = BadAlloc; |
| goto bail; |
| } |
| + old_closure = c; |
| *new_closure = *c; |
| c = new_closure; |
| |
| data = malloc(c->nChars * itemSize); |
| if (!data) { |
| free(c); |
| + c = old_closure; |
| err = BadAlloc; |
| goto bail; |
| } |
| @@ -1452,6 +1455,7 @@ doImageText(ClientPtr client, ITclosurePtr c) |
| if (!pGC) { |
| free(c->data); |
| free(c); |
| + c = old_closure; |
| err = BadAlloc; |
| goto bail; |
| } |
| @@ -1464,6 +1468,7 @@ doImageText(ClientPtr client, ITclosurePtr c) |
| FreeScratchGC(pGC); |
| free(c->data); |
| free(c); |
| + c = old_closure; |
| err = BadAlloc; |
| goto bail; |
| } |