1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2024-11-23 01:49:53 +03:00

Merge pull request #258 from ajeecai/Run_deadlock

Fix a deadlock when Run() to create a process.
This commit is contained in:
Moataz Elmasry 2018-04-21 23:41:52 +02:00 committed by GitHub
commit b1f74268b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

47
src/Mayaqua/Unix.c Normal file → Executable file
View File

@ -1219,7 +1219,9 @@ bool UnixRunW(wchar_t *filename, wchar_t *arg, bool hide, bool wait)
bool UnixRun(char *filename, char *arg, bool hide, bool wait) bool UnixRun(char *filename, char *arg, bool hide, bool wait)
{ {
TOKEN_LIST *t; TOKEN_LIST *t;
char **args;
UINT ret; UINT ret;
// Validate arguments // Validate arguments
if (filename == NULL) if (filename == NULL)
{ {
@ -1230,6 +1232,25 @@ bool UnixRun(char *filename, char *arg, bool hide, bool wait)
arg = ""; arg = "";
} }
Print("", filename, arg);
t = ParseToken(arg, " ");
if (t == NULL)
{
return false;
}
else
{
UINT num_args;
UINT i;
num_args = t->NumTokens + 2;
args = ZeroMalloc(sizeof(char *) * num_args);
args[0] = filename;
for (i = 1;i < num_args - 1;i++)
{
args[i] = t->Token[i - 1];
}
}
// Create a child process // Create a child process
ret = fork(); ret = fork();
if (ret == -1) if (ret == -1)
@ -1240,39 +1261,21 @@ bool UnixRun(char *filename, char *arg, bool hide, bool wait)
if (ret == 0) if (ret == 0)
{ {
Print("", filename, arg);
// Child process // Child process
if (hide) if (hide)
{ {
// Close the standard I/O // Close the standard I/O
UnixCloseIO(); UnixCloseIO();
} }
execvp(filename, args);
t = ParseToken(arg, " "); AbortExit();
if (t == NULL)
{
AbortExit();
}
else
{
char **args;
UINT num_args;
UINT i;
num_args = t->NumTokens + 2;
args = ZeroMalloc(sizeof(char *) * num_args);
args[0] = filename;
for (i = 1;i < num_args - 1;i++)
{
args[i] = t->Token[i - 1];
}
execvp(filename, args);
AbortExit();
}
} }
else else
{ {
// Parent process // Parent process
pid_t pid = (pid_t)ret; pid_t pid = (pid_t)ret;
Free(args);
FreeToken(t);
if (wait) if (wait)
{ {