https://git.reactos.org/?p=reactos.git;a=commitdiff;h=02df49ebd8167da3335e96af25b91048bc9ec266

commit 02df49ebd8167da3335e96af25b91048bc9ec266
Author:     Timo Kreuzer <timo.kreu...@reactos.org>
AuthorDate: Tue Sep 19 16:33:35 2023 +0300
Commit:     Timo Kreuzer <timo.kreu...@reactos.org>
CommitDate: Sun Oct 1 13:05:51 2023 +0300

    [WINSPOOL] Properly copy the DEVMODE in IntFixUpDevModeNames
    
    Otherwise the size isn't set up correctly, leading to a crash.
    Fixes crash in comdl32_winetest printdlg.
---
 win32ss/printing/base/winspool/printers.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/win32ss/printing/base/winspool/printers.c 
b/win32ss/printing/base/winspool/printers.c
index 285696d6a33..2faf3f91781 100644
--- a/win32ss/printing/base/winspool/printers.c
+++ b/win32ss/printing/base/winspool/printers.c
@@ -834,7 +834,19 @@ IntFixUpDevModeNames( PDOCUMENTPROPERTYHEADER pdphdr )
 
     if (res)
     {
-        FIXME("IFUDMN : Get Printer Name %S\n",pi2->pPrinterName);
+        /* Check if the provided buffer is large enough */
+        DWORD cbDevMode = pi2->pDevMode->dmSize + pi2->pDevMode->dmDriverExtra;
+        if (pdphdr->cbOut < cbDevMode)
+        {
+            ERR("cbOut (%lu) < cbDevMode(%u)\n", pdphdr->cbOut, cbDevMode);
+            res = FALSE;
+            goto Exit;
+        }
+
+        /* Copy the devmode */
+        RtlCopyMemory(pdphdr->pdmOut, pi2->pDevMode, cbDevMode);
+
+        TRACE("IFUDMN : Get Printer Name %S\n", pi2->pPrinterName);
         StringCchCopyW( pdphdr->pdmOut->dmDeviceName, CCHDEVICENAME-1, 
pi2->pPrinterName );
         pdphdr->pdmOut->dmDeviceName[CCHDEVICENAME-1] = 0;
     }
@@ -842,6 +854,8 @@ IntFixUpDevModeNames( PDOCUMENTPROPERTYHEADER pdphdr )
     {
         ERR("IFUDMN : GetPrinterW failed with %u\n", GetLastError());
     }
+
+Exit:
     HeapFree(hProcessHeap, 0, pi2);
     return res;
 }

Reply via email to