In our primary hotspot signal handlers, SafeFetch handling is limited to JavaThread objects:
```
JavaThread* thread = NULL;
...
if(t->is_Java_thread()) {
thread = (JavaThread*)t;
}
...
if (info != NULL && uc != NULL && thread != NULL) {
pc = (address) os::Linux::ucontext_get_pc(uc);
if (StubRoutines::is_safefetch_fault(pc)) {
```
As a result of this, using SafeFetch may crash non-JavaThreads if the location is invalid. E.g. using SafeFetch inside a VMOperation may crash the VM.
This is unfortunate since SafeFetch is used for os::is_readable_pointer() which explicitly promises to not crash. It is used e.g. in os::print_hex_dump(). There is also no reason why SafeFetch would not work for non-JavaThreads. In fact, SafeFetch handling for the secondary signal handler works just fine for all threads.
This is an old bug, unrelated to the recent Posix cleanups. AFAICS it has been there at least since Jdk11.