[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>
* Johannes Anderwald <janderwald@reactos.com>
* Dmitry Chapyshev <dmitry@reactos.org>
* Victor Martinez Calvo <victor.martinez@reactos.org>
*/
#include "mmsys.h"
#include <commdlg.h>
#include <strsafe.h>
#include <debug.h>
struct __APP_MAP__;
@ -291,6 +294,8 @@ AddSoundProfile(HWND hwndDlg, HKEY hKey, TCHAR * szSubKey, BOOL SetDefault)
HKEY hSubKey;
TCHAR szValue[MAX_PATH];
DWORD dwValue, dwResult;
LRESULT lResult;
PSOUND_SCHEME_CONTEXT pScheme;
if (RegOpenKeyEx(hKey,
szSubKey,
@ -309,27 +314,35 @@ AddSoundProfile(HWND hwndDlg, HKEY hKey, TCHAR * szSubKey, BOOL SetDefault)
(LPBYTE)szValue,
&dwValue);
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 (SetDefault)
{
SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_SETCURSEL, (WPARAM)lResult, (LPARAM)0);
}
}
return TRUE;
if (dwResult != ERROR_SUCCESS)
return FALSE;
/* Try to add the new profile */
lResult = SendDlgItemMessage(hwndDlg, IDC_SOUND_SCHEME, CB_ADDSTRING, (WPARAM)0, (LPARAM)szValue);
if (lResult == CB_ERR)
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;
}