[PATCH] dixfonts: Deobfuscate GC ops calls.

Jamey Sharp jamey at minilop.net
Tue Jul 13 15:35:10 PDT 2010


Signed-off-by: Jamey Sharp <jamey at minilop.net>
---
 dix/dixfonts.c     |   54 ++++++++++++++++++++-------------------------------
 include/closestr.h |   24 -----------------------
 2 files changed, 21 insertions(+), 57 deletions(-)

diff --git a/dix/dixfonts.c b/dix/dixfonts.c
index 4a8f113..91092be 100644
--- a/dix/dixfonts.c
+++ b/dix/dixfonts.c
@@ -1175,6 +1175,7 @@ doPolyText(ClientPtr client, PTclosurePtr c)
     enum { NEVER_SLEPT, START_SLEEP, SLEEPING } client_state = NEVER_SLEPT;
     FontPathElementPtr fpe;
     GC *origGC = NULL;
+    int itemSize = c->reqType == X_PolyText8 ? 1 : 2;
 
     if (client->clientGone)
     {
@@ -1260,10 +1261,6 @@ doPolyText(ClientPtr client, PTclosurePtr c)
 		    val.ptr = pFont;
 		    ChangeGC(NullClient, c->pGC, GCFont, &val);
 		    ValidateGC(c->pDraw, c->pGC);
-		    if (c->reqType == X_PolyText8)
-			c->polyText = (PolyTextPtr) c->pGC->ops->PolyText8;
-		    else
-			c->polyText = (PolyTextPtr) c->pGC->ops->PolyText16;
 		}
 
 		/* Undo the refcnt++ we performed when going to sleep */
