Author: akhaldi Date: Thu Sep 4 13:39:51 2014 New Revision: 64035
URL: http://svn.reactos.org/svn/reactos?rev=64035&view=rev Log: [MSVCRT] * Use Wine's _pclose(). Fixes msvcrt:misc crash. CORE-8080
Modified: trunk/reactos/lib/sdk/crt/stdio/popen.c
Modified: trunk/reactos/lib/sdk/crt/stdio/popen.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/stdio/popen.c?r... ============================================================================== --- trunk/reactos/lib/sdk/crt/stdio/popen.c [iso-8859-1] (original) +++ trunk/reactos/lib/sdk/crt/stdio/popen.c [iso-8859-1] Thu Sep 4 13:39:51 2014 @@ -20,6 +20,14 @@
int alloc_fd(HANDLE hand, int flag); //FIXME: Remove unsigned split_oflags(unsigned oflags); //FIXME: Remove + +#ifndef _UNICODE +static struct popen_handle { + FILE *f; + HANDLE proc; +} *popen_handles; +static DWORD popen_handles_size; +#endif
/* * @implemented @@ -130,16 +138,40 @@ /* * @implemented */ -int _pclose (FILE *pp) +int CDECL _pclose(FILE* file) { - TRACE("_pclose(%x)",pp); + HANDLE h; + DWORD i;
- fclose(pp); - //if (!TerminateProcess(pp->_tmpfname ,0)) - // return( -1 ); - return( 0 ); + if (!MSVCRT_CHECK_PMT(file != NULL)) return -1; + + _mlock(_POPEN_LOCK); + for(i=0; i<popen_handles_size; i++) + { + if (popen_handles[i].f == file) + break; + } + if(i == popen_handles_size) + { + _munlock(_POPEN_LOCK); + *_errno() = EBADF; + return -1; + } + + h = popen_handles[i].proc; + popen_handles[i].f = NULL; + _munlock(_POPEN_LOCK); + + fclose(file); + if(WaitForSingleObject(h, INFINITE)==WAIT_FAILED || !GetExitCodeProcess(h, &i)) + { + _dosmaperr(GetLastError()); + CloseHandle(h); + return -1; + } + + CloseHandle(h); + return i; }
#endif - -