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