@@ -1275,7 +1272,7 @@ doPolyText(ClientPtr client, PTclosurePtr c)
 	else	/* print a string */
 	{
 	    unsigned char *pNextElt;
-	    pNextElt = c->pElt + TextEltHeader + (*c->pElt)*c->itemSize;
+	    pNextElt = c->pElt + TextEltHeader + (*c->pElt) * itemSize;
 	    if ( pNextElt > c->endReq)
 	    {
 		err = BadLength;
@@ -1288,7 +1285,7 @@ doPolyText(ClientPtr client, PTclosurePtr c)
 	    }
 	    if (c->pDraw)
 	    {
-		lgerr = LoadGlyphs(client, c->pGC->font, *c->pElt, c->itemSize,
+		lgerr = LoadGlyphs(client, c->pGC->font, *c->pElt, itemSize,
 				   c->pElt + TextEltHeader);
 	    }
 	    else lgerr = Successful;
@@ -1387,8 +1384,12 @@ doPolyText(ClientPtr client, PTclosurePtr c)
 	    if (c->pDraw)
 	    {
 		c->xorg += *((INT8 *)(c->pElt + 1));	/* must be signed */
-		c->xorg = (* c->polyText)(c->pDraw, c->pGC, c->xorg, c->yorg,
-		    *c->pElt, c->pElt + TextEltHeader);
+		if (c->reqType == X_PolyText8)
+		    c->xorg = (* c->pGC->ops->PolyText8)(c->pDraw, c->pGC, c->xorg, c->yorg,
+			*c->pElt, (char *) (c->pElt + TextEltHeader));
+		else
+		    c->xorg = (* c->pGC->ops->PolyText16)(c->pDraw, c->pGC, c->xorg, c->yorg,
+			*c->pElt, (unsigned short *) (c->pElt + TextEltHeader));
 	    }
 	    c->pElt = pNextElt;
 	}
@@ -1447,16 +1448,7 @@ PolyText(ClientPtr client, DrawablePtr pDraw, GC *pGC, unsigned char *pElt,
     local_closure.pDraw = pDraw;
     local_closure.xorg = xorg;
     local_closure.yorg = yorg;
-    if ((local_closure.reqType = reqType) == X_PolyText8)
-    {
-	local_closure.polyText = (PolyTextPtr) pGC->ops->PolyText8;
-	local_closure.itemSize = 1;
-    }
-    else
-    {
-	local_closure.polyText =  (PolyTextPtr) pGC->ops->PolyText16;
-	local_closure.itemSize = 2;
-    }
+    local_closure.reqType = reqType;
     local_closure.pGC = pGC;
     local_closure.did = did;
     local_closure.err = Success;
@@ -1475,6 +1467,7 @@ doImageText(ClientPtr client, ITclosurePtr c)
 {
     int err = Success, lgerr;	/* err is in X error, not font error, space */
     FontPathElementPtr fpe;
+    int itemSize = c->reqType == X_ImageText8 ? 1 : 2;
 
     if (client->clientGone)
     {
@@ -1499,7 +1492,7 @@ doImageText(ClientPtr client, ITclosurePtr c)
 	}
     }
 
-    lgerr = LoadGlyphs(client, c->pGC->font, c->nChars, c->itemSize, c->data);
+    lgerr = LoadGlyphs(client, c->pGC->font, c->nChars, itemSize, c->data);
     if (lgerr == Suspended)
     {
         if (!c->slept) {
@@ -1521,14 +1514,14 @@ doImageText(ClientPtr client, ITclosurePtr c)
 	    *new_closure = *c;
 	    c = new_closure;
 
-	    data = malloc(c->nChars * c->itemSize);
+	    data = malloc(c->nChars * itemSize);
 	    if (!data)
 	    {
 		free(c);
 		err = BadAlloc;
 		goto bail;
 	    }
-	    memmove(data, c->data, c->nChars * c->itemSize);
+	    memmove(data, c->data, c->nChars * itemSize);
 	    c->data = data;
 
 	    pGC = GetScratchGC(c->pGC->depth, c->pGC->pScreen);
@@ -1567,8 +1560,12 @@ doImageText(ClientPtr client, ITclosurePtr c)
     }
     if (c->pDraw)
     {
-	(* c->imageText)(c->pDraw, c->pGC, c->xorg, c->yorg,
-	    c->nChars, c->data);
+	if (c->reqType == X_ImageText8)
+	    (* c->pGC->ops->ImageText8)(c->pDraw, c->pGC, c->xorg, c->yorg,
+		c->nChars, (char *) c->data);
+	else
+	    (* c->pGC->ops->ImageText16)(c->pDraw, c->pGC, c->xorg, c->yorg,
+		c->nChars, (unsigned short *) c->data);
     }
 
 bail:
@@ -1605,16 +1602,7 @@ ImageText(ClientPtr client, DrawablePtr pDraw, GC *pGC, int nChars,
     local_closure.data = data;
     local_closure.xorg = xorg;
     local_closure.yorg = yorg;
-    if ((local_closure.reqType = reqType) == X_ImageText8)
-    {
-	local_closure.imageText = (ImageTextPtr) pGC->ops->ImageText8;
-	local_closure.itemSize = 1;
-    }
-    else
-    {
-	local_closure.imageText = (ImageTextPtr) pGC->ops->ImageText16;
-	local_closure.itemSize = 2;
-    }
+    local_closure.reqType = reqType;
     local_closure.did = did;
     local_closure.slept = FALSE;
 
diff --git a/include/closestr.h b/include/closestr.h
index 2cd67b1..1660151 100644
--- a/include/closestr.h
+++ b/include/closestr.h
@@ -100,16 +100,6 @@ typedef struct _LFclosure {
 
 /* PolyText */
 
-typedef
-    int			(* PolyTextPtr)(
-			DrawablePtr /* pDraw */,
-			GCPtr /* pGC */,
-			int /* x */,
-			int /* y */,
-			int /* count */,
-			void * /* chars or shorts */
-			);
-
 typedef struct _PTclosure {
     ClientPtr		client;
     DrawablePtr		pDraw;
@@ -120,8 +110,6 @@ typedef struct _PTclosure {
     int			xorg;
     int			yorg;
     CARD8		reqType;
-    PolyTextPtr		polyText;
-    int			itemSize;
     XID			did;
     int			err;
     Bool		slept;
@@ -129,16 +117,6 @@ typedef struct _PTclosure {
 
 /* ImageText */
 
-typedef
-    void		(* ImageTextPtr)(
-			DrawablePtr /* pDraw */,
-			GCPtr /* pGC */,
-			int /* x */,
-			int /* y */,
-			int /* count */,
-			void * /* chars or shorts */
-			);
-
 typedef struct _ITclosure {
     ClientPtr		client;
     DrawablePtr		pDraw;
@@ -148,8 +126,6 @@ typedef struct _ITclosure {
     int			xorg;
     int			yorg;
     CARD8		reqType;
-    ImageTextPtr	imageText;
-    int			itemSize;
     XID			did;
     Bool		slept;
 } ITclosureRec;
-- 
1.7.0



More information about the xorg-devel mailing list