From 47a156c16f3ad8552fd1be31fda95555beaeab64 Mon Sep 17 00:00:00 2001 From: Brian Carrier <carrier@sleuthkit.org> Date: Fri, 5 May 2017 12:47:17 -0400 Subject: [PATCH] Cast and test TSK_JNI_HANDLE more methodically. Trying to fix random crash when fs_info was invalid --- bindings/java/jni/dataModel_SleuthkitJNI.cpp | 25 ++++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.cpp b/bindings/java/jni/dataModel_SleuthkitJNI.cpp index 14d57d1eb..29ec6ab3c 100644 --- a/bindings/java/jni/dataModel_SleuthkitJNI.cpp +++ b/bindings/java/jni/dataModel_SleuthkitJNI.cpp @@ -166,8 +166,23 @@ castFsInfo(JNIEnv * env, jlong ptr) } -static TSK_JNI_FILEHANDLE * +static TSK_FS_FILE * castFsFile(JNIEnv * env, jlong ptr) +{ + TSK_FS_FILE *lcl = (TSK_FS_FILE *)ptr; + if (!lcl || lcl->tag != TSK_FS_FILE_TAG) { + setThrowTskCoreError(env, "Invalid FS_FILE object"); + return 0; + } + // verify that file system handle is still open + if (!castFsInfo(env, (jlong)lcl->fs_info)) { + return 0; + } + return lcl; +} + +static TSK_JNI_FILEHANDLE * +castJniFileHandle(JNIEnv * env, jlong ptr) { TSK_JNI_FILEHANDLE *lcl = (TSK_JNI_FILEHANDLE *) ptr; if (!lcl || lcl->tag != TSK_JNI_FILEHANDLE_TAG) { @@ -175,7 +190,7 @@ castFsFile(JNIEnv * env, jlong ptr) return 0; } // verify that all handles are still open - if (!lcl->fs_file || !castFsInfo(env, (jlong) lcl->fs_file->fs_info)) { + if (!castFsFile(env, (jlong) lcl->fs_file)) { return 0; } return lcl; @@ -1807,7 +1822,7 @@ Java_org_sleuthkit_datamodel_SleuthkitJNI_readFileNat(JNIEnv * env, } } - const TSK_JNI_FILEHANDLE *file_handle = castFsFile(env, a_file_handle); + const TSK_JNI_FILEHANDLE *file_handle = castJniFileHandle(env, a_file_handle); if (file_handle == 0) { if (dynBuf) { free(buf); @@ -1862,7 +1877,7 @@ Java_org_sleuthkit_datamodel_SleuthkitJNI_readFileNat(JNIEnv * env, JNIEXPORT jint JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_saveFileMetaDataTextNat (JNIEnv *env, jclass obj, jlong a_file_handle, jstring a_tmp_path) { - const TSK_JNI_FILEHANDLE *file_handle = castFsFile(env, a_file_handle); + const TSK_JNI_FILEHANDLE *file_handle = castJniFileHandle(env, a_file_handle); if (file_handle == 0) { //exception already set return -1; @@ -1956,7 +1971,7 @@ JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_closeFileNat(JNIEnv * env, jclass obj, jlong a_file_info) { - TSK_JNI_FILEHANDLE *file_handle = castFsFile(env, a_file_info); + TSK_JNI_FILEHANDLE *file_handle = castJniFileHandle(env, a_file_info); if (file_handle == 0) { //exception already set return; -- GitLab