void ClearNSPRIOInterposing() { // If we have already cleared IO interposing, or not initialized it this is // actually bad. MOZ_ASSERT(sCloseFn && sReadFn && sWriteFn && sFSyncFn && sFileInfoFn && sFileInfo64Fn); // Get IO methods from NSPR and const cast the structure so we can modify it. PRIOMethods* methods = const_cast<PRIOMethods*>(PR_GetFileMethods()); // Something is badly wrong if we don't get IO methods... However, we don't // want to crash over that in non-debug builds. This is unlikely to happen // so an assert is enough, no need to report it to the caller. MOZ_ASSERT(methods); if (!methods) { return; } // Restore original functions methods->close = sCloseFn; methods->read = sReadFn; methods->write = sWriteFn; methods->fsync = sFSyncFn; methods->fileInfo = sFileInfoFn; methods->fileInfo64 = sFileInfo64Fn; // Forget about original functions sCloseFn = nullptr; sReadFn = nullptr; sWriteFn = nullptr; sFSyncFn = nullptr; sFileInfoFn = nullptr; sFileInfo64Fn = nullptr; }
void _PR_InitIO(void) { const PRIOMethods *methods = PR_GetFileMethods(); _PR_InitFdCache(); _pr_flock_lock = PR_NewLock(); _pr_flock_cv = PR_NewCondVar(_pr_flock_lock); #ifdef WIN32 _pr_stdin = PR_AllocFileDesc((PROsfd)GetStdHandle(STD_INPUT_HANDLE), methods); _pr_stdout = PR_AllocFileDesc((PROsfd)GetStdHandle(STD_OUTPUT_HANDLE), methods); _pr_stderr = PR_AllocFileDesc((PROsfd)GetStdHandle(STD_ERROR_HANDLE), methods); #ifdef WINNT _pr_stdin->secret->md.sync_file_io = PR_TRUE; _pr_stdout->secret->md.sync_file_io = PR_TRUE; _pr_stderr->secret->md.sync_file_io = PR_TRUE; #endif #else _pr_stdin = PR_AllocFileDesc(0, methods); _pr_stdout = PR_AllocFileDesc(1, methods); _pr_stderr = PR_AllocFileDesc(2, methods); #endif _PR_MD_INIT_FD_INHERITABLE(_pr_stdin, PR_TRUE); _PR_MD_INIT_FD_INHERITABLE(_pr_stdout, PR_TRUE); _PR_MD_INIT_FD_INHERITABLE(_pr_stderr, PR_TRUE); _PR_MD_INIT_IO(); }
void InitNSPRIOInterposing() { // Check that we have not interposed any of the IO methods before MOZ_ASSERT(!sCloseFn && !sReadFn && !sWriteFn && !sFSyncFn && !sFileInfoFn && !sFileInfo64Fn); // We can't actually use this assertion because we initialize this code // before XPCOM is initialized, so NS_IsMainThread() always returns false. // MOZ_ASSERT(NS_IsMainThread()); // Get IO methods from NSPR and const cast the structure so we can modify it. PRIOMethods* methods = const_cast<PRIOMethods*>(PR_GetFileMethods()); // Something is badly wrong if we don't get IO methods... However, we don't // want to crash over that in non-debug builds. This is unlikely to happen // so an assert is enough, no need to report it to the caller. MOZ_ASSERT(methods); if (!methods) { return; } // Store original functions sCloseFn = methods->close; sReadFn = methods->read; sWriteFn = methods->write; sFSyncFn = methods->fsync; sFileInfoFn = methods->fileInfo; sFileInfo64Fn = methods->fileInfo64; // Overwrite with our interposed functions methods->close = &interposedClose; methods->read = &interposedRead; methods->write = &interposedWrite; methods->fsync = &interposedFSync; methods->fileInfo = &interposedFileInfo; methods->fileInfo64 = &interposedFileInfo64; }