src/share/vm/prims/jvmtiTagMap.cpp

Print this page
rev 7665 : 6584008: jvmtiStringPrimitiveCallback should not be invoked when string value is null
Summary: Fix a crash in the jvmtiStringPrimitiveCallback.
Reviewed-by: sla


1029     case JVMTI_PRIMITIVE_TYPE_BYTE    : { v->b = *(jbyte*)addr;    break; }
1030     case JVMTI_PRIMITIVE_TYPE_CHAR    : { v->c = *(jchar*)addr;    break; }
1031     case JVMTI_PRIMITIVE_TYPE_SHORT   : { v->s = *(jshort*)addr;   break; }
1032     case JVMTI_PRIMITIVE_TYPE_INT     : { v->i = *(jint*)addr;     break; }
1033     case JVMTI_PRIMITIVE_TYPE_LONG    : { v->j = *(jlong*)addr;    break; }
1034     case JVMTI_PRIMITIVE_TYPE_FLOAT   : { v->f = *(jfloat*)addr;   break; }
1035     case JVMTI_PRIMITIVE_TYPE_DOUBLE  : { v->d = *(jdouble*)addr;  break; }
1036     default: ShouldNotReachHere();
1037   }
1038 }
1039 
1040 // helper function to invoke string primitive value callback
1041 // returns visit control flags
1042 static jint invoke_string_value_callback(jvmtiStringPrimitiveValueCallback cb,
1043                                          CallbackWrapper* wrapper,
1044                                          oop str,
1045                                          void* user_data)
1046 {
1047   assert(str->klass() == SystemDictionary::String_klass(), "not a string");
1048 







1049   // get the string value and length
1050   // (string value may be offset from the base)
1051   int s_len = java_lang_String::length(str);
1052   typeArrayOop s_value = java_lang_String::value(str);
1053   int s_offset = java_lang_String::offset(str);
1054   jchar* value;
1055   if (s_len > 0) {
1056     value = s_value->char_at_addr(s_offset);
1057   } else {
1058     value = (jchar*) s_value->base(T_CHAR);
1059   }
1060 
1061   // invoke the callback
1062   return (*cb)(wrapper->klass_tag(),
1063                wrapper->obj_size(),
1064                wrapper->obj_tag_p(),
1065                value,
1066                (jint)s_len,
1067                user_data);
1068 }
1069 
1070 // helper function to invoke string primitive value callback
1071 // returns visit control flags
1072 static jint invoke_array_primitive_value_callback(jvmtiArrayPrimitiveValueCallback cb,




1029     case JVMTI_PRIMITIVE_TYPE_BYTE    : { v->b = *(jbyte*)addr;    break; }
1030     case JVMTI_PRIMITIVE_TYPE_CHAR    : { v->c = *(jchar*)addr;    break; }
1031     case JVMTI_PRIMITIVE_TYPE_SHORT   : { v->s = *(jshort*)addr;   break; }
1032     case JVMTI_PRIMITIVE_TYPE_INT     : { v->i = *(jint*)addr;     break; }
1033     case JVMTI_PRIMITIVE_TYPE_LONG    : { v->j = *(jlong*)addr;    break; }
1034     case JVMTI_PRIMITIVE_TYPE_FLOAT   : { v->f = *(jfloat*)addr;   break; }
1035     case JVMTI_PRIMITIVE_TYPE_DOUBLE  : { v->d = *(jdouble*)addr;  break; }
1036     default: ShouldNotReachHere();
1037   }
1038 }
1039 
1040 // helper function to invoke string primitive value callback
1041 // returns visit control flags
1042 static jint invoke_string_value_callback(jvmtiStringPrimitiveValueCallback cb,
1043                                          CallbackWrapper* wrapper,
1044                                          oop str,
1045                                          void* user_data)
1046 {
1047   assert(str->klass() == SystemDictionary::String_klass(), "not a string");
1048 
1049   typeArrayOop s_value = java_lang_String::value(str);
1050 
1051   // JDK-6584008: the value field may be null if a String instance is
1052   // partially constructed.
1053   if (s_value == NULL) {
1054     return 0;
1055   }
1056   // get the string value and length
1057   // (string value may be offset from the base)
1058   int s_len = java_lang_String::length(str);

1059   int s_offset = java_lang_String::offset(str);
1060   jchar* value;
1061   if (s_len > 0) {
1062     value = s_value->char_at_addr(s_offset);
1063   } else {
1064     value = (jchar*) s_value->base(T_CHAR);
1065   }
1066 
1067   // invoke the callback
1068   return (*cb)(wrapper->klass_tag(),
1069                wrapper->obj_size(),
1070                wrapper->obj_tag_p(),
1071                value,
1072                (jint)s_len,
1073                user_data);
1074 }
1075 
1076 // helper function to invoke string primitive value callback
1077 // returns visit control flags
1078 static jint invoke_array_primitive_value_callback(jvmtiArrayPrimitiveValueCallback cb,