VeraCrypt
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMounir IDRASSI <mounir.idrassi@idrix.fr>2016-03-18 15:25:48 (GMT)
committerMounir IDRASSI <mounir.idrassi@idrix.fr>2016-03-18 15:27:29 (GMT)
commit646679da4d79bf7f8af22c44c7ae8498086a88a6 (patch)
treead44ddf32662d1896b5502224add0676c4dd2904
parentfd26f49958a147b00cfa51e054257587ea4d5a28 (diff)
downloadVeraCrypt-646679da4d79bf7f8af22c44c7ae8498086a88a6.zip
VeraCrypt-646679da4d79bf7f8af22c44c7ae8498086a88a6.tar.gz
Linux: Completely fix gcc-5 "Invalid characters encountered" issue on mount. It was caused by an issue of gcc-5 STL implementation that is causing char* pointers retrieved from std::string using c_str method to become invalid in the child of a child process (after two fork calls). The workaround is to first copy the std:string values in the child before calling the second fork.
-rw-r--r--src/Platform/Unix/Process.cpp24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/Platform/Unix/Process.cpp b/src/Platform/Unix/Process.cpp
index 388bda6..0770364 100644
--- a/src/Platform/Unix/Process.cpp
+++ b/src/Platform/Unix/Process.cpp
@@ -53,13 +53,33 @@ namespace VeraCrypt
try
{
int argIndex = 0;
+ /* Workaround for gcc 5.X issue related to the use of STL (string and list) with muliple fork calls.
+ *
+ * The char* pointers retrieved from the elements of parameter "arguments" are no longer valid after
+ * a second fork is called. "arguments" was created in the parent of the current child process.
+ *
+ * The only solution is to copy the elements of "arguments" parameter in a local string array on this
+ * child process and then use char* pointers retrieved from this local copies before calling fork.
+ *
+ * gcc 4.x doesn't suffer from this issue.
+ *
+ */
+ string argsCopy[array_capacity (args)];
if (!execFunctor)
- args[argIndex++] = const_cast <char*> (processName.c_str());
+ {
+ argsCopy[argIndex++] = processName;
+ }
foreach (const string &arg, arguments)
{
- args[argIndex++] = const_cast <char*> (arg.c_str());
+ argsCopy[argIndex++] = arg;
}
+
+ for (int i = 0; i < argIndex; i++)
+ {
+ args[i] = const_cast <char*> (argsCopy[i].c_str());
+ }
+
args[argIndex] = nullptr;
if (inputData)