summaryrefslogtreecommitdiff
path: root/indra/llcommon
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llcommon')
-rw-r--r--indra/llcommon/llprocesslauncher.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/indra/llcommon/llprocesslauncher.cpp b/indra/llcommon/llprocesslauncher.cpp
index e1af49c2fb..adad3546fe 100644
--- a/indra/llcommon/llprocesslauncher.cpp
+++ b/indra/llcommon/llprocesslauncher.cpp
@@ -75,6 +75,28 @@ void LLProcessLauncher::addArgument(const std::string &arg)
#if LL_WINDOWS
+static std::string quote(const std::string& str)
+{
+ std::string::size_type len(str.length());
+ // If the string is already quoted, assume user knows what s/he's doing.
+ if (len >= 2 && str[0] == '"' && str[len-1] == '"')
+ {
+ return str;
+ }
+
+ // Not already quoted: do it.
+ std::string result("\"");
+ for (std::string::const_iterator ci(str.begin()), cend(str.end()); ci != cend; ++ci)
+ {
+ if (*ci == '"')
+ {
+ result.append("\\");
+ }
+ result.append(*ci);
+ }
+ return result + "\"";
+}
+
int LLProcessLauncher::launch(void)
{
// If there was already a process associated with this object, kill it.
@@ -87,11 +109,11 @@ int LLProcessLauncher::launch(void)
STARTUPINFOA sinfo;
memset(&sinfo, 0, sizeof(sinfo));
- std::string args = mExecutable;
+ std::string args = quote(mExecutable);
for(int i = 0; i < (int)mLaunchArguments.size(); i++)
{
args += " ";
- args += mLaunchArguments[i];
+ args += quote(mLaunchArguments[i]);
}
// So retarded. Windows requires that the second parameter to CreateProcessA be a writable (non-const) string...