6567360: 3/4 SIGBUS in jvmti RawMonitor magic check for unaligned bad monitor pointer
Change JvmtiEnvBase::is_valid() and JvmtiRawMonitor::is_valid() to fetch the _magic fields via Bytes::get_native_u[248](). Reviewed-by: coleenp, swamyv
This commit is contained in:
parent
da3f81559f
commit
8aebf28301
@ -94,6 +94,35 @@ JvmtiEnvBase::initialize() {
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
JvmtiEnvBase::is_valid() {
|
||||
jint value = 0;
|
||||
|
||||
// This object might not be a JvmtiEnvBase so we can't assume
|
||||
// the _magic field is properly aligned. Get the value in a safe
|
||||
// way and then check against JVMTI_MAGIC.
|
||||
|
||||
switch (sizeof(_magic)) {
|
||||
case 2:
|
||||
value = Bytes::get_native_u2((address)&_magic);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
value = Bytes::get_native_u4((address)&_magic);
|
||||
break;
|
||||
|
||||
case 8:
|
||||
value = Bytes::get_native_u8((address)&_magic);
|
||||
break;
|
||||
|
||||
default:
|
||||
guarantee(false, "_magic field is an unexpected size");
|
||||
}
|
||||
|
||||
return value == JVMTI_MAGIC;
|
||||
}
|
||||
|
||||
|
||||
JvmtiEnvBase::JvmtiEnvBase() : _env_event_enable() {
|
||||
_env_local_storage = NULL;
|
||||
_tag_map = NULL;
|
||||
|
@ -120,7 +120,7 @@ class JvmtiEnvBase : public CHeapObj {
|
||||
|
||||
public:
|
||||
|
||||
bool is_valid() { return _magic == JVMTI_MAGIC; }
|
||||
bool is_valid();
|
||||
|
||||
bool is_retransformable() { return _is_retransformable; }
|
||||
|
||||
|
@ -238,6 +238,35 @@ JvmtiRawMonitor::~JvmtiRawMonitor() {
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
JvmtiRawMonitor::is_valid() {
|
||||
int value = 0;
|
||||
|
||||
// This object might not be a JvmtiRawMonitor so we can't assume
|
||||
// the _magic field is properly aligned. Get the value in a safe
|
||||
// way and then check against JVMTI_RM_MAGIC.
|
||||
|
||||
switch (sizeof(_magic)) {
|
||||
case 2:
|
||||
value = Bytes::get_native_u2((address)&_magic);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
value = Bytes::get_native_u4((address)&_magic);
|
||||
break;
|
||||
|
||||
case 8:
|
||||
value = Bytes::get_native_u8((address)&_magic);
|
||||
break;
|
||||
|
||||
default:
|
||||
guarantee(false, "_magic field is an unexpected size");
|
||||
}
|
||||
|
||||
return value == JVMTI_RM_MAGIC;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// class JvmtiBreakpoint
|
||||
//
|
||||
|
@ -349,7 +349,7 @@ public:
|
||||
~JvmtiRawMonitor();
|
||||
int magic() { return _magic; }
|
||||
const char *get_name() { return _name; }
|
||||
bool is_valid() { return _magic == JVMTI_RM_MAGIC; }
|
||||
bool is_valid();
|
||||
};
|
||||
|
||||
// Onload pending raw monitors
|
||||
|
Loading…
Reference in New Issue
Block a user