--- a/src/hotspot/share/oops/symbol.cpp Thu Oct 04 14:03:13 2018 +0200
+++ b/src/hotspot/share/oops/symbol.cpp Thu Oct 04 16:39:07 2018 +0200
@@ -26,6 +26,7 @@
#include "precompiled.hpp"
#include "classfile/altHashing.hpp"
#include "classfile/classLoaderData.hpp"
+#include "gc/shared/collectedHeap.hpp"
#include "logging/log.hpp"
#include "logging/logStream.hpp"
#include "memory/allocation.inline.hpp"
@@ -317,5 +318,21 @@
}
}
+bool Symbol::is_valid(Symbol* s) {
+ if (!is_aligned(s, sizeof(MetaWord))) return false;
+ if ((size_t)s < os::min_page_size()) return false;
+
+ if (!os::is_readable_range(s, s + 1)) return false;
+
+ // Symbols are not allocated in Java heap.
+ if (Universe::heap()->is_in_reserved(s)) return false;
+
+ int len = s->utf8_length();
+ if (len < 0) return false;
+
+ jbyte* bytes = (jbyte*) s->bytes();
+ return os::is_readable_range(bytes, bytes + len);
+}
+
// SymbolTable prints this in its statistics
NOT_PRODUCT(size_t Symbol::_total_count = 0;)