winspool: Strings can be NULL in AddPrinterDriverExA
Detlef Riekenberg
wine.dev at web.de
Wed Aug 22 16:44:35 CDT 2007
Changelog:
winspool: Strings can be NULL in AddPrinterDriverExA
We must not change a NULL to an empty String when
converting DRIVER_INFO*A to DRIVER_INFO*W
--
By by ... Detlef
-------------- next part --------------
>From d8dd854668cd708b2b7c871f629ba8e1a637b2eb Mon Sep 17 00:00:00 2001
From: Detlef Riekenberg <wine.dev at web.de>
Date: Wed, 22 Aug 2007 23:41:44 +0200
Subject: [PATCH] winspool: Strings can be NULL in AddPrinterDriverExA
---
dlls/winspool.drv/info.c | 59 +++++++++++++++++++++++++++++++---------------
1 files changed, 40 insertions(+), 19 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 1ed05fd..fee2210 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -6653,7 +6653,8 @@ BOOL WINAPI AddPrinterDriverExA(LPSTR pN
DWORD len;
DWORD res = FALSE;
- FIXME("(%s, %d, %p, 0x%x)\n", debugstr_a(pName), Level, pDriverInfo, dwFileCopyFlags);
+ TRACE("(%s, %d, %p, 0x%x)\n", debugstr_a(pName), Level, pDriverInfo, dwFileCopyFlags);
+
diA = (DRIVER_INFO_8A *) pDriverInfo;
ZeroMemory(&diW, sizeof(diW));
@@ -6677,61 +6678,81 @@ BOOL WINAPI AddPrinterDriverExA(LPSTR pN
/* common fields */
diW.cVersion = diA->cVersion;
- len = MultiByteToWideChar(CP_ACP, 0, diA->pName, -1, NULL, 0);
- diW.pName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
- MultiByteToWideChar(CP_ACP, 0, diA->pName, -1, diW.pName, len);
+ if (diA->pName) {
+ len = MultiByteToWideChar(CP_ACP, 0, diA->pName, -1, NULL, 0);
+ diW.pName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, diA->pName, -1, diW.pName, len);
+ }
- len = MultiByteToWideChar(CP_ACP, 0, diA->pEnvironment, -1, NULL, 0);
- diW.pEnvironment = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
- MultiByteToWideChar(CP_ACP, 0, diA->pEnvironment, -1, diW.pEnvironment, len);
+ if (diA->pEnvironment) {
+ len = MultiByteToWideChar(CP_ACP, 0, diA->pEnvironment, -1, NULL, 0);
+ diW.pEnvironment = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, diA->pEnvironment, -1, diW.pEnvironment, len);
+ }
- len = MultiByteToWideChar(CP_ACP, 0, diA->pDriverPath, -1, NULL, 0);
- diW.pDriverPath = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
- MultiByteToWideChar(CP_ACP, 0, diA->pDriverPath, -1, diW.pDriverPath, len);
+ if (diA->pDriverPath) {
+ len = MultiByteToWideChar(CP_ACP, 0, diA->pDriverPath, -1, NULL, 0);
+ diW.pDriverPath = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, diA->pDriverPath, -1, diW.pDriverPath, len);
+ }
- len = MultiByteToWideChar(CP_ACP, 0, diA->pDataFile, -1, NULL, 0);
- diW.pDataFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
- MultiByteToWideChar(CP_ACP, 0, diA->pDataFile, -1, diW.pDataFile, len);
+ if (diA->pDataFile) {
+ len = MultiByteToWideChar(CP_ACP, 0, diA->pDataFile, -1, NULL, 0);
+ diW.pDataFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, diA->pDataFile, -1, diW.pDataFile, len);
+ }
- len = MultiByteToWideChar(CP_ACP, 0, diA->pConfigFile, -1, NULL, 0);
- diW.pConfigFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
- MultiByteToWideChar(CP_ACP, 0, diA->pConfigFile, -1, diW.pConfigFile, len);
+ if (diA->pConfigFile) {
+ len = MultiByteToWideChar(CP_ACP, 0, diA->pConfigFile, -1, NULL, 0);
+ diW.pConfigFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, diA->pConfigFile, -1, diW.pConfigFile, len);
+ }
- if (Level > 2) {
+ if ((Level > 2) && diA->pDependentFiles) {
lenA = multi_sz_lenA(diA->pDependentFiles);
len = MultiByteToWideChar(CP_ACP, 0, diA->pDependentFiles, lenA, NULL, 0);
diW.pDependentFiles = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, diA->pDependentFiles, lenA, diW.pDependentFiles, len);
+ }
+ if ((Level > 2) && diA->pMonitorName) {
len = MultiByteToWideChar(CP_ACP, 0, diA->pMonitorName, -1, NULL, 0);
diW.pMonitorName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, diA->pMonitorName, -1, diW.pMonitorName, len);
}
- if (Level > 3) {
+ if ((Level > 3) && diA->pDefaultDataType) {
len = MultiByteToWideChar(CP_ACP, 0, diA->pDefaultDataType, -1, NULL, 0);
diW.pDefaultDataType = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, diA->pDefaultDataType, -1, diW.pDefaultDataType, len);
+ }
+ if ((Level > 3) && diA->pszzPreviousNames) {
lenA = multi_sz_lenA(diA->pszzPreviousNames);
len = MultiByteToWideChar(CP_ACP, 0, diA->pszzPreviousNames, lenA, NULL, 0);
diW.pszzPreviousNames = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, diA->pszzPreviousNames, lenA, diW.pszzPreviousNames, len);
}
- if (Level > 5) {
+ if ((Level > 5) && diA->pszMfgName) {
len = MultiByteToWideChar(CP_ACP, 0, diA->pszMfgName, -1, NULL, 0);
diW.pszMfgName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, diA->pszMfgName, -1, diW.pszMfgName, len);
+ }
+ if ((Level > 5) && diA->pszOEMUrl) {
len = MultiByteToWideChar(CP_ACP, 0, diA->pszOEMUrl, -1, NULL, 0);
diW.pszOEMUrl = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, diA->pszOEMUrl, -1, diW.pszOEMUrl, len);
+ }
+ if ((Level > 5) && diA->pszHardwareID) {
len = MultiByteToWideChar(CP_ACP, 0, diA->pszHardwareID, -1, NULL, 0);
diW.pszHardwareID = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, diA->pszHardwareID, -1, diW.pszHardwareID, len);
+ }
+ if ((Level > 5) && diA->pszProvider) {
len = MultiByteToWideChar(CP_ACP, 0, diA->pszProvider, -1, NULL, 0);
diW.pszProvider = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, diA->pszProvider, -1, diW.pszProvider, len);
--
1.4.1
More information about the wine-patches
mailing list