Module: wine Branch: master Commit: c66d27c55588b0ab3406ce4729348beec3aab536 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c66d27c55588b0ab3406ce4729...
Author: Andrew Nguyen anguyen@codeweavers.com Date: Sat Jan 15 02:28:37 2011 -0600
setupapi: Fix some memory leaks in SetupDiGetINFClassA.
Spotted with Valgrind.
---
dlls/setupapi/devinst.c | 24 +++++++++++++++++++++--- 1 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index 1d318fe..5b8fb3c 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -3998,10 +3998,26 @@ BOOL WINAPI SetupDiGetINFClassA(PCSTR inf, LPGUID class_guid, PSTR class_name, PWSTR class_nameW = NULL; UNICODE_STRING infW;
- if (inf) RtlCreateUnicodeStringFromAsciiz(&infW, inf); - else infW.Buffer = NULL; + if (inf) + { + if (!RtlCreateUnicodeStringFromAsciiz(&infW, inf)) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + } + else + infW.Buffer = NULL; + if (class_name && size) - class_nameW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); + { + if (!(class_nameW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)))) + { + RtlFreeUnicodeString(&infW); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + }
retval = SetupDiGetINFClassW(infW.Buffer, class_guid, class_nameW, size, &required_sizeW);
@@ -4015,6 +4031,8 @@ BOOL WINAPI SetupDiGetINFClassA(PCSTR inf, LPGUID class_guid, PSTR class_name, else if(required_size) *required_size = required_sizeW;
+ HeapFree(GetProcessHeap(), 0, class_nameW); + RtlFreeUnicodeString(&infW); return retval; }