[gs-cvs] rev 7065 - trunk/gs/src

leonardo at ghostscript.com leonardo at ghostscript.com
Thu Sep 21 13:24:01 PDT 2006


Author: leonardo
Date: 2006-09-21 13:24:01 -0700 (Thu, 21 Sep 2006)
New Revision: 7065

Modified:
   trunk/gs/src/gdevpdfm.c
Log:
Fix (pdfwrite) : Don't use sscanf on a non 0-terminated PS strings.

DETAILS :

This redoes the revision 7062 change due to MSVC compiler warning.

The old code has 2 unpleasant hings :
1. MSVC yelds a warning about breaking 'const'.
2. It assumes no spaces at end of a serialized pdfmark argument value.

The new code should be clean.
 
EXPECTED DIFFERENCES :

None.


Modified: trunk/gs/src/gdevpdfm.c
===================================================================
--- trunk/gs/src/gdevpdfm.c	2006-09-21 19:21:48 UTC (rev 7064)
+++ trunk/gs/src/gdevpdfm.c	2006-09-21 20:24:01 UTC (rev 7065)
@@ -2024,17 +2024,17 @@
     const pdfmark_name *pmn;
     int code = 0;
     
-    { char *data = pts[-1].data;
-      int cnt, len = pts[-1].size;
+    {	int cnt, len = pts[-1].size;
+	char buf[200]; /* 6 doubles should fit (%g == -0.14285714285714285e-101 = 25 chars) */
 
-      if (size < 2 || len <= 0 || data[len - 1] != ']') 
-	  return_error(gs_error_rangecheck);
-      data[len - 1] = 0;
-      cnt = sscanf(data, "[%g %g %g %g %g %g",
+	if (len > sizeof(buf) - 1)
+	    return_error(gs_error_rangecheck);
+	memcpy(buf, pts[-1].data, len);
+	buf[len] = 0;
+	cnt = sscanf(buf, "[%g %g %g %g %g %g]",
 		   &ctm.xx, &ctm.xy, &ctm.yx, &ctm.yy, &ctm.tx, &ctm.ty);
-      data[len - 1] = ']';
-      if (cnt != 6)
-	return_error(gs_error_rangecheck);
+	if (cnt != 6)
+	    return_error(gs_error_rangecheck);
     }
     size -= 2;			/* remove CTM & pdfmark name */
     for (pmn = mark_names; pmn->mname != 0; ++pmn)



More information about the gs-cvs mailing list