diff -ur a/dix/dixfonts.c b/dix/dixfonts.c --- a/dix/dixfonts.c 2011-12-18 05:44:54.000000000 +0100 +++ b/dix/dixfonts.c 2013-10-10 12:06:44.579225694 +0200 @@ -1479,6 +1479,7 @@ 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 @@ -1491,6 +1492,7 @@ err = BadAlloc; goto bail; } + old_closure = c; *new_closure = *c; c = new_closure; @@ -1498,6 +1500,7 @@ if (!data) { free(c); + c = old_closure; err = BadAlloc; goto bail; } @@ -1509,6 +1512,7 @@ { free(c->data); free(c); + c = old_closure; err = BadAlloc; goto bail; } @@ -1522,6 +1526,7 @@ FreeScratchGC(pGC); free(c->data); free(c); + c = old_closure; err = BadAlloc; goto bail; }