From 646679da4d79bf7f8af22c44c7ae8498086a88a6 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Fri, 18 Mar 2016 16:25:48 +0100 Subject: [PATCH] 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. --- Platform/Unix/Process.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Platform/Unix/Process.cpp b/Platform/Unix/Process.cpp index 388bda6..0770364 100644 --- a/Platform/Unix/Process.cpp +++ b/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 (processName.c_str()); + { + argsCopy[argIndex++] = processName; + } foreach (const string &arg, arguments) { - args[argIndex++] = const_cast (arg.c_str()); + argsCopy[argIndex++] = arg; } + + for (int i = 0; i < argIndex; i++) + { + args[i] = const_cast (argsCopy[i].c_str()); + } + args[argIndex] = nullptr; if (inputData)