8011773: Some tests on Interned String crashed JVM with OOM

Mon, 29 Apr 2013 16:13:57 -0400

author
hseigel
date
Mon, 29 Apr 2013 16:13:57 -0400
changeset 4987
f258c5828eb8
parent 4985
3c9b7ef92c61
child 4988
c53e49efe6a8

8011773: Some tests on Interned String crashed JVM with OOM
Summary: Instead of terminating the VM, throw OutOfMemoryError exceptions.
Reviewed-by: coleenp, dholmes

src/share/vm/classfile/javaClasses.cpp file | annotate | diff | comparison | revisions
src/share/vm/classfile/javaClasses.hpp file | annotate | diff | comparison | revisions
src/share/vm/classfile/symbolTable.cpp file | annotate | diff | comparison | revisions
src/share/vm/memory/allocation.hpp file | annotate | diff | comparison | revisions
src/share/vm/oops/oop.cpp file | annotate | diff | comparison | revisions
src/share/vm/prims/whitebox.cpp file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/vm/classfile/javaClasses.cpp	Fri Apr 26 08:40:24 2013 -0700
     1.2 +++ b/src/share/vm/classfile/javaClasses.cpp	Mon Apr 29 16:13:57 2013 -0400
     1.3 @@ -315,14 +315,18 @@
     1.4    return string;
     1.5  }
     1.6  
     1.7 -jchar* java_lang_String::as_unicode_string(oop java_string, int& length) {
     1.8 +jchar* java_lang_String::as_unicode_string(oop java_string, int& length, TRAPS) {
     1.9    typeArrayOop value  = java_lang_String::value(java_string);
    1.10    int          offset = java_lang_String::offset(java_string);
    1.11                 length = java_lang_String::length(java_string);
    1.12  
    1.13 -  jchar* result = NEW_RESOURCE_ARRAY(jchar, length);
    1.14 -  for (int index = 0; index < length; index++) {
    1.15 -    result[index] = value->char_at(index + offset);
    1.16 +  jchar* result = NEW_RESOURCE_ARRAY_RETURN_NULL(jchar, length);
    1.17 +  if (result != NULL) {
    1.18 +    for (int index = 0; index < length; index++) {
    1.19 +      result[index] = value->char_at(index + offset);
    1.20 +    }
    1.21 +  } else {
    1.22 +    THROW_MSG_0(vmSymbols::java_lang_OutOfMemoryError(), "could not allocate Unicode string");
    1.23    }
    1.24    return result;
    1.25  }
     2.1 --- a/src/share/vm/classfile/javaClasses.hpp	Fri Apr 26 08:40:24 2013 -0700
     2.2 +++ b/src/share/vm/classfile/javaClasses.hpp	Mon Apr 29 16:13:57 2013 -0400
     2.3 @@ -153,7 +153,7 @@
     2.4    static char*  as_utf8_string(oop java_string, char* buf, int buflen);
     2.5    static char*  as_utf8_string(oop java_string, int start, int len);
     2.6    static char*  as_platform_dependent_str(Handle java_string, TRAPS);
     2.7 -  static jchar* as_unicode_string(oop java_string, int& length);
     2.8 +  static jchar* as_unicode_string(oop java_string, int& length, TRAPS);
     2.9    // produce an ascii string with all other values quoted using \u####
    2.10    static char*  as_quoted_ascii(oop java_string);
    2.11  
     3.1 --- a/src/share/vm/classfile/symbolTable.cpp	Fri Apr 26 08:40:24 2013 -0700
     3.2 +++ b/src/share/vm/classfile/symbolTable.cpp	Mon Apr 29 16:13:57 2013 -0400
     3.3 @@ -735,7 +735,7 @@
     3.4    ResourceMark rm(THREAD);
     3.5    int length;
     3.6    Handle h_string (THREAD, string);
     3.7 -  jchar* chars = java_lang_String::as_unicode_string(string, length);
     3.8 +  jchar* chars = java_lang_String::as_unicode_string(string, length, CHECK_NULL);
     3.9    oop result = intern(h_string, chars, length, CHECK_NULL);
    3.10    return result;
    3.11  }
     4.1 --- a/src/share/vm/memory/allocation.hpp	Fri Apr 26 08:40:24 2013 -0700
     4.2 +++ b/src/share/vm/memory/allocation.hpp	Mon Apr 29 16:13:57 2013 -0400
     4.3 @@ -539,6 +539,9 @@
     4.4  #define NEW_RESOURCE_ARRAY(type, size)\
     4.5    (type*) resource_allocate_bytes((size) * sizeof(type))
     4.6  
     4.7 +#define NEW_RESOURCE_ARRAY_RETURN_NULL(type, size)\
     4.8 +  (type*) resource_allocate_bytes((size) * sizeof(type), AllocFailStrategy::RETURN_NULL)
     4.9 +
    4.10  #define NEW_RESOURCE_ARRAY_IN_THREAD(thread, type, size)\
    4.11    (type*) resource_allocate_bytes(thread, (size) * sizeof(type))
    4.12  
     5.1 --- a/src/share/vm/oops/oop.cpp	Fri Apr 26 08:40:24 2013 -0700
     5.2 +++ b/src/share/vm/oops/oop.cpp	Mon Apr 29 16:13:57 2013 -0400
     5.3 @@ -1,5 +1,5 @@
     5.4  /*
     5.5 - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
     5.6 + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
     5.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     5.8   *
     5.9   * This code is free software; you can redistribute it and/or modify it
    5.10 @@ -103,11 +103,17 @@
    5.11  
    5.12  // When String table needs to rehash
    5.13  unsigned int oopDesc::new_hash(jint seed) {
    5.14 +  EXCEPTION_MARK;
    5.15    ResourceMark rm;
    5.16    int length;
    5.17 -  jchar* chars = java_lang_String::as_unicode_string(this, length);
    5.18 -  // Use alternate hashing algorithm on the string
    5.19 -  return AltHashing::murmur3_32(seed, chars, length);
    5.20 +  jchar* chars = java_lang_String::as_unicode_string(this, length, THREAD);
    5.21 +  if (chars != NULL) {
    5.22 +    // Use alternate hashing algorithm on the string
    5.23 +    return AltHashing::murmur3_32(seed, chars, length);
    5.24 +  } else {
    5.25 +    vm_exit_out_of_memory(length, "unable to create Unicode strings for String table rehash");
    5.26 +    return 0;
    5.27 +  }
    5.28  }
    5.29  
    5.30  VerifyOopClosure VerifyOopClosure::verify_oop;
     6.1 --- a/src/share/vm/prims/whitebox.cpp	Fri Apr 26 08:40:24 2013 -0700
     6.2 +++ b/src/share/vm/prims/whitebox.cpp	Mon Apr 29 16:13:57 2013 -0400
     6.3 @@ -1,5 +1,5 @@
     6.4  /*
     6.5 - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
     6.6 + * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
     6.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     6.8   *
     6.9   * This code is free software; you can redistribute it and/or modify it
    6.10 @@ -310,12 +310,8 @@
    6.11  WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString))
    6.12    ResourceMark rm(THREAD);
    6.13    int len;
    6.14 -  jchar* name = java_lang_String::as_unicode_string(JNIHandles::resolve(javaString), len);
    6.15 -  oop found_string = StringTable::the_table()->lookup(name, len);
    6.16 -  if (found_string == NULL) {
    6.17 -        return false;
    6.18 -  }
    6.19 -  return true;
    6.20 +  jchar* name = java_lang_String::as_unicode_string(JNIHandles::resolve(javaString), len, CHECK_false);
    6.21 +  return (StringTable::lookup(name, len) != NULL);
    6.22  WB_END
    6.23  
    6.24  

mercurial