From 0098ab673299a8bf80221e0fed45527d2bba10d0 Mon Sep 17 00:00:00 2001
From: Huw D M Davies <h.davies1@physics.ox.ac.uk>
Date: Sun, 19 Sep 1999 14:12:52 +0000
Subject: [PATCH] Stop trashing devmode if in and out devmodes are the same.

---
 graphics/win16drv/prtdrv.c | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/graphics/win16drv/prtdrv.c b/graphics/win16drv/prtdrv.c
index 36b1dc836d8..7281ee15a99 100644
--- a/graphics/win16drv/prtdrv.c
+++ b/graphics/win16drv/prtdrv.c
@@ -833,10 +833,10 @@ INT WIN16DRV_ExtDeviceMode(LPSTR lpszDriver, HWND hwnd, LPDEVMODEA lpdmOutput,
 			   DWORD dwMode)
 {
     LOADED_PRINTER_DRIVER *pLPD = LoadPrinterDriver(lpszDriver);
-    LPVOID lpSegOut = NULL, lpSegIn = NULL;
+    LPDEVMODEA lpSegOut = NULL, lpSegIn = NULL;
     LPSTR lpSegDevice, lpSegPort, lpSegProfile;
     INT16 wRet;
-    WORD wOutSize = 0;
+    WORD wOutSize = 0, wInSize = 0;
 
     if(!pLPD) return -1;
 
@@ -850,19 +850,17 @@ INT WIN16DRV_ExtDeviceMode(LPSTR lpszDriver, HWND hwnd, LPDEVMODEA lpdmOutput,
     if(lpdmOutput) {
       /* We don't know how big this will be so we call the driver's
 	 ExtDeviceMode to find out */
-
-	wOutSize = PRTDRV_CallTo16_word_wwlllllw(
-	    pLPD->fn[FUNC_EXTDEVICEMODE], hwnd, pLPD->hInst, 0,
-	    SEGPTR_GET(lpSegDevice), SEGPTR_GET(lpSegPort), 0,
-	    SEGPTR_GET(lpSegProfile), 0 );
+        wOutSize = PRTDRV_CallTo16_word_wwlllllw(
+		   pLPD->fn[FUNC_EXTDEVICEMODE], hwnd, pLPD->hInst, 0,
+		   SEGPTR_GET(lpSegDevice), SEGPTR_GET(lpSegPort), 0,
+		   SEGPTR_GET(lpSegProfile), 0 );
 	lpSegOut = SEGPTR_ALLOC(wOutSize);
-	memcpy(lpSegOut, lpdmOutput, wOutSize); /* probably unnecessary */
     }
     if(lpdmInput) {
       /* This time we get the information from the fields */
-        lpSegIn = SEGPTR_ALLOC(lpdmInput->dmSize + lpdmInput->dmDriverExtra);
-	memcpy(lpSegIn, lpdmInput, lpdmInput->dmSize +
-	       lpdmInput->dmDriverExtra);
+        wInSize = lpdmInput->dmSize + lpdmInput->dmDriverExtra;
+        lpSegIn = SEGPTR_ALLOC(wInSize);
+	memcpy(lpSegIn, lpdmInput, wInSize);
     }
     wRet = PRTDRV_CallTo16_word_wwlllllw( pLPD->fn[FUNC_EXTDEVICEMODE],
 					  hwnd, pLPD->hInst,
@@ -877,8 +875,6 @@ INT WIN16DRV_ExtDeviceMode(LPSTR lpszDriver, HWND hwnd, LPDEVMODEA lpdmOutput,
 	SEGPTR_FREE(lpSegOut);
     }
     if(lpSegIn) {
-        memcpy(lpdmInput, lpSegIn, lpdmInput->dmSize +
-	       lpdmInput->dmDriverExtra);
 	SEGPTR_FREE(lpSegIn);
     }
     SEGPTR_FREE(lpSegDevice);
-- 
GitLab