From afed1bb5c2f1b581c0b99dfa32acc942e686dfd9 Mon Sep 17 00:00:00 2001
From: Brian Carrier <carrier@sleuthkit.org>
Date: Fri, 23 Sep 2011 15:39:02 +0000
Subject: [PATCH] added more tags to data strutures

---
 bindings/java/jni/.indent.pro                |   1 +
 bindings/java/jni/Makefile.am                |   2 +-
 bindings/java/jni/dataModel_SleuthkitJNI.cpp | 395 +++++++++++--------
 tsk3/fs/fs_open.c                            |   3 +-
 tsk3/vs/bsd.c                                |   2 +
 tsk3/vs/dos.c                                |   2 +
 tsk3/vs/gpt.c                                |   2 +
 tsk3/vs/mac.c                                |   2 +
 tsk3/vs/mm_part.c                            |   8 +-
 tsk3/vs/sun.c                                |   2 +
 tsk3/vs/tsk_vs.h                             |   5 +-
 11 files changed, 243 insertions(+), 181 deletions(-)
 create mode 100644 bindings/java/jni/.indent.pro

diff --git a/bindings/java/jni/.indent.pro b/bindings/java/jni/.indent.pro
new file mode 100644
index 000000000..536b25437
--- /dev/null
+++ b/bindings/java/jni/.indent.pro
@@ -0,0 +1 @@
+-kr  -psl -nce -ip2 -nlp -nut
diff --git a/bindings/java/jni/Makefile.am b/bindings/java/jni/Makefile.am
index c0a3921a4..5124ceb34 100644
--- a/bindings/java/jni/Makefile.am
+++ b/bindings/java/jni/Makefile.am
@@ -6,7 +6,7 @@ libtsk3jni_la_SOURCES = dataModel_SleuthkitJNI.cpp dataModel_SleuthkitJNI.h \
                         tskAutoDbJNI.cpp tskAutoDbJNI.h
 
 indent:
-	indent *.c *.h
+	indent *.cpp *.h
 
 clean-local:
 	-rm -f *.c~ *.h~
diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.cpp b/bindings/java/jni/dataModel_SleuthkitJNI.cpp
index ae18e61b8..44794ba2e 100644
--- a/bindings/java/jni/dataModel_SleuthkitJNI.cpp
+++ b/bindings/java/jni/dataModel_SleuthkitJNI.cpp
@@ -18,7 +18,9 @@
 
 /** Throw an TSK exception back up to the Java code with a specific message.
  */
