wineps: don't overflow WriteSpool

Huw D M Davies h.davies1 at physics.ox.ac.uk
Thu Dec 4 10:47:46 CST 2003


        Huw Davies <huw at codeweavers.com>
        Let PSDRV_WriteSpool cope with strings longer than 0xffff bytes.
-- 
Huw Davies
huw at codeweavers.com
Index: dlls/wineps/ps.c
===================================================================
RCS file: /home/wine/wine/dlls/wineps/ps.c,v
retrieving revision 1.21
diff -u -r1.21 ps.c
--- dlls/wineps/ps.c	11 Nov 2003 20:41:14 -0000	1.21
+++ dlls/wineps/ps.c	4 Dec 2003 16:35:27 -0000
@@ -193,8 +193,10 @@
 "/%s %d array def\n";
 
 
-int PSDRV_WriteSpool(PSDRV_PDEVICE *physDev, LPCSTR lpData, WORD cch)
+DWORD PSDRV_WriteSpool(PSDRV_PDEVICE *physDev, LPCSTR lpData, DWORD cch)
 {
+    int num, num_left = cch;
+
     if(physDev->job.quiet) {
         TRACE("ignoring output\n");
 	return 0;
@@ -204,7 +206,16 @@
         if( !PSDRV_StartPage(physDev) )
 	    return 0;
     }
-    return WriteSpool16( physDev->job.hJob, (LPSTR)lpData, cch );
+
+    do {
+        num = min(num_left, 0x8000);
+        if(WriteSpool16( physDev->job.hJob, (LPSTR)lpData, num ) != num)
+            return 0;
+        lpData += num;
+        num_left -= num;
+    } while(num_left);
+
+    return cch;
 }
 
 
Index: dlls/wineps/psdrv.h
===================================================================
RCS file: /home/wine/wine/dlls/wineps/psdrv.h,v
retrieving revision 1.45
diff -u -r1.45 psdrv.h
--- dlls/wineps/psdrv.h	12 Nov 2003 22:42:55 -0000	1.45
+++ dlls/wineps/psdrv.h	4 Dec 2003 16:35:27 -0000
@@ -450,7 +450,7 @@
 extern BOOL PSDRV_WriteDIBits16(PSDRV_PDEVICE *physDev, const WORD *words, int number);
 extern BOOL PSDRV_WriteDIBits24(PSDRV_PDEVICE *physDev, const BYTE *bits, int number);
 extern BOOL PSDRV_WriteDIBits32(PSDRV_PDEVICE *physDev, const BYTE *bits, int number);
-extern int PSDRV_WriteSpool(PSDRV_PDEVICE *physDev, LPCSTR lpData, WORD cch);
+extern DWORD PSDRV_WriteSpool(PSDRV_PDEVICE *physDev, LPCSTR lpData, DWORD cch);
 extern BOOL PSDRV_WritePatternDict(PSDRV_PDEVICE *physDev, BITMAP *bm, BYTE *bits);
 extern BOOL PSDRV_WriteDIBPatternDict(PSDRV_PDEVICE *physDev, BITMAPINFO *bmi, UINT usage);
 extern BOOL PSDRV_WriteArrayPut(PSDRV_PDEVICE *physDev, CHAR *pszArrayName, INT nIndex, LONG lCoord);



More information about the wine-patches mailing list