usp10 fix

Aric Stewart aric at codeweavers.com
Tue Apr 24 13:03:22 CDT 2007


Do not crash in ScriptPlace if pABC is null.
---
  dlls/usp10/usp10.c |   16 ++++++++++------
  1 files changed, 10 insertions(+), 6 deletions(-)
-------------- next part --------------
diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index b2b4b3f..fdc0286 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -1309,8 +1309,8 @@ HRESULT WINAPI ScriptPlace(HDC hdc, SCRI
      *   to get the correct ABC widths.   */
 
      if (!(lpABC = usp_zero_alloc(sizeof(ABC) * cGlyphs))) return E_OUTOFMEMORY;
-
-     memset(pABC, 0, sizeof(ABC));
+     if (pABC)
+        memset(pABC, 0, sizeof(ABC));
 
     /* FIXME: set pGoffset to more reasonable values */
      if (!GetCharABCWidthsI(get_cache_hdc(psc), 0, cGlyphs, (WORD *) pwGlyphs, lpABC ))
@@ -1330,15 +1330,19 @@ HRESULT WINAPI ScriptPlace(HDC hdc, SCRI
                                   lpABC[wcnt].abcA,
                                   lpABC[wcnt].abcB,
                                   lpABC[wcnt].abcC, wcnt);
-             pABC->abcA += lpABC[wcnt].abcA;
-             pABC->abcB += lpABC[wcnt].abcB;
-             pABC->abcC += lpABC[wcnt].abcC;
+             if (pABC)
+             { 
+                pABC->abcA += lpABC[wcnt].abcA;
+                pABC->abcB += lpABC[wcnt].abcB;
+                pABC->abcC += lpABC[wcnt].abcC;
+             }
              piAdvance[wcnt] = lpABC[wcnt].abcA + lpABC[wcnt].abcB + lpABC[wcnt].abcC;
              pGoffset[wcnt].du = 0;
              pGoffset[wcnt].dv = 0;
          }
      }
-     TRACE("Total for run:   abcA=%d,  abcB=%d,  abcC=%d\n", pABC->abcA, pABC->abcB, pABC->abcC);
+     if (pABC)
+        TRACE("Total for run:   abcA=%d,  abcB=%d,  abcC=%d\n", pABC->abcA, pABC->abcB, pABC->abcC);
 
      usp_free(lpABC);
      return S_OK;


More information about the wine-patches mailing list