File 0889-Requote-for-plain-spawn.patch of Package erlang
From f0a273c5a5ebfc97cfe1e88341c803b85d2295e4 Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Wed, 16 Mar 2022 15:33:10 +0100
Subject: [PATCH 2/2] Requote for plain spawn
---
erts/emulator/sys/win32/sys.c | 30 ++++++++++++++++++++----------
1 file changed, 20 insertions(+), 10 deletions(-)
diff --git a/erts/emulator/sys/win32/sys.c b/erts/emulator/sys/win32/sys.c
index 2a41222275..fd3cb34130 100644
--- a/erts/emulator/sys/win32/sys.c
+++ b/erts/emulator/sys/win32/sys.c
@@ -76,8 +76,8 @@ static BOOL create_child_process(wchar_t *, HANDLE, HANDLE,
wchar_t **, int *);
static int create_pipe(LPHANDLE, LPHANDLE, BOOL, BOOL);
static int application_type(const wchar_t* originalName, wchar_t fullPath[MAX_PATH],
- BOOL search_in_path, BOOL handle_quotes,
- int *error_return);
+ BOOL search_in_path, BOOL handle_quotes,
+ int *error_return, BOOL *requote);
HANDLE erts_service_event;
@@ -1542,6 +1542,7 @@ create_child_process
HANDLE hProcess = GetCurrentProcess();
STARTUPINFOW siStartInfo = {0};
wchar_t execPath[MAX_PATH];
+ BOOL requote = FALSE;
*errno_return = -1;
siStartInfo.cb = sizeof(STARTUPINFOW);
@@ -1562,7 +1563,8 @@ create_child_process
thecommand[cmdlength] = L'\0';
DEBUGF(("spawn command: %S\n", thecommand));
- applType = application_type(thecommand, execPath, TRUE, TRUE, errno_return);
+ applType =
+ application_type(thecommand, execPath, TRUE, TRUE, errno_return, &requote);
DEBUGF(("application_type returned for (%S) is %d\n", thecommand, applType));
erts_free(ERTS_ALC_T_TMP, (void *) thecommand);
if (applType == APPL_NONE) {
@@ -1590,10 +1592,16 @@ create_child_process
createFlags = 0;
}
+ if (requote) {
+ wcscat(newcmdline, L"\"");
+ }
wcscat(newcmdline, execPath);
+ if (requote) {
+ wcscat(newcmdline, L"\"");
+ }
wcscat(newcmdline, origcmd+cmdlength);
DEBUGF(("Creating child process: %S, createFlags = %d\n", newcmdline, createFlags));
- ok = CreateProcessW(execPath,
+ ok = CreateProcessW((applType == APPL_DOS) ? appname : execPath,
newcmdline,
NULL,
NULL,
@@ -1608,7 +1616,8 @@ create_child_process
} else { /* ERTS_SPAWN_EXECUTABLE, filename and args are in unicode ({utf16,little}) */
int run_cmd = 0;
- applType = application_type(origcmd, execPath, FALSE, FALSE, errno_return);
+ applType =
+ application_type(origcmd, execPath, FALSE, FALSE, errno_return, &requote);
if (applType == APPL_NONE) {
return FALSE;
}
@@ -1630,7 +1639,8 @@ create_child_process
if (run_cmd) {
wchar_t cmdPath[MAX_PATH];
int cmdType;
- cmdType = application_type(L"cmd.exe", cmdPath, TRUE, FALSE, errno_return);
+ cmdType =
+ application_type(L"cmd.exe", cmdPath, TRUE, FALSE, errno_return, &requote);
if (cmdType == APPL_NONE || cmdType == APPL_DOS) {
return FALSE;
}
@@ -1822,7 +1832,8 @@ static int application_type (const wchar_t *originalName, /* Name of the applica
* application. */
BOOL search_in_path, /* If we should search the system wide path */
BOOL handle_quotes, /* If we should handle quotes around executable */
- int *error_return) /* A place to put an error code */
+ int *error_return, /* A place to put an error code */
+ BOOL *requote) /* The path needs requoting */
{
int applType, i;
HANDLE hFile;
@@ -1831,18 +1842,17 @@ static int application_type (const wchar_t *originalName, /* Name of the applica
DWORD read;
IMAGE_DOS_HEADER header;
static wchar_t extensions[][5] = {L"", L".com", L".exe", L".bat"};
- int is_quoted;
int len;
wchar_t xfullpath[MAX_PATH];
len = wcslen(originalName);
- is_quoted = handle_quotes && len > 0 && originalName[0] == L'"' &&
+ *requote = handle_quotes && len > 0 && originalName[0] == L'"' &&
originalName[len-1] == L'"';
applType = APPL_NONE;
*error_return = ENOENT;
for (i = 0; i < (int) (sizeof(extensions) / sizeof(extensions[0])); i++) {
- if(is_quoted) {
+ if(*requote) {
lstrcpynW(xfullpath, originalName+1, MAX_PATH - 7); /* Cannot start using StringCchCopy yet, we support
older platforms */
len = wcslen(xfullpath);
--
2.34.1