[MMSYS]: Improve AddSoundProfile, by Victor Martinez Calvo (with 1 minor modification by myself):

 Don't return TRUE when CB_SETITEMDATA fails.
 Avoid pScheme NULL dereference if allocation fails. CID 1223154
 Avoid overflowing the destiny buffer by using StringCchCopy() CID 510953
and:
1) Make it more readable by returning as soon as possible when an error happens.
2) Make it more readable by reducing the nested ifs-checks.
3) Remove the added string in the combobox if the sound scheme buffer mem allocation fails (pt.3 modified).
CORE-11603 #resolve #comment Thanks!

svn path=/trunk/; revision=72000
This commit is contained in:
Hermès Bélusca-Maïto 2016-07-25 20:24:30 +00:00
parent 42abc25acc
commit b79e7d2eee

View file

@ -5,11 +5,14 @@
* PROGRAMMER: Thomas Weidenmueller <w3seek@reactos.com> * PROGRAMMER: Thomas Weidenmueller <w3seek@reactos.com>
* Johannes Anderwald <janderwald@reactos.com> * Johannes Anderwald <janderwald@reactos.com>
* Dmitry Chapyshev <dmitry@reactos.org> * Dmitry Chapyshev <dmitry@reactos.org>
* Victor Martinez Calvo <victor.martinez@reactos.org>
*/ */
#include "mmsys.h" #include "mmsys.h"
#include <commdlg.h> #include <commdlg.h>
#include <strsafe.h>
#include <debug.h> #include <debug.h>
struct __APP_MAP__; struct __APP_MAP__;
@ -291,6 +294,8 @@ AddSoundProfile(HWND hwndDlg, HKEY hKey, TCHAR * szSubKey, BOOL SetDefault)
HKEY hSubKey; HKEY hSubKey;
TCHAR szValue[MAX_PATH]; TCHAR szValue[MAX_PATH];
DWORD dwValue, dwResult; DWORD dwValue, dwResult;
LRESULT lResult;
PSOUND_SCHEME_CONTEXT pScheme;
if (RegOpenKeyEx(hKey, if (RegOpenKeyEx(hKey,
szSubKey, szSubKey,
@ -309,27 +314,35 @@ AddSoundProfile(HWND hwndDlg, HKEY hKey, TCHAR * szSubKey, BOOL SetDefault)
(LPBYTE)szValue, (LPBYTE)szValue,
&dwValue); &dwValue);
RegCloseKey(hSubKey); RegCloseKey(hSubKey);
if (dwResult == ERROR_SUCCESS)
{
LRESULT lResult = SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_ADDSTRING, (WPARAM)0, (LPARAM)szValue);
if (lResult != CB_ERR)
{
PSOUND_SCHEME_CONTEXT pScheme = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SOUND_SCHEME_CONTEXT));
if (pScheme != NULL)
{
_tcscpy(pScheme->szDesc, szValue);
_tcscpy(pScheme->szName, szSubKey);
}
SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_SETITEMDATA, (WPARAM)lResult, (LPARAM)pScheme); if (dwResult != ERROR_SUCCESS)
if (SetDefault) return FALSE;
{
SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_SETCURSEL, (WPARAM)lResult, (LPARAM)0); /* Try to add the new profile */
} lResult = SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_ADDSTRING, (WPARAM)0, (LPARAM)szValue);
} if (lResult == CB_ERR)
return TRUE; return FALSE;
/* Allocate the profile scheme buffer */
pScheme = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SOUND_SCHEME_CONTEXT));
if (pScheme == NULL)
{
/* We failed to allocate the buffer, no need to keep a dangling string in the combobox */
SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_DELETESTRING, (WPARAM)lResult, (LPARAM)0);
return FALSE;
} }
return FALSE;
StringCchCopy(pScheme->szDesc, MAX_PATH, szValue);
StringCchCopy(pScheme->szName, MAX_PATH, szSubKey);
/* Associate the value with the item in the combobox */
SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_SETITEMDATA, (WPARAM)lResult, (LPARAM)pScheme);
/* Optionally, select the profile */
if (SetDefault)
SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_SETCURSEL, (WPARAM)lResult, (LPARAM)0);
return TRUE;
} }