-static void throwTskError(JNIEnv *env, const char *msg){
+static void
+throwTskError(JNIEnv * env, const char *msg)
+{
     jclass exception;
     exception = env->FindClass("org/sleuthkit/datamodel/TskException");
 
@@ -28,66 +30,66 @@ static void throwTskError(JNIEnv *env, const char *msg){
 /* Throw and exception to java
  * @param the java environment to send the exception to
  */
-static void throwTskError(JNIEnv *env){
-    const char* msg = tsk_error_get();
+static void
+throwTskError(JNIEnv * env)
+{
+    const char *msg = tsk_error_get();
     throwTskError(env, msg);
 }
 
 
 /***** Methods to cast from jlong to data type and check tags
  They all throw an exception if the incorrect type is passed in. *****/
-static TSK_IMG_INFO * 
-castImgInfo(JNIEnv *env, jlong ptr)
+static TSK_IMG_INFO *
+castImgInfo(JNIEnv * env, jlong ptr)
 {
-    TSK_IMG_INFO *lcl = (TSK_IMG_INFO *)ptr;
+    TSK_IMG_INFO *lcl = (TSK_IMG_INFO *) ptr;
     if (lcl->tag != TSK_IMG_INFO_TAG) {
-        throwTskError(env, "Invalid IMG_INFO object"); 
+        throwTskError(env, "Invalid IMG_INFO object");
     }
     return lcl;
 }
 
 
-static TSK_VS_INFO * 
-castVsInfo(JNIEnv *env, jlong ptr)
+static TSK_VS_INFO *
+castVsInfo(JNIEnv * env, jlong ptr)
 {
-    TSK_VS_INFO *lcl = (TSK_VS_INFO *)ptr;
-/*    if (lcl->tag != TSK_VS_INFO_TAG) {
-        throwTskError(env, "Invalid VS_INFO object"); 
+    TSK_VS_INFO *lcl = (TSK_VS_INFO *) ptr;
+    if (lcl->tag != TSK_VS_INFO_TAG) {
+        throwTskError(env, "Invalid VS_INFO object");
     }
- 
- */
+
     return lcl;
 }
 
-static TSK_VS_PART_INFO * 
-castVsPartInfo(JNIEnv *env, jlong ptr)
+static TSK_VS_PART_INFO *
+castVsPartInfo(JNIEnv * env, jlong ptr)
 {
-    TSK_VS_PART_INFO *lcl = (TSK_VS_PART_INFO *)ptr;
-    /*    if (lcl->tag != TSK_VS_PART_INFO_TAG) {
-     throwTskError(env, "Invalid VS_PART_INFO object"); 
-     }
-     
-     */
+    TSK_VS_PART_INFO *lcl = (TSK_VS_PART_INFO *) ptr;
+    if (lcl->tag != TSK_VS_PART_INFO_TAG) {
+        throwTskError(env, "Invalid VS_PART_INFO object");
+    }
+
     return lcl;
 }
 
-static TSK_FS_INFO * 
-castFsInfo(JNIEnv *env, jlong ptr)
+static TSK_FS_INFO *
+castFsInfo(JNIEnv * env, jlong ptr)
 {
-    TSK_FS_INFO *lcl = (TSK_FS_INFO *)ptr;
+    TSK_FS_INFO *lcl = (TSK_FS_INFO *) ptr;
     if (lcl->tag != TSK_FS_INFO_TAG) {
-        throwTskError(env, "Invalid FS_INFO object"); 
+        throwTskError(env, "Invalid FS_INFO object");
     }
     return lcl;
 }
 
 
-static TSK_FS_FILE * 
-castFsFileInfo(JNIEnv *env, jlong ptr)
+static TSK_FS_FILE *
+castFsFileInfo(JNIEnv * env, jlong ptr)
 {
-    TSK_FS_FILE *lcl = (TSK_FS_FILE *)ptr;
+    TSK_FS_FILE *lcl = (TSK_FS_FILE *) ptr;
     if (lcl->tag != TSK_FS_FILE_TAG) {
-        throwTskError(env, "Invalid FS_FILE object"); 
+        throwTskError(env, "Invalid FS_FILE object");
     }
     return lcl;
 }
@@ -104,34 +106,38 @@ castFsFileInfo(JNIEnv *env, jlong ptr)
  */
 // @@@ We should remove this method in favor of the multi-step approach.
 JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_loaddbNat
-(JNIEnv *env, jclass obj, jobjectArray paths, jint num_imgs, jstring outDir){
+    (JNIEnv * env, jclass obj, jobjectArray paths, jint num_imgs,
+    jstring outDir) {
     TskAutoDb tskDb;
     //change to true when autopsy needs the block table.
     tskDb.createBlockMap(false);
 
     jboolean isCopy;
-    
+
     // pull the strings into the C++ world.
-    char *cOutDir8 = (char *)env->GetStringUTFChars(outDir, &isCopy);
-    if(cOutDir8 == NULL){
+    char *cOutDir8 = (char *) env->GetStringUTFChars(outDir, &isCopy);
+    if (cOutDir8 == NULL) {
         throwTskError(env);
         return 1;
     }
-    
+
     // get pointers to each of the file names
-    char ** imagepaths8 = (char**) tsk_malloc(num_imgs * sizeof(char *));
-    if(imagepaths8 == NULL){
+    char **imagepaths8 = (char **) tsk_malloc(num_imgs * sizeof(char *));
+    if (imagepaths8 == NULL) {
         throwTskError(env);
         return 1;
     }
-    for(int i =0; i < num_imgs; i++){
-        imagepaths8[i] = (char *)env->GetStringUTFChars((jstring)env->GetObjectArrayElement(paths, i), &isCopy);
+    for (int i = 0; i < num_imgs; i++) {
+        imagepaths8[i] =
+            (char *) env->GetStringUTFChars((jstring) env->
+            GetObjectArrayElement(paths, i), &isCopy);
         // @@@ Add error checking here
     }
 
-    
+
     // open and process the image
-    if (tskDb.openImageUtf8(num_imgs, imagepaths8, TSK_IMG_TYPE_DETECT, 0, cOutDir8)) {
+    if (tskDb.openImageUtf8(num_imgs, imagepaths8, TSK_IMG_TYPE_DETECT, 0,
+            cOutDir8)) {
         throwTskError(env, tsk_error_get());
         return 1;
     }
@@ -140,16 +146,17 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_loaddbNat
         throwTskError(env, tsk_error_get());
         return 1;
     }
-    
+
     // cleanup
-    for(int i = 0; i < num_imgs; i++){
-        env->ReleaseStringUTFChars((jstring)env->GetObjectArrayElement(paths, i), imagepaths8[i]);
+    for (int i = 0; i < num_imgs; i++) {
+        env->ReleaseStringUTFChars((jstring) env->
+            GetObjectArrayElement(paths, i), imagepaths8[i]);
     }
     free(imagepaths8);
     env->ReleaseStringUTFChars(outDir, cOutDir8);
-    
+
     tskDb.closeImage();
-    
+
     return 0;
 }
 
@@ -159,21 +166,23 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_loaddbNat
  * @param env pointer to java environment this was called from
  * @param timezone timezone for the image
  */
-JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_startloaddbNat
-(JNIEnv *env, jclass obj, jstring timezone){
+JNIEXPORT jlong JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_startloaddbNat(JNIEnv * env,
+    jclass obj, jstring timezone) {
     jboolean isCopy;
 
     char envstr[32];
-    snprintf(envstr, 32, "TZ=%s", env->GetStringUTFChars(timezone, &isCopy));
-    if (0 != putenv(envstr)) { 
-        throwTskError(env, "Error setting timezone environment"); 
-        return 1; 
+    snprintf(envstr, 32, "TZ=%s", env->GetStringUTFChars(timezone,
+            &isCopy));
+    if (0 != putenv(envstr)) {
+        throwTskError(env, "Error setting timezone environment");
+        return 1;
     }
 
     /* we should be checking this somehow */
     TZSET();
     TskAutoDbJNI *tskDb = new TskAutoDbJNI();
-    return (jlong)tskDb;
+    return (jlong) tskDb;
 }
 
 
@@ -188,39 +197,45 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_startloaddbNat
  * @param num_imgs number of image parts
  * @param outDir the output directory
  */
-JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runloaddbNat
-(JNIEnv * env, jclass obj, jlong process, jobjectArray paths, jint num_imgs, jstring outDir){
+JNIEXPORT void JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_runloaddbNat(JNIEnv * env,
+    jclass obj, jlong process, jobjectArray paths, jint num_imgs,
+    jstring outDir) {
     jboolean isCopy;
-    
-    TskAutoDbJNI * tskDb = ((TskAutoDbJNI*)process);
+
+    TskAutoDbJNI *tskDb = ((TskAutoDbJNI *) process);
     if (tskDb->m_tag != TSK_AUTO_TAG) {
-        throwTskError(env, "runLoadDbNat: Invalid AutoDbJNI object passed in");
+        throwTskError(env,
+            "runLoadDbNat: Invalid AutoDbJNI object passed in");
         return;
     }
 
     //change to true when autopsy needs the block table.
     tskDb->createBlockMap(false);
-    
+
     // move the strings into the C++ world
 
-    char *cOutDir8 = (char *)env->GetStringUTFChars(outDir, &isCopy);
-    if(cOutDir8 == NULL){
+    char *cOutDir8 = (char *) env->GetStringUTFChars(outDir, &isCopy);
+    if (cOutDir8 == NULL) {
         throwTskError(env);
         return;
     }
-    
+
     // get pointers to each of the file names
-    char ** imagepaths8 = (char**) tsk_malloc(num_imgs * sizeof(char *));
-    if(imagepaths8 == NULL){
+    char **imagepaths8 = (char **) tsk_malloc(num_imgs * sizeof(char *));
+    if (imagepaths8 == NULL) {
         throwTskError(env);
         return;
     }
-    for(int i =0; i < num_imgs; i++){
-        imagepaths8[i] = (char *)env->GetStringUTFChars((jstring)env->GetObjectArrayElement(paths, i), &isCopy);
+    for (int i = 0; i < num_imgs; i++) {
+        imagepaths8[i] =
+            (char *) env->GetStringUTFChars((jstring) env->
+            GetObjectArrayElement(paths, i), &isCopy);
     }
 
     // process the images
-    if (tskDb->openImageUtf8((int)num_imgs, imagepaths8, TSK_IMG_TYPE_DETECT, 0, cOutDir8)) {
+    if (tskDb->openImageUtf8((int) num_imgs, imagepaths8,
+            TSK_IMG_TYPE_DETECT, 0, cOutDir8)) {
         throwTskError(env, tsk_error_get());
     }
 
@@ -228,13 +243,14 @@ JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runloaddbNat
         tskDb->closeImage();
         throwTskError(env, tsk_error_get());
     }
-    
+
     // cleanup
-    for(int i = 0; i < num_imgs; i++){
-        env->ReleaseStringUTFChars((jstring)env->GetObjectArrayElement(paths, i), imagepaths8[i]);
+    for (int i = 0; i < num_imgs; i++) {
+        env->ReleaseStringUTFChars((jstring) env->
+            GetObjectArrayElement(paths, i), imagepaths8[i]);
     }
     free(imagepaths8);
-    
+
     env->ReleaseStringUTFChars(outDir, cOutDir8);
     tskDb->closeImage();
 }
@@ -247,14 +263,16 @@ JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runloaddbNat
  * @param obj the java object this was called from
  * @param process the loaddb proces created by startloaddbNat
  */
-JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_stoploaddbNat
-(JNIEnv * env, jclass obj, jlong process) {
-    TskAutoDbJNI * tskDb = ((TskAutoDbJNI*)process);
+JNIEXPORT void JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_stoploaddbNat(JNIEnv * env,
+    jclass obj, jlong process) {
+    TskAutoDbJNI *tskDb = ((TskAutoDbJNI *) process);
     if (tskDb->m_tag != TSK_AUTO_TAG) {
-        throwTskError(env, "stopLoadDbNat: Invalid AutoDbJNI object passed in");
+        throwTskError(env,
+            "stopLoadDbNat: Invalid AutoDbJNI object passed in");
         return;
     }
-    tskDb->cancelProcess();  
+    tskDb->cancelProcess();
 }
 
 
@@ -266,35 +284,41 @@ JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_stoploaddbNat
  * @param paths the paths to the image parts
  * @param num_imgs number of image parts
  */
-JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openImageNat
-(JNIEnv *env, jclass obj, jobjectArray paths, jint num_imgs){
-    TSK_IMG_INFO * img_info;
-        jboolean isCopy;
-    
+JNIEXPORT jlong JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_openImageNat(JNIEnv * env,
+    jclass obj, jobjectArray paths, jint num_imgs) {
+    TSK_IMG_INFO *img_info;
+    jboolean isCopy;
+
     // get pointers to each of the file names
-    char ** imagepaths8 = (char**) tsk_malloc(num_imgs * sizeof(char *));
-    if(imagepaths8 == NULL){
+    char **imagepaths8 = (char **) tsk_malloc(num_imgs * sizeof(char *));
+    if (imagepaths8 == NULL) {
         throwTskError(env);
         return NULL;
     }
-    for(int i =0; i < num_imgs; i++){
-        imagepaths8[i] = (char *)env->GetStringUTFChars((jstring)env->GetObjectArrayElement(paths, i), &isCopy);
+    for (int i = 0; i < num_imgs; i++) {
+        imagepaths8[i] =
+            (char *) env->GetStringUTFChars((jstring) env->
+            GetObjectArrayElement(paths, i), &isCopy);
         // @@@ ERror check
     }
 
     // open the image
-    img_info = tsk_img_open_utf8((int)num_imgs, imagepaths8, TSK_IMG_TYPE_DETECT, 0);
-    if(img_info == NULL){
+    img_info =
+        tsk_img_open_utf8((int) num_imgs, imagepaths8, TSK_IMG_TYPE_DETECT,
+        0);
+    if (img_info == NULL) {
         throwTskError(env, tsk_error_get());
     }
 
     // cleanup
-    for(int i = 0; i < num_imgs; i++){
-        env->ReleaseStringUTFChars((jstring)env->GetObjectArrayElement(paths, i), imagepaths8[i]);
+    for (int i = 0; i < num_imgs; i++) {
+        env->ReleaseStringUTFChars((jstring) env->
+            GetObjectArrayElement(paths, i), imagepaths8[i]);
     }
     free(imagepaths8);
-    
-    return (jlong)img_info;
+
+    return (jlong) img_info;
 }
 
 
@@ -308,15 +332,15 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openImageNat
  * @param vsOffset the offset of the volume system in bytes
  */
 JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openVsNat
-(JNIEnv * env, jclass obj, jlong a_img_info, jlong vsOffset){ 
-    TSK_IMG_INFO * img_info = castImgInfo(env, a_img_info);
-    TSK_VS_INFO * vs_info;
+    (JNIEnv * env, jclass obj, jlong a_img_info, jlong vsOffset) {
+    TSK_IMG_INFO *img_info = castImgInfo(env, a_img_info);
+    TSK_VS_INFO *vs_info;
 
     vs_info = tsk_vs_open(img_info, vsOffset, TSK_VS_TYPE_DETECT);
-    if(vs_info == NULL){
+    if (vs_info == NULL) {
         throwTskError(env, tsk_error_get());
     }
-    return (jlong)vs_info;
+    return (jlong) vs_info;
 }
 
 
@@ -328,16 +352,17 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openVsNat
  * @param a_vs_info the pointer to the parent vs object
  * @param vol_id the id of the volume to get
  */
-JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openVolNat
-(JNIEnv * env, jclass obj, jlong a_vs_info, jlong vol_id){
-    TSK_VS_INFO * vs_info = castVsInfo(env, a_vs_info);
-    const TSK_VS_PART_INFO * vol_part_info;
-    
+JNIEXPORT jlong JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_openVolNat(JNIEnv * env,
+    jclass obj, jlong a_vs_info, jlong vol_id) {
+    TSK_VS_INFO *vs_info = castVsInfo(env, a_vs_info);
+    const TSK_VS_PART_INFO *vol_part_info;
+
     vol_part_info = tsk_vs_part_get(vs_info, (TSK_PNUM_T) vol_id);
-    if(vol_part_info == NULL){
+    if (vol_part_info == NULL) {
         throwTskError(env, tsk_error_get());
     }
-    return (jlong)vol_part_info;
+    return (jlong) vol_part_info;
 }
 
 
@@ -350,15 +375,17 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openVolNat
  * @param fs_offset the offset in bytes to the file system 
  */
 JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openFsNat
-(JNIEnv * env, jclass obj, jlong a_img_info, jlong fs_offset){
-    TSK_IMG_INFO * img_info = castImgInfo(env, a_img_info);
-    TSK_FS_INFO * fs_info;
-
-    fs_info = tsk_fs_open_img(img_info, (TSK_OFF_T) fs_offset, TSK_FS_TYPE_DETECT);
-    if(fs_info == NULL){
+    (JNIEnv * env, jclass obj, jlong a_img_info, jlong fs_offset) {
+    TSK_IMG_INFO *img_info = castImgInfo(env, a_img_info);
+    TSK_FS_INFO *fs_info;
+
+    fs_info =
+        tsk_fs_open_img(img_info, (TSK_OFF_T) fs_offset,
+        TSK_FS_TYPE_DETECT);
+    if (fs_info == NULL) {
         throwTskError(env, tsk_error_get());
     }
-    return (jlong)fs_info;
+    return (jlong) fs_info;
 }
 
 
@@ -370,17 +397,18 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openFsNat
  * @param a_fs_info the pointer to the parent file system object
  * @param file_id id of the file to open 
  */
-JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openFileNat
-(JNIEnv * env, jclass obj, jlong a_fs_info, jlong file_id){
-    TSK_FS_INFO * fs_info = castFsInfo(env, a_fs_info);
-    TSK_FS_FILE * file_info;
+JNIEXPORT jlong JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_openFileNat(JNIEnv * env,
+    jclass obj, jlong a_fs_info, jlong file_id) {
+    TSK_FS_INFO *fs_info = castFsInfo(env, a_fs_info);
+    TSK_FS_FILE *file_info;
 
     file_info = tsk_fs_file_open_meta(fs_info, NULL, (TSK_INUM_T) file_id);
-    if(file_info == NULL){
+    if (file_info == NULL) {
         throwTskError(env, tsk_error_get());
     }
-    
-    return (jlong)file_info;
+
+    return (jlong) file_info;
 }
 
 
@@ -391,17 +419,18 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openFileNat
  * @returns Pointer to java byte array or exception if there is an error
  */
 static jbyteArray
-copyBufToByteArray(JNIEnv *env, const char *buf, ssize_t len) {
+copyBufToByteArray(JNIEnv * env, const char *buf, ssize_t len)
+{
     jbyteArray return_array = env->NewByteArray(len);
     // @@@ Error check
-    
-    jbyte * jBytes = env->GetByteArrayElements(return_array, 0);
+
+    jbyte *jBytes = env->GetByteArrayElements(return_array, 0);
     // @@@ error check
-    
-    for(int i = 0; i<len; i++){
+
+    for (int i = 0; i < len; i++) {
         jBytes[i] = buf[i];
     }
-    
+
     env->ReleaseByteArrayElements(return_array, jBytes, 0);
 
     return return_array;
@@ -416,28 +445,30 @@ copyBufToByteArray(JNIEnv *env, const char *buf, ssize_t len) {
  * @param offset the offset in bytes to start at
  * @param len number of bytes to read
  */
-JNIEXPORT jbyteArray JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_readImgNat
-(JNIEnv * env, jclass obj, jlong a_img_info, jlong offset, jlong len){
-    char * buf = (char *) tsk_malloc((size_t)len);
-    if(buf == NULL){
+JNIEXPORT jbyteArray JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_readImgNat(JNIEnv * env,
+    jclass obj, jlong a_img_info, jlong offset, jlong len) {
+    char *buf = (char *) tsk_malloc((size_t) len);
+    if (buf == NULL) {
         throwTskError(env, tsk_error_get());
         return NULL;
     }
-    
-    TSK_IMG_INFO * img_info = castImgInfo(env, a_img_info);
 
-    ssize_t retval = tsk_img_read(img_info, (TSK_OFF_T) offset, buf, (size_t) len);
+    TSK_IMG_INFO *img_info = castImgInfo(env, a_img_info);
+
+    ssize_t retval =
+        tsk_img_read(img_info, (TSK_OFF_T) offset, buf, (size_t) len);
     if (retval == -1) {
         throwTskError(env, tsk_error_get());
     }
-    
+
     // package it up for return
     jbyteArray return_array = copyBufToByteArray(env, buf, retval);
     free(buf);
     return return_array;
 }
 
- 
+
 /*
  * Read bytes from the given volume system
  * @return array of bytes read from the volume system
@@ -447,20 +478,23 @@ JNIEXPORT jbyteArray JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_readImgNa
  * @param offset the offset in bytes to start at
  * @param len number of bytes to read
  */
-JNIEXPORT jbyteArray JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_readVsNat
-(JNIEnv * env, jclass obj, jlong a_vs_info, jlong offset, jlong len){
-    char * buf = (char *) tsk_malloc((size_t) len);
-    if(buf == NULL){
+JNIEXPORT jbyteArray JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_readVsNat(JNIEnv * env,
+    jclass obj, jlong a_vs_info, jlong offset, jlong len) {
+    char *buf = (char *) tsk_malloc((size_t) len);
+    if (buf == NULL) {
         throwTskError(env);
         return NULL;
     }
-    TSK_VS_INFO * vs_info = castVsInfo(env, a_vs_info);
+    TSK_VS_INFO *vs_info = castVsInfo(env, a_vs_info);
 
-    ssize_t retval = tsk_vs_read_block(vs_info, (TSK_DADDR_T) offset, buf, (size_t) len);
+    ssize_t retval =
+        tsk_vs_read_block(vs_info, (TSK_DADDR_T) offset, buf,
+        (size_t) len);
     if (retval == -1) {
         throwTskError(env, tsk_error_get());
     }
-    
+
     // package it up for return
     jbyteArray return_array = copyBufToByteArray(env, buf, retval);
     free(buf);
@@ -478,20 +512,23 @@ JNIEXPORT jbyteArray JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_readVsNat
  * @param len number of bytes to read
  */
 
-JNIEXPORT jbyteArray JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_readVolNat
-(JNIEnv * env, jclass obj, jlong a_vol_info, jlong offset, jlong len){
-    char * buf = (char *) tsk_malloc((size_t) len);
-    if(buf == NULL){
+JNIEXPORT jbyteArray JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_readVolNat(JNIEnv * env,
+    jclass obj, jlong a_vol_info, jlong offset, jlong len) {
+    char *buf = (char *) tsk_malloc((size_t) len);
+    if (buf == NULL) {
         throwTskError(env);
         return NULL;
     }
-    TSK_VS_PART_INFO * vol_part_info = castVsPartInfo(env, a_vol_info);
+    TSK_VS_PART_INFO *vol_part_info = castVsPartInfo(env, a_vol_info);
 
-    ssize_t retval = tsk_vs_part_read(vol_part_info, (TSK_OFF_T) offset, buf, (size_t) len);
+    ssize_t retval =
+        tsk_vs_part_read(vol_part_info, (TSK_OFF_T) offset, buf,
+        (size_t) len);
     if (retval == -1) {
         throwTskError(env, tsk_error_get());
     }
-    
+
     // package it up for return
     jbyteArray return_array = copyBufToByteArray(env, buf, retval);
     free(buf);
@@ -508,20 +545,22 @@ JNIEXPORT jbyteArray JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_readVolNa
  * @param offset the offset in bytes to start at
  * @param len number of bytes to read
  */
-JNIEXPORT jbyteArray JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_readFsNat
-(JNIEnv * env, jclass obj, jlong a_fs_info, jlong offset, jlong len){
-    char * buf = (char *) tsk_malloc((size_t) len);
-    if(buf == NULL){
+JNIEXPORT jbyteArray JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_readFsNat(JNIEnv * env,
+    jclass obj, jlong a_fs_info, jlong offset, jlong len) {
+    char *buf = (char *) tsk_malloc((size_t) len);
+    if (buf == NULL) {
         throwTskError(env);
         return NULL;
     }
-    TSK_FS_INFO * fs_info = castFsInfo(env, a_fs_info);
+    TSK_FS_INFO *fs_info = castFsInfo(env, a_fs_info);
 
-    ssize_t retval = tsk_fs_read(fs_info, (TSK_OFF_T) offset, buf, (size_t) len);
+    ssize_t retval =
+        tsk_fs_read(fs_info, (TSK_OFF_T) offset, buf, (size_t) len);
     if (retval == -1) {
         throwTskError(env, tsk_error_get());
     }
-    
+
     // package it up for return
     jbyteArray return_array = copyBufToByteArray(env, buf, retval);
     free(buf);
@@ -538,21 +577,24 @@ JNIEXPORT jbyteArray JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_readFsNat
  * @param offset the offset in bytes to start at
  * @param len number of bytes to read
  */
-JNIEXPORT jbyteArray JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_readFileNat
-(JNIEnv * env, jclass obj, jlong a_file_info, jlong offset, jlong len){
-    char * buf = (char *) tsk_malloc((size_t) len);
-    if(buf == NULL){
+JNIEXPORT jbyteArray JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_readFileNat(JNIEnv * env,
+    jclass obj, jlong a_file_info, jlong offset, jlong len) {
+    char *buf = (char *) tsk_malloc((size_t) len);
+    if (buf == NULL) {
         throwTskError(env);
         return NULL;
     }
-    
-    TSK_FS_FILE * file_info = castFsFileInfo(env, a_file_info);
 
-    ssize_t retval = tsk_fs_file_read(file_info, (TSK_OFF_T) offset, buf, (size_t) len, TSK_FS_FILE_READ_FLAG_NONE);
+    TSK_FS_FILE *file_info = castFsFileInfo(env, a_file_info);
+
+    ssize_t retval =
+        tsk_fs_file_read(file_info, (TSK_OFF_T) offset, buf, (size_t) len,
+        TSK_FS_FILE_READ_FLAG_NONE);
     if (retval == -1) {
         throwTskError(env, tsk_error_get());
     }
-    
+
     // package it up for return
     jbyteArray return_array = copyBufToByteArray(env, buf, retval);
     free(buf);
@@ -565,9 +607,10 @@ JNIEXPORT jbyteArray JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_readFileN
  * @param obj the java object this was called from
  * @param a_img_info the pointer to the image object
  */
-JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_closeImgNat
-(JNIEnv * env, jclass obj, jlong a_img_info){
-    TSK_IMG_INFO * img_info = castImgInfo(env, a_img_info);
+JNIEXPORT void JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_closeImgNat(JNIEnv * env,
+    jclass obj, jlong a_img_info) {
+    TSK_IMG_INFO *img_info = castImgInfo(env, a_img_info);
     tsk_img_close(img_info);
 }
 
@@ -578,8 +621,8 @@ JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_closeImgNat
  * @param a_vs_info the pointer to the volume system object
  */
 JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_closeVsNat
-(JNIEnv *env, jclass obj, jlong a_vs_info){
-    TSK_VS_INFO * vs_info = castVsInfo(env, a_vs_info);
+    (JNIEnv * env, jclass obj, jlong a_vs_info) {
+    TSK_VS_INFO *vs_info = castVsInfo(env, a_vs_info);
     tsk_vs_close(vs_info);
 }
 
@@ -590,8 +633,8 @@ JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_closeVsNat
  * @param a_fs_info the pointer to the file system object
  */
 JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_closeFsNat
-(JNIEnv * env, jclass obj, jlong a_fs_info){
-    TSK_FS_INFO * fs_info = castFsInfo(env, a_fs_info);
+    (JNIEnv * env, jclass obj, jlong a_fs_info) {
+    TSK_FS_INFO *fs_info = castFsInfo(env, a_fs_info);
     tsk_fs_close(fs_info);
 }
 
@@ -601,9 +644,10 @@ JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_closeFsNat
  * @param obj the java object this was called from
  * @param a_file_info the pointer to the file object
  */
-JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_closeFileNat
-(JNIEnv * env, jclass obj, jlong a_file_info){
-    TSK_FS_FILE * file_info = castFsFileInfo(env, a_file_info);
+JNIEXPORT void JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_closeFileNat(JNIEnv * env,
+    jclass obj, jlong a_file_info) {
+    TSK_FS_FILE *file_info = castFsFileInfo(env, a_file_info);
     tsk_fs_file_close(file_info);
 }
 
@@ -613,9 +657,10 @@ JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_closeFileNat
  * @param env pointer to java environment this was called from
  * @param obj the java object this was called from
  */
-JNIEXPORT jstring JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_getVersionNat
-(JNIEnv * env, jclass obj){
-    const char * cversion = tsk_version_get_str();
+JNIEXPORT jstring JNICALL
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_getVersionNat(JNIEnv * env,
+    jclass obj) {
+    const char *cversion = tsk_version_get_str();
     jstring jversion = (*env).NewStringUTF(cversion);
-    return jversion; 
+    return jversion;
 }
diff --git a/tsk3/fs/fs_open.c b/tsk3/fs/fs_open.c
index 0c623fd1e..b5f84878e 100644
--- a/tsk3/fs/fs_open.c
+++ b/tsk3/fs/fs_open.c
@@ -54,7 +54,8 @@ tsk_fs_open_vol(const TSK_VS_PART_INFO * a_part_info,
         tsk_error_set_errstr("tsk_fs_open_vol: Null vpart handle");
         return NULL;
     }
-    else if (a_part_info->vs == NULL) {
+    else if ((a_part_info->vs == NULL)
+        || (a_part_info->vs->tag != TSK_VS_INFO_TAG)) {
         tsk_error_reset();
         tsk_error_set_errno(TSK_ERR_FS_ARG);
         tsk_error_set_errstr("tsk_fs_open_vol: Null vs handle");
diff --git a/tsk3/vs/bsd.c b/tsk3/vs/bsd.c
index e37adfacc..eeeeea093 100644
--- a/tsk3/vs/bsd.c
+++ b/tsk3/vs/bsd.c
@@ -200,6 +200,7 @@ bsd_load_table(TSK_VS_INFO * a_vs)
 static void
 bsd_close(TSK_VS_INFO * a_vs)
 {
+    a_vs->tag = 0;
     tsk_vs_part_free(a_vs);
     free(a_vs);
 }
@@ -224,6 +225,7 @@ tsk_vs_bsd_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset)
 
     vs->img_info = img_info;
     vs->vstype = TSK_VS_TYPE_BSD;
+    vs->tag = TSK_VS_INFO_TAG;
 
     /* use the offset provided */
     vs->offset = offset;
diff --git a/tsk3/vs/dos.c b/tsk3/vs/dos.c
index a5d71ec66..a9ef51a03 100644
--- a/tsk3/vs/dos.c
+++ b/tsk3/vs/dos.c
@@ -1019,6 +1019,7 @@ dos_load_prim_table(TSK_VS_INFO * vs, uint8_t test)
 static void
 dos_close(TSK_VS_INFO * vs)
 {
+    vs->tag = 0;
     tsk_vs_part_free(vs);
     free(vs);
 }
@@ -1047,6 +1048,7 @@ tsk_vs_dos_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset, uint8_t test)
         return NULL;
 
     vs->vstype = TSK_VS_TYPE_DOS;
+    vs->tag = TSK_VS_INFO_TAG;
     vs->img_info = img_info;
 
     vs->offset = offset;
diff --git a/tsk3/vs/gpt.c b/tsk3/vs/gpt.c
index 4632c091b..e6fd07635 100644
--- a/tsk3/vs/gpt.c
+++ b/tsk3/vs/gpt.c
@@ -267,6 +267,7 @@ gpt_load_table(TSK_VS_INFO * vs)
 static void
 gpt_close(TSK_VS_INFO * vs)
 {
+    vs->tag = 0;
     tsk_vs_part_free(vs);
     free(vs);
 }
@@ -285,6 +286,7 @@ tsk_vs_gpt_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset)
 
     vs->img_info = img_info;
     vs->vstype = TSK_VS_TYPE_GPT;
+    vs->tag = TSK_VS_INFO_TAG;
 
     /* If an offset was given, then use that too */
     vs->offset = offset;
diff --git a/tsk3/vs/mac.c b/tsk3/vs/mac.c
index 61a4b416e..88a20d4b6 100644
--- a/tsk3/vs/mac.c
+++ b/tsk3/vs/mac.c
@@ -163,6 +163,7 @@ mac_load_table(TSK_VS_INFO * vs)
 static void
 mac_close(TSK_VS_INFO * vs)
 {
+    vs->tag = 0;
     tsk_vs_part_free(vs);
     free(vs);
 }
@@ -185,6 +186,7 @@ tsk_vs_mac_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset)
 
     vs->img_info = img_info;
     vs->vstype = TSK_VS_TYPE_MAC;
+    vs->tag = TSK_VS_INFO_TAG;
 
     /* If an offset was given, then use that too */
     vs->offset = offset;
diff --git a/tsk3/vs/mm_part.c b/tsk3/vs/mm_part.c
index 38d0786c5..cb65ea6a2 100644
--- a/tsk3/vs/mm_part.c
+++ b/tsk3/vs/mm_part.c
@@ -50,6 +50,7 @@ tsk_vs_part_add(TSK_VS_INFO * a_vs, TSK_DADDR_T a_start, TSK_DADDR_T len,
     part->flags = type;
     part->vs = a_vs;
     part->addr = 0;
+    part->tag = TSK_VS_PART_INFO_TAG;
 
     /* is this the first entry in the list */
     if (a_vs->part_list == NULL) {
@@ -180,7 +181,7 @@ tsk_vs_part_free(TSK_VS_INFO * a_vs)
     while (part) {
         if (part->desc)
             free(part->desc);
-
+        part->tag = 0;
         part2 = part->next;
         free(part);
         part = part2;
@@ -203,10 +204,11 @@ tsk_vs_part_get(const TSK_VS_INFO * a_vs, TSK_PNUM_T a_idx)
 {
     TSK_VS_PART_INFO *part;
 
-    if (a_vs == NULL) {
+    if ((a_vs == NULL) || (a_vs->tag != TSK_VS_INFO_TAG)) {
         tsk_error_reset();
         tsk_error_set_errno(TSK_ERR_VS_ARG);
-        tsk_error_set_errstr("tsk_vs_part_get: pointer is NULL");
+        tsk_error_set_errstr
+            ("tsk_vs_part_get: pointer is NULL or has unallocated structures");
         return NULL;
     }
 
diff --git a/tsk3/vs/sun.c b/tsk3/vs/sun.c
index 2cac0efba..a878a6fbe 100644
--- a/tsk3/vs/sun.c
+++ b/tsk3/vs/sun.c
@@ -323,6 +323,7 @@ sun_load_table(TSK_VS_INFO * vs)
 static void
 sun_close(TSK_VS_INFO * vs)
 {
+    vs->tag = 0;
     tsk_vs_part_free(vs);
     free(vs);
 }
@@ -341,6 +342,7 @@ tsk_vs_sun_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset)
 
     vs->img_info = img_info;
     vs->vstype = TSK_VS_TYPE_SUN;
+    vs->tag = TSK_VS_INFO_TAG;
 
     vs->offset = offset;
 
diff --git a/tsk3/vs/tsk_vs.h b/tsk3/vs/tsk_vs.h
index 39fe6a1a0..de5c86d1a 100644
--- a/tsk3/vs/tsk_vs.h
+++ b/tsk3/vs/tsk_vs.h
@@ -62,6 +62,7 @@ extern "C" {
     * for open volume systems.
     */
     struct TSK_VS_INFO {
+        int tag;                ///< \internal Will be set to TSK_VS_INFO_TAG if structure is still allocated, 0 if not
         TSK_IMG_INFO *img_info; ///< Pointer to disk image that VS is in
         TSK_VS_TYPE_ENUM vstype;        ///< Type of volume system / media management
         TSK_DADDR_T offset;     ///< Byte offset where VS starts in disk image
@@ -76,7 +77,7 @@ extern "C" {
         void (*close) (TSK_VS_INFO *);  ///< \internal Progs should call tsk_vs_close().
     };
 
-
+#define TSK_VS_INFO_TAG  0x52301642
 
 
     /***************************************************************
@@ -98,6 +99,7 @@ extern "C" {
     * Linked list entry that describes a volume in a generic way. 
     */
     struct TSK_VS_PART_INFO {
+        int tag;
         TSK_VS_PART_INFO *prev; ///< Pointer to previous partition (or NULL)
         TSK_VS_PART_INFO *next; ///< Pointer to next partition (or NULL)
         TSK_VS_INFO *vs;        ///< Pointer to parent volume system handle
@@ -111,6 +113,7 @@ extern "C" {
         TSK_VS_PART_FLAG_ENUM flags;    ///< Flags for partition
     };
 
+#define TSK_VS_PART_INFO_TAG  0x90121253
 
     // to and from type ids and names
     extern TSK_VS_TYPE_ENUM tsk_vs_type_toid(const TSK_TCHAR *);
-- 
GitLab