Ticket #399 (closed defect: fixed)
Destroying buffers in RPC rundown causes processes with loaded vbuf backends to crash
| Reported by: | jteh | Owned by: | |
|---|---|---|---|
| Priority: | major | Milestone: | 2010.2 |
| Component: | Browse mode | Version: | development |
| Keywords: | appCrash | Cc: | |
| Operating system: | Blocked by: | ||
| Blocking: |
Description
Str:
- Load at least one buffer with NVDA; e.g. go to a web page in Firefox or IE.
- Open Task Manager.
- Terminate the NVDA process.
Actual: The process containing the loaded buffer crashes.
Expected: The process should not crash.
Additional info:
- If you have multiple processes with loaded vbuf backends, all of them will crash.
- With a debug build, this triggers the assertion assert(runningBackends.count(this) == 0); in VBufBackend_t::~VBufBackend_t() in backend.cpp line 191.
Change History
comment:2 Changed 2 years ago by jteh
- Milestone 2009.1 deleted
- Summary changed from Killing NVDA without exiting gracefully causes processes with loaded vbuf backends to crash to Destroying buffers in RPC rundown causes processes with loaded vbuf backends to crash
r3157 disables destruction of buffers during RPC rundown. Deferring the proper fix to a future release.
comment:5 Changed 21 months ago by mdcurran
Fix implemented in changeset:nvdaHelperRemoteInjectionFix,3546.
Ticket can be closed after testing and merging of nvdaHelperRemoteInjectionFix in to main.
comment:6 Changed 20 months ago by jteh
- Status changed from new to closed
- Resolution set to fixed
Merged in changeset:main,3563.
Note: See
TracTickets for help on using
tickets.


Cause: RPC run down gets executed when NVDA dies, but all hooks were set in NVDA's process, so they get removed just before the RPC run down executes. Therefore, renderThread_terminate() never gets executed. Other hell probably occurs as well to actually cause the crash, but this is definitely the start of the problem.
The proper solution requires some redesign of nvdaHelper and is too complex for 2009.1. For now, we should just remove the RPC run down. This will cause in-proc memory leaks if NVDA is terminated forcefully, but that's far better than a crash and NVDA should hopefully not be terminated like this too often.