From 18f3babce6faddcc04e0d2c021ddcda7573a1c2f Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Wed, 3 Mar 2004 19:26:58 +0000 Subject: [PATCH] merge Wine commit about: Modified files: dlls/shell32 : shlexec.c Log message: Martin Fuchs Fix buffer length usage for RegQueryValueW() calls at various places. Patch: http://cvs.winehq.org/patch.py?id=11331 svn path=/trunk/; revision=8518 --- reactos/lib/shell32/shlexec.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index eb36c0f47e3..5e59d51e182 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -451,14 +451,16 @@ static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCW strcatW(filetype, lpOperation); strcatW(filetype, wCommand); - if (RegQueryValueW(HKEY_CLASSES_ROOT, filetype, command, &commandlen) == ERROR_SUCCESS) + if (RegQueryValueW(HKEY_CLASSES_ROOT, filetype, command, + &commandlen) == ERROR_SUCCESS) { commandlen /= sizeof(WCHAR); if (key) strcpyW(key, filetype); #if 0 - LPSTR tmp; - char param[256]; - LONG paramlen = 256; + LPWSTR tmp; + WCHAR param[256]; + LONG paramlen = sizeof(param); + static const WCHAR wSpace[] = {' ',0}; /* FIXME: it seems all Windows version don't behave the same here. * the doc states that this ddeexec information can be found after @@ -467,14 +469,15 @@ static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCW */ /* Get the parameters needed by the application from the associated ddeexec key */ - tmp = strstr(filetype, "command"); + tmp = strstrW(filetype, wCommand); tmp[0] = '\0'; - strcat(filetype, "ddeexec"); - - if (RegQueryValueA(HKEY_CLASSES_ROOT, filetype, param, ¶mlen) == ERROR_SUCCESS) + strcatW(filetype, wDdeexec); + if (RegQueryValueW(HKEY_CLASSES_ROOT, filetype, param, + ¶mlen) == ERROR_SUCCESS) { - strcat(command, " "); - strcat(command, param); + paramlen /= sizeof(WCHAR); + strcatW(command, wSpace); + strcatW(command, param); commandlen += paramlen; } #endif @@ -511,7 +514,7 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, WCHAR *extension = NULL; /* pointer to file extension */ WCHAR wtmpext[5]; /* local copy to mung as we please */ WCHAR filetype[256]; /* registry name for this filetype */ - LONG filetypelen = 256; /* length of above */ + LONG filetypelen = sizeof(filetype); /* length of above */ WCHAR command[256]; /* command from registry */ WCHAR wBuffer[256]; /* Used to GetProfileString */ UINT retval = 31; /* default - 'No association was found' */ @@ -652,7 +655,6 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, if (retval > 32) break; } - RegCloseKey(hkey); } } @@ -748,7 +750,7 @@ static unsigned dde_connect(WCHAR * key, WCHAR* start, WCHAR* ddeexec, unsigned ret = 31; strcpyW(endkey, wApplication); - applen = sizeof(app); /* buffer length for RegQueryValueW() is in bytes! */ + applen = sizeof(app); if (RegQueryValueW(HKEY_CLASSES_ROOT, key, app, &applen) != ERROR_SUCCESS) { FIXME("default app name NIY %s\n", debugstr_w(key)); @@ -833,8 +835,6 @@ static UINT execute_from_key(LPWSTR key, LPCWSTR lpFile, void *env, LPCWSTR szCo WCHAR param[256]; LONG paramlen = sizeof(param); - cmdlen /= sizeof(WCHAR); - param[0] = '\0'; /* Get the parameters needed by the application @@ -851,6 +851,7 @@ static UINT execute_from_key(LPWSTR key, LPCWSTR lpFile, void *env, LPCWSTR szCo else { /* Is there a replace() function anywhere? */ + cmdlen /= sizeof(WCHAR); cmd[cmdlen] = '\0'; SHELL_ArgifyW(param, sizeof(param)/sizeof(WCHAR), cmd, lpFile, psei->lpIDList, szCommandline); retval = execfunc(param, env, FALSE, psei, psei_out);