Module: wine Branch: master Commit: 9dee1b24eea47a8fc9dafdad4558bfe33e9ca0bb URL: http://source.winehq.org/git/wine.git/?a=commit;h=9dee1b24eea47a8fc9dafdad45...
Author: Ilya Basin basinilya@gmail.com Date: Sat Jul 24 20:42:10 2010 +0400
shell32: Fix CommandLineToArgvW("") truncating returned exe path.
---
dlls/shell32/shell32_main.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c index f906a24..a166150 100644 --- a/dlls/shell32/shell32_main.c +++ b/dlls/shell32/shell32_main.c @@ -94,20 +94,22 @@ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs) if (*lpCmdline==0) { /* Return the path to the executable */ - DWORD len, size=16; + DWORD len, deslen=MAX_PATH, size;
- argv=LocalAlloc(LMEM_FIXED, size); + size = sizeof(LPWSTR) + deslen*sizeof(WCHAR) + sizeof(LPWSTR); for (;;) { - len = GetModuleFileNameW(0, (LPWSTR)(argv+1), (size-sizeof(LPWSTR))/sizeof(WCHAR)); + if (!(argv = LocalAlloc(LMEM_FIXED, size))) return NULL; + len = GetModuleFileNameW(0, (LPWSTR)(argv+1), deslen); if (!len) { LocalFree(argv); return NULL; } - if (len < size) break; - size*=2; - argv=LocalReAlloc(argv, size, 0); + if (len < deslen) break; + deslen*=2; + size = sizeof(LPWSTR) + deslen*sizeof(WCHAR) + sizeof(LPWSTR); + LocalFree( argv ); } argv[0]=(LPWSTR)(argv+1); if (numargs)