diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2018-10-01 21:29:47 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2018-10-01 22:49:28 +0200 |
commit | f4103a42d58535e21c48ff94ab000ab0305c62e3 (patch) | |
tree | 19841d85f3b087fe7cd462df1330ae2c3ae75899 /desktop | |
parent | c6c13c83ea72141299babf840478169c72f343c1 (diff) |
tdf#120249: escape trailing backslash in argument passed to soffice.bin
... to avoid treating \" as in-argument " instead of end of argument
See https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw
Change-Id: Ie283ba04117e13bc06c5b92412a945f945e67ff3
Reviewed-on: https://gerrit.libreoffice.org/61214
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/win32/source/officeloader/officeloader.cxx | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/desktop/win32/source/officeloader/officeloader.cxx b/desktop/win32/source/officeloader/officeloader.cxx index 10393741b235..cd471ca2a5f9 100644 --- a/desktop/win32/source/officeloader/officeloader.cxx +++ b/desktop/win32/source/officeloader/officeloader.cxx @@ -71,7 +71,7 @@ int WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int ) argv = GetCommandArgs(&argc); std::size_t n = wcslen(argv[0]) + 2; for (int i = 1; i < argc; ++i) { - n += wcslen(argv[i]) + 3; + n += wcslen(argv[i]) + 4; // 2 doublequotes + a space + optional trailing backslash } n += MY_LENGTH(L" \"-env:OOO_CWD=2") + 4 * cwdLen + MY_LENGTH(L"\"") + 1; @@ -86,6 +86,13 @@ int WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int ) if (bFirst || EXITHELPER_NORMAL_RESTART == dwExitCode || wcsncmp(argv[i], MY_STRING(L"-env:")) == 0) { p = desktop_win32::commandLineAppend(p, MY_STRING(L"\" \"")); p = desktop_win32::commandLineAppend(p, argv[i]); + const size_t arglen = wcslen(argv[i]); + // tdf#120249: if an argument ends with backslash, we should escape it with another + // backslash; otherwise, the trailing backslash will be treated as an escapement + // character for the following doublequote by CommandLineToArgvW in soffice.bin. See + // https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw + if (arglen && argv[i][arglen-1] == '\\') + p = desktop_win32::commandLineAppend(p, MY_STRING(L"\\")); } } |