Skip to content

Commit

Permalink
Merge pull request #5184 from keithc-ca/vmcheck
Browse files Browse the repository at this point in the history
Add checks that romClassBuilder is not NULL
  • Loading branch information
gacholio authored Mar 21, 2019
2 parents 927d075 + 5470ffb commit 0077014
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 53 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2001, 2018 IBM Corp. and others
* Copyright (c) 2001, 2019 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
Expand Down Expand Up @@ -39,6 +39,7 @@
import com.ibm.j9ddr.vm29.pointer.U32Pointer;
import com.ibm.j9ddr.vm29.pointer.U8Pointer;
import com.ibm.j9ddr.vm29.pointer.UDATAPointer;
import com.ibm.j9ddr.vm29.pointer.generated.J9BuildFlags;
import com.ibm.j9ddr.vm29.pointer.generated.J9ClassLoaderPointer;
import com.ibm.j9ddr.vm29.pointer.generated.J9ClassPointer;
import com.ibm.j9ddr.vm29.pointer.generated.J9ConstantPoolPointer;
Expand Down Expand Up @@ -70,7 +71,6 @@
public class VmCheckCommand extends Command
{
private static final String nl = System.getProperty("line.separator");
private static final int J9_XACCESS_EXCLUSIVE = 2; /* TODO: Should be refactored out of here. */

public VmCheckCommand()
{
Expand Down Expand Up @@ -126,7 +126,7 @@ private void reportMessage(PrintStream out, String format, Object... args) {
}

/*
* Based on vmchk/checkthreads.c r1.5
* Based on runtime/vmchk/checkthreads.c
*
* J9VMThread sanity:
* Valid VM check:
Expand All @@ -140,7 +140,7 @@ private void checkJ9VMThreadSanity(J9JavaVMPointer javaVM, PrintStream out) thro

int count = 0;
int numberOfThreadsWithVMAccess = 0;
boolean exclusiveVMAccess = javaVM.exclusiveAccessState().eq(J9_XACCESS_EXCLUSIVE);
boolean exclusiveVMAccess = javaVM.exclusiveAccessState().eq(J9Consts.J9_XACCESS_EXCLUSIVE);

reportMessage(out, "Checking threads");

Expand All @@ -149,11 +149,13 @@ private void checkJ9VMThreadSanity(J9JavaVMPointer javaVM, PrintStream out) thro

verifyJ9VMThread(out, thread, javaVM);

if (thread.publicFlags().allBitsIn(J9Consts.J9_PUBLIC_FLAGS_VM_ACCESS)) {
numberOfThreadsWithVMAccess++;
if (thread.inNative().eq(0)) {
if (thread.publicFlags().allBitsIn(J9Consts.J9_PUBLIC_FLAGS_VM_ACCESS)) {
numberOfThreadsWithVMAccess += 1;
}
}

count++;
count += 1;
}

if (exclusiveVMAccess && numberOfThreadsWithVMAccess > 1) {
Expand Down Expand Up @@ -743,39 +745,41 @@ private boolean findROMMethodInClass(J9JavaVMPointer vm, J9ROMClassPointer romCl
}

/*
* Based on vmchk/checkinterntable.c r1.3
* Based on runtime/vmchk/checkinterntable.c
*
* J9LocalInternTableSanity sanity:
* if J9JavaVM->dynamicLoadBuffers != NULL
* if (J9JavaVM->dynamicLoadBuffers != NULL) && (J9JavaVM->dynamicLoadBuffers->romClassBuilder != NULL)
* invariantInternTree check:
* For each J9InternHashTableEntry
* Ensure J9InternHashTableEntry->utf8 is valid
* Ensure J9InternHashTableEntry->classLoader is valid
*/
private void checkLocalInternTableSanity(J9JavaVMPointer vm, PrintStream out) throws CorruptDataException {
int count = 0;

reportMessage(out, "Checking ROM intern string nodes");

J9TranslationBufferSetPointer dynamicLoadBuffers = vm.dynamicLoadBuffers();
if(!dynamicLoadBuffers.isNull()) {
if (dynamicLoadBuffers.notNull()) {
J9DbgROMClassBuilderPointer romClassBuilder = J9DbgROMClassBuilderPointer.cast(dynamicLoadBuffers.romClassBuilder());
J9DbgStringInternTablePointer stringInternTable = romClassBuilder.stringInternTable();
J9InternHashTableEntryPointer node = stringInternTable.headNode();
while(!node.isNull()) {
J9UTF8Pointer utf8 = node.utf8();
J9ClassLoaderPointer classLoader = node.classLoader();
if(!verifyUTF8(utf8)) {
reportError(out, "invalid utf8=0x%s for node=0x%s",
Long.toHexString(utf8.getAddress()), Long.toHexString(node.getAddress()));
}
if(!verifyJ9ClassLoader(vm, classLoader)) {
reportError(out, "invalid classLoader=0x%s for node=0x%s",
Long.toHexString(classLoader.getAddress()), Long.toHexString(node.getAddress()));
if (romClassBuilder.notNull()) {
J9DbgStringInternTablePointer stringInternTable = romClassBuilder.stringInternTable();
J9InternHashTableEntryPointer node = stringInternTable.headNode();
while (node.notNull()) {
J9UTF8Pointer utf8 = node.utf8();
J9ClassLoaderPointer classLoader = node.classLoader();
if (!verifyUTF8(utf8)) {
reportError(out, "invalid utf8=0x%s for node=0x%s",
Long.toHexString(utf8.getAddress()), Long.toHexString(node.getAddress()));
}
if (!verifyJ9ClassLoader(vm, classLoader)) {
reportError(out, "invalid classLoader=0x%s for node=0x%s",
Long.toHexString(classLoader.getAddress()), Long.toHexString(node.getAddress()));
}
count += 1;
node = node.nextNode();
}
count++;
node = node.nextNode();
}
}
}
reportMessage(out, "Checking %d ROM intern string nodes done", count);
}
Expand Down
52 changes: 26 additions & 26 deletions runtime/vmchk/checkinterntable.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 1991, 2017 IBM Corp. and others
* Copyright (c) 1991, 2019 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
Expand Down Expand Up @@ -32,49 +32,49 @@
#include "util_api.h"
#include "vmcheck.h"

static BOOLEAN verifyJ9ClassLoader(J9JavaVM *vm, J9ClassLoader *classLoader);

/*
* J9LocalInternTableSanity sanity:
* if J9JavaVM->dynamicLoadBuffers != NULL
* if (J9JavaVM->dynamicLoadBuffers != NULL) && (J9JavaVM->dynamicLoadBuffers->romClassBuilder != NULL)
* invariantInternTree check:
* For each J9InternHashTableEntry
* Ensure J9InternHashTableEntry->utf8 is valid
* Ensure J9InternHashTableEntry->classLoader is valid
*/

static BOOLEAN verifyJ9ClassLoader(J9JavaVM *vm, J9ClassLoader *classLoader);


void
checkLocalInternTableSanity(J9JavaVM *vm)
{
UDATA count = 0;
J9TranslationBufferSet *dynamicLoadBuffers;
J9TranslationBufferSet *dynamicLoadBuffers = NULL;

vmchkPrintf(vm, " %s Checking ROM intern string nodes>\n", VMCHECK_PREFIX);

dynamicLoadBuffers = (J9TranslationBufferSet *)DBG_ARROW(vm, dynamicLoadBuffers);
if (dynamicLoadBuffers != NULL) {
if (NULL != dynamicLoadBuffers) {
J9DbgROMClassBuilder *romClassBuilder = (J9DbgROMClassBuilder *)DBG_ARROW(dynamicLoadBuffers, romClassBuilder);
/* We don't need to use DBG_ARROW() below because we are taking its address (not dereferencing it).. */
J9DbgStringInternTable *stringInternTable = &(romClassBuilder->stringInternTable);
J9InternHashTableEntry *node= (J9InternHashTableEntry*)DBG_ARROW(stringInternTable, headNode);

while (NULL != node) {
J9ClassLoader *classLoader = (J9ClassLoader *)DBG_ARROW(node, classLoader);
if (J9_ARE_NO_BITS_SET(DBG_ARROW(classLoader, gcFlags), J9_GC_CLASS_LOADER_DEAD)) {
J9UTF8 *utf8 = (J9UTF8 *)DBG_ARROW(node, utf8);
if (FALSE == verifyUTF8(utf8)) {
vmchkPrintf(vm, " %s - Invalid utf8=0x%p for node=0x%p>\n",
VMCHECK_FAILED, utf8, node);
}

if (FALSE == verifyJ9ClassLoader(vm, classLoader)) {
vmchkPrintf(vm, " %s - Invalid classLoader=0x%p for node=0x%p>\n",
VMCHECK_FAILED, classLoader, node);
if (NULL != romClassBuilder) {
/* We don't need to use DBG_ARROW() below because we are taking its address (not dereferencing it).. */
J9DbgStringInternTable *stringInternTable = &(romClassBuilder->stringInternTable);
J9InternHashTableEntry *node = (J9InternHashTableEntry*)DBG_ARROW(stringInternTable, headNode);

while (NULL != node) {
J9ClassLoader *classLoader = (J9ClassLoader *)DBG_ARROW(node, classLoader);
if (J9_ARE_NO_BITS_SET(DBG_ARROW(classLoader, gcFlags), J9_GC_CLASS_LOADER_DEAD)) {
J9UTF8 *utf8 = (J9UTF8 *)DBG_ARROW(node, utf8);
if (FALSE == verifyUTF8(utf8)) {
vmchkPrintf(vm, " %s - Invalid utf8=0x%p for node=0x%p>\n",
VMCHECK_FAILED, utf8, node);
}

if (FALSE == verifyJ9ClassLoader(vm, classLoader)) {
vmchkPrintf(vm, " %s - Invalid classLoader=0x%p for node=0x%p>\n",
VMCHECK_FAILED, classLoader, node);
}
}
count += 1;
node = (J9InternHashTableEntry *)DBG_ARROW(node, nextNode);
}
count++;
node = (J9InternHashTableEntry *)DBG_ARROW(node, nextNode);
}
}

Expand Down

0 comments on commit 0077014

Please sign in to comment.