X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d7ef641d4e6d0e2157beb920bdd7d72fc6aecfd7..c084a1ac064cff672b777e1e6a3624fd838387e7:/src/msw/utilsexc.cpp diff --git a/src/msw/utilsexc.cpp b/src/msw/utilsexc.cpp index 515d506d63..f67e0eb11d 100644 --- a/src/msw/utilsexc.cpp +++ b/src/msw/utilsexc.cpp @@ -433,8 +433,19 @@ wxPipeInputStream::~wxPipeInputStream() bool wxPipeInputStream::CanRead() const { + // we can read if there's something in the put back buffer + // even pipe is closed + if ( m_wbacksize > m_wbackcur ) + return true; + + wxPipeInputStream * const self = wxConstCast(this, wxPipeInputStream); + if ( !IsOpened() ) + { + // set back to mark Eof as it may have been unset by Ungetch() + self->m_lasterror = wxSTREAM_EOF; return false; + } DWORD nAvailable; @@ -460,8 +471,6 @@ bool wxPipeInputStream::CanRead() const // it had been closed ::CloseHandle(m_hInput); - wxPipeInputStream *self = wxConstCast(this, wxPipeInputStream); - self->m_hInput = INVALID_HANDLE_VALUE; self->m_lasterror = wxSTREAM_EOF; @@ -1018,9 +1027,34 @@ long wxExecuteImpl(CharType **argv, int flags, wxProcess *handler) wxString command; command.reserve(1024); + wxString arg; for ( ;; ) { - command += *argv++; + arg = *argv++; + + bool quote; + if ( arg.empty() ) + { + // we need to quote empty arguments, otherwise they'd just + // disappear + quote = true; + } + else // non-empty + { + // escape any quotes present in the string to avoid interfering + // with the command line parsing in the child process + arg.Replace("\"", "\\\"", true /* replace all */); + + // and quote any arguments containing the spaces to prevent them from + // being broken down + quote = arg.find_first_of(" \t") != wxString::npos; + } + + if ( quote ) + command += '\"' + arg + '\"'; + else + command += arg; + if ( !*argv ) break;