!system decodes child output as OEMCP if GetConsoleOutputCP() == GetOEMCP(), this should help bug #1092 (or fix it completely?)

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6456 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2014-03-30 22:43:49 +00:00
parent 35c1a5bae7
commit ed4f2ab384
2 changed files with 11 additions and 8 deletions

View file

@ -22,6 +22,8 @@ Released on ?, 2014
\b Try harder to find duplicate strings in string block (\W{http://sf.net/p/nsis/bugs/1088/}{bug #1088})
\b !system will decode child output as OEMCP if GetConsoleOutputCP() == GetOEMCP()
\H{v3.0a2} 3.0 Alpha 2
Released on December 24th, 2013

View file

@ -815,7 +815,7 @@ int RunChildProcessRedirected(LPCWSTR cmdprefix, LPCWSTR cmdmain)
// only way to do that is to convert the pipe content from what we hope is UTF-8.
// The reason we need a pipe in the first place is because we cannot trust the
// child to call GetConsoleOutputCP(), and even if we could, UTF-16 is not valid there.
UINT cp = CP_UTF8, mbtwcf = MB_ERR_INVALID_CHARS;
UINT cp = CP_UTF8, mbtwcf = MB_ERR_INVALID_CHARS, oemcp = GetOEMCP();
errno = ENOMEM;
if (!cmdprefix) cmdprefix = _T("");
size_t cch1 = _tcslen(cmdprefix), cch2 = _tcslen(cmdmain);
@ -825,7 +825,8 @@ int RunChildProcessRedirected(LPCWSTR cmdprefix, LPCWSTR cmdmain)
_tcscat(cmd, cmdmain);
SECURITY_DESCRIPTOR sd = {1, 0, SE_DACL_PRESENT, NULL, };
SECURITY_ATTRIBUTES sa = {sizeof(sa), &sd, true};
const UINT orgwinconcp = GetConsoleCP(), orgwinconoutcp = GetConsoleOutputCP();
const UINT orgwinconcp = GetConsoleCP(), orgwinconoutcp = GetConsoleOutputCP();
if (orgwinconoutcp == oemcp) cp = oemcp, mbtwcf = 0; // Bug #1092: Batch files not a fan of UTF-8
HANDLE hPipRd, hPipWr;
PROCESS_INFORMATION pi;
BOOL ok = CreatePipe(&hPipRd, &hPipWr, &sa, 0);
@ -847,7 +848,7 @@ int RunChildProcessRedirected(LPCWSTR cmdprefix, LPCWSTR cmdmain)
DWORD childec = -1;
if (ok)
{
bool utf8 = true, okt;
bool utf8 = CP_UTF8 == cp, okt;
char iobuf[512];
DWORD cbRead, cbOfs = 0, cchwb = 0;
WCHAR wbuf[100], wchbuf[2+1]; // A surrogate pair + \0
@ -862,10 +863,10 @@ int RunChildProcessRedirected(LPCWSTR cmdprefix, LPCWSTR cmdmain)
if (utf8)
{
okt = UTF8_GetTrailCount(iobuf[i], cbTrail);
if (!okt) // Not UTF-8? Switching to ACP
if (!okt) // Not UTF-8? Switching to a MBCS CP
{
switchtoacp:cp = CP_ACP, mbtwcf = 0, utf8 = false;
SetConsoleOutputCP(cp);
switchcp: cp = orgwinconoutcp, mbtwcf = 0, utf8 = false;
SetConsoleOutputCP(cp = (CP_UTF8 == cp ? CP_ACP : cp));
continue;
}
if (!cbTrail) cch++, wchbuf[0] = iobuf[i]; // ASCII
@ -884,7 +885,7 @@ switchtoacp:cp = CP_ACP, mbtwcf = 0, utf8 = false;
cch = MultiByteToWideChar(cp, mbtwcf, &iobuf[i], 1+cbTrail, wchbuf, COUNTOF(wchbuf)-1);
if (!cch)
{
if (utf8) goto switchtoacp;
if (utf8) goto switchcp;
cch++, wchbuf[0] = UNICODE_REPLACEMENT_CHARACTER;
}
}
@ -913,7 +914,7 @@ switchtoacp:cp = CP_ACP, mbtwcf = 0, utf8 = false;
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
SetConsoleCP(orgwinconcp); SetConsoleOutputCP(orgwinconoutcp);
SetConsoleCP(orgwinconcp), SetConsoleOutputCP(orgwinconoutcp);
CloseHandle(hPipRd);
return childec;
}