|
From: <we...@cw...> - 2002-05-08 15:16:18
|
Quoting Hartmut Birr <har...@te...>: > > If two processes have a not present fault within the same address range, > there is called MmNotPresentFaultSectionView. The first get the pageop > and handles the fault. The second use this page, if the event in the pageop > is signaled. If the first process terminate before the second can map the > page, than is the page unmapped and not longer valid. There occurs a bug > check within the following call to MmReferencePage. If gcc uses piping, > there are started three processes within a short time and two of them > does also exit at the same time. The page fault occurs within msvcrt.dll when > __atexit_ptr is accessed from exit. The faulting address is __atexit_ptr. > The first fix was to init this variable within DllMain but the real > problem is in MmNotPresentFaultSectionView. > Ok, thanks for the explanation. I don't think this fixes all the problems of this type: for example MmNotPresentFaultSectionView doesn't even reference the section so it could be freed by the time it returns after waiting for the page operation. The fix I was considering was to check for pending page operations on a unmap/process exit and either wait for them to complete or abandon freeing section pages that are about to be used in another process. |