From 09872555523588a5a8839682e091c717e1615a05 Mon Sep 17 00:00:00 2001 From: Joel Dice Date: Sun, 10 Apr 2011 17:01:38 -0600 Subject: [PATCH] tolerate missing classes in interceptFileOperations If we fail to resolve a given class (e.g. due to ProGuard obfuscating or eliminating it), just move on to the next one rather than return immediately. Otherwise, we may miss intercepting methods of classes we can resolve. --- src/classpath-openjdk.cpp | 225 +++++++++++++++++++++----------------- 1 file changed, 122 insertions(+), 103 deletions(-) diff --git a/src/classpath-openjdk.cpp b/src/classpath-openjdk.cpp index beac1d639a..75a617fecb 100644 --- a/src/classpath-openjdk.cpp +++ b/src/classpath-openjdk.cpp @@ -1691,156 +1691,174 @@ interceptFileOperations(Thread* t) MyClasspath* cp = static_cast(t->m->classpath); { object fileClass = resolveClass - (t, root(t, Machine::BootLoader), "java/io/File"); - if (fileClass == 0) return; + (t, root(t, Machine::BootLoader), "java/io/File", false); - object filePathField = findFieldInClass2 - (t, fileClass, "path", "Ljava/lang/String;"); - if (filePathField == 0) return; - - cp->filePathField = fieldOffset(t, filePathField); + if (fileClass) { + object filePathField = findFieldInClass2 + (t, fileClass, "path", "Ljava/lang/String;"); + + if (filePathField) { + cp->filePathField = fieldOffset(t, filePathField); + } + } } { object fileDescriptorClass = resolveClass - (t, root(t, Machine::BootLoader), "java/io/FileDescriptor"); - if (fileDescriptorClass == 0) return; + (t, root(t, Machine::BootLoader), "java/io/FileDescriptor", false); - object fileDescriptorFdField = findFieldInClass2 - (t, fileDescriptorClass, "fd", "I"); - if (fileDescriptorFdField == 0) return; + if (fileDescriptorClass) { + object fileDescriptorFdField = findFieldInClass2 + (t, fileDescriptorClass, "fd", "I"); - cp->fileDescriptorFdField = fieldOffset(t, fileDescriptorFdField); + if (fileDescriptorFdField) { + cp->fileDescriptorFdField = fieldOffset(t, fileDescriptorFdField); + } + } } { object fileInputStreamClass = resolveClass - (t, root(t, Machine::BootLoader), "java/io/FileInputStream"); - if (fileInputStreamClass == 0) return; + (t, root(t, Machine::BootLoader), "java/io/FileInputStream", false); - PROTECT(t, fileInputStreamClass); + if (fileInputStreamClass) { + PROTECT(t, fileInputStreamClass); - object fileInputStreamFdField = findFieldInClass2 - (t, fileInputStreamClass, "fd", "Ljava/io/FileDescriptor;"); - if (fileInputStreamFdField == 0) return; + object fileInputStreamFdField = findFieldInClass2 + (t, fileInputStreamClass, "fd", "Ljava/io/FileDescriptor;"); - cp->fileInputStreamFdField = fieldOffset(t, fileInputStreamFdField); + if (fileInputStreamFdField) { + cp->fileInputStreamFdField = fieldOffset(t, fileInputStreamFdField); - intercept(t, fileInputStreamClass, "open", "(Ljava/lang/String;)V", - voidPointer(openFile)); + intercept(t, fileInputStreamClass, "open", "(Ljava/lang/String;)V", + voidPointer(openFile)); - intercept(t, fileInputStreamClass, "read", "()I", - voidPointer(readByteFromFile)); + intercept(t, fileInputStreamClass, "read", "()I", + voidPointer(readByteFromFile)); - intercept(t, fileInputStreamClass, "readBytes", "([BII)I", - voidPointer(readBytesFromFile)); + intercept(t, fileInputStreamClass, "readBytes", "([BII)I", + voidPointer(readBytesFromFile)); - intercept(t, fileInputStreamClass, "skip", "(J)J", - voidPointer(skipBytesInFile)); + intercept(t, fileInputStreamClass, "skip", "(J)J", + voidPointer(skipBytesInFile)); - intercept(t, fileInputStreamClass, "available", "()I", - voidPointer(availableBytesInFile)); + intercept(t, fileInputStreamClass, "available", "()I", + voidPointer(availableBytesInFile)); - intercept(t, fileInputStreamClass, "close0", "()V", - voidPointer(closeFile)); + intercept(t, fileInputStreamClass, "close0", "()V", + voidPointer(closeFile)); + } + } } { object zipEntryClass = resolveClass - (t, root(t, Machine::BootLoader), "java/util/zip/ZipEntry"); - if (zipEntryClass == 0) return; + (t, root(t, Machine::BootLoader), "java/util/zip/ZipEntry", false); - PROTECT(t, zipEntryClass); + if (zipEntryClass) { + PROTECT(t, zipEntryClass); - object zipEntryNameField = findFieldInClass2 - (t, zipEntryClass, "name", "Ljava/lang/String;"); - if (zipEntryNameField == 0) return; + object zipEntryNameField = findFieldInClass2 + (t, zipEntryClass, "name", "Ljava/lang/String;"); - cp->zipEntryNameField = fieldOffset(t, zipEntryNameField); + if (zipEntryNameField) { + cp->zipEntryNameField = fieldOffset(t, zipEntryNameField); - object zipEntryTimeField = findFieldInClass2 - (t, zipEntryClass, "time", "J"); - if (zipEntryTimeField == 0) return; + object zipEntryTimeField = findFieldInClass2 + (t, zipEntryClass, "time", "J"); - cp->zipEntryTimeField = fieldOffset(t, zipEntryTimeField); + if (zipEntryTimeField) { + cp->zipEntryTimeField = fieldOffset(t, zipEntryTimeField); - object zipEntryCrcField = findFieldInClass2 - (t, zipEntryClass, "crc", "J"); - if (zipEntryCrcField == 0) return; + object zipEntryCrcField = findFieldInClass2 + (t, zipEntryClass, "crc", "J"); - cp->zipEntryCrcField = fieldOffset(t, zipEntryCrcField); + if (zipEntryCrcField) { + cp->zipEntryCrcField = fieldOffset(t, zipEntryCrcField); - object zipEntrySizeField = findFieldInClass2 - (t, zipEntryClass, "size", "J"); - if (zipEntrySizeField == 0) return; + object zipEntrySizeField = findFieldInClass2 + (t, zipEntryClass, "size", "J"); - cp->zipEntrySizeField = fieldOffset(t, zipEntrySizeField); + if (zipEntrySizeField) { + cp->zipEntrySizeField = fieldOffset(t, zipEntrySizeField); - object zipEntryCsizeField = findFieldInClass2 - (t, zipEntryClass, "csize", "J"); - if (zipEntryCsizeField == 0) return; + object zipEntryCsizeField = findFieldInClass2 + (t, zipEntryClass, "csize", "J"); + + if (zipEntryCsizeField) { + cp->zipEntryCsizeField = fieldOffset(t, zipEntryCsizeField); - cp->zipEntryCsizeField = fieldOffset(t, zipEntryCsizeField); + object zipEntryMethodField = findFieldInClass2 + (t, zipEntryClass, "method", "I"); - object zipEntryMethodField = findFieldInClass2 - (t, zipEntryClass, "method", "I"); - if (zipEntryMethodField == 0) return; + if (zipEntryMethodField) { + cp->zipEntryMethodField = fieldOffset + (t, zipEntryMethodField); - cp->zipEntryMethodField = fieldOffset(t, zipEntryMethodField); - - intercept(t, zipEntryClass, "initFields", "(J)V", - voidPointer(initializeZipEntryFields)); + intercept(t, zipEntryClass, "initFields", "(J)V", + voidPointer(initializeZipEntryFields)); + } + } + } + } + } + } + } } { object zipFileClass = resolveClass - (t, root(t, Machine::BootLoader), "java/util/zip/ZipFile"); - if (zipFileClass == 0) return; + (t, root(t, Machine::BootLoader), "java/util/zip/ZipFile", false); - PROTECT(t, zipFileClass); + if (zipFileClass) { + PROTECT(t, zipFileClass); - object zipFileJzfileField = findFieldInClass2 - (t, zipFileClass, "jzfile", "J"); - if (zipFileJzfileField == 0) return; + object zipFileJzfileField = findFieldInClass2 + (t, zipFileClass, "jzfile", "J"); - cp->zipFileJzfileField = fieldOffset(t, zipFileJzfileField); + if (zipFileJzfileField) { + cp->zipFileJzfileField = fieldOffset(t, zipFileJzfileField); - intercept(t, zipFileClass, "open", "(Ljava/lang/String;IJ)J", - voidPointer(openZipFile)); + intercept(t, zipFileClass, "open", "(Ljava/lang/String;IJ)J", + voidPointer(openZipFile)); - intercept(t, zipFileClass, "getTotal", "(J)I", - voidPointer(getZipFileEntryCount)); + intercept(t, zipFileClass, "getTotal", "(J)I", + voidPointer(getZipFileEntryCount)); - intercept(t, zipFileClass, "getEntry", "(JLjava/lang/String;Z)J", - voidPointer(getZipFileEntry)); + intercept(t, zipFileClass, "getEntry", "(JLjava/lang/String;Z)J", + voidPointer(getZipFileEntry)); - intercept(t, zipFileClass, "getNextEntry", "(JI)J", - voidPointer(getNextZipFileEntry)); + intercept(t, zipFileClass, "getNextEntry", "(JI)J", + voidPointer(getNextZipFileEntry)); - intercept(t, zipFileClass, "getMethod", "(J)I", - voidPointer(getZipFileEntryMethod)); + intercept(t, zipFileClass, "getMethod", "(J)I", + voidPointer(getZipFileEntryMethod)); - intercept(t, zipFileClass, "freeEntry", "(JJ)V", - voidPointer(freeZipFileEntry)); + intercept(t, zipFileClass, "freeEntry", "(JJ)V", + voidPointer(freeZipFileEntry)); - intercept(t, zipFileClass, "read", "(JJJ[BII)I", - voidPointer(readZipFileEntry)); + intercept(t, zipFileClass, "read", "(JJJ[BII)I", + voidPointer(readZipFileEntry)); - intercept(t, zipFileClass, "getCSize", "(J)J", - voidPointer(getZipFileEntryCompressedSize)); + intercept(t, zipFileClass, "getCSize", "(J)J", + voidPointer(getZipFileEntryCompressedSize)); - intercept(t, zipFileClass, "getSize", "(J)J", - voidPointer(getZipFileEntryUncompressedSize)); + intercept(t, zipFileClass, "getSize", "(J)J", + voidPointer(getZipFileEntryUncompressedSize)); - intercept(t, zipFileClass, "getZipMessage", "(J)Ljava/lang/String;", - voidPointer(getZipMessage)); + intercept(t, zipFileClass, "getZipMessage", "(J)Ljava/lang/String;", + voidPointer(getZipMessage)); - intercept(t, zipFileClass, "close", "(J)V", - voidPointer(closeZipFile)); + intercept(t, zipFileClass, "close", "(J)V", + voidPointer(closeZipFile)); + } + } } { object jarFileClass = resolveClass - (t, root(t, Machine::BootLoader), "java/util/jar/JarFile"); - if (jarFileClass == 0) return; + (t, root(t, Machine::BootLoader), "java/util/jar/JarFile", false); - intercept(t, jarFileClass, "getMetaInfEntryNames", "()[Ljava/lang/String;", - voidPointer(getJarFileMetaInfEntryNames)); + if (jarFileClass) { + intercept(t, jarFileClass, "getMetaInfEntryNames", + "()[Ljava/lang/String;", + voidPointer(getJarFileMetaInfEntryNames)); + } } { @@ -1854,18 +1872,19 @@ interceptFileOperations(Thread* t) object fsClass = resolveClass (t, root(t, Machine::BootLoader), fsClassName, false); - if (fsClass == 0) return; - PROTECT(t, fsClass); + if (fsClass) { + PROTECT(t, fsClass); - intercept(t, fsClass, gbaMethodName, "(Ljava/io/File;)I", - voidPointer(getFileAttributes)); + intercept(t, fsClass, gbaMethodName, "(Ljava/io/File;)I", + voidPointer(getFileAttributes)); - intercept(t, fsClass, "checkAccess", "(Ljava/io/File;I)Z", - voidPointer(checkFileAccess)); + intercept(t, fsClass, "checkAccess", "(Ljava/io/File;I)Z", + voidPointer(checkFileAccess)); - intercept(t, fsClass, "getLength", "(Ljava/io/File;)J", - voidPointer(getFileLength)); + intercept(t, fsClass, "getLength", "(Ljava/io/File;)J", + voidPointer(getFileLength)); + } } intercept(t, type(t, Machine::ClassLoaderType), "loadLibrary",