mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-12-28 21:02:25 +01:00
55 lines
2.0 KiB
Diff
55 lines
2.0 KiB
Diff
From 646679da4d79bf7f8af22c44c7ae8498086a88a6 Mon Sep 17 00:00:00 2001
|
|
From: Mounir IDRASSI <mounir.idrassi@idrix.fr>
|
|
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 <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)
|