diff --git a/bindings/java/jni/auto_db_java.cpp b/bindings/java/jni/auto_db_java.cpp index bfe39a6654f7eb2daa8a84d26e174d2694c0d7d5..e12f29252a66a91806c43371f41f89a033c3a22c 100644 --- a/bindings/java/jni/auto_db_java.cpp +++ b/bindings/java/jni/auto_db_java.cpp @@ -71,7 +71,7 @@ TskAutoDbJava::~TskAutoDbJava() TSK_RETVAL_ENUM TskAutoDbJava::initializeJni(JNIEnv * jniEnv, jobject jobj) { m_jniEnv = jniEnv; - m_javaDbObj = m_jniEnv->NewGlobalRef(jobj); // TODO free this + m_javaDbObj = m_jniEnv->NewGlobalRef(jobj); jclass localCallbackClass = m_jniEnv->FindClass("org/sleuthkit/datamodel/JniDbHelper"); if (localCallbackClass == NULL) { @@ -208,12 +208,18 @@ TskAutoDbJava::addImageInfo(int type, TSK_OFF_T ssize, int64_t & objId, const st const char *coll_cstr = collectionDetails.c_str(); jstring collj = m_jniEnv->NewStringUTF(coll_cstr); - // TODO TODO free strings? jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addImageMethodID, type, ssize, tzj, size, md5j, sha1j, sha256j, devIdj, collj); objId = (int64_t)objIdj; + // m_jniEnv->ReleaseStringUTFChars(tzj, tz_cstr); + // m_jniEnv->ReleaseStringUTFChars(md5j, md5_cstr); + // m_jniEnv->ReleaseStringUTFChars(sha1j, sha1_cstr); + //// m_jniEnv->ReleaseStringUTFChars(sha256j, sha256_cstr); + // m_jniEnv->ReleaseStringUTFChars(devIdj, devId_cstr); + // m_jniEnv->ReleaseStringUTFChars(collj, coll_cstr); + if (objId < 0) { return TSK_ERR; } @@ -290,7 +296,7 @@ TskAutoDbJava::addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId // Add the pool jlong poolObjIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addPoolMethodID, parObjId, pool_info->ctype); - long poolObjId = (int64_t)poolObjIdj; + int64_t poolObjId = (int64_t)poolObjIdj; if (poolObjId < 0) { return TSK_ERR; @@ -318,13 +324,15 @@ TSK_RETVAL_ENUM TskAutoDbJava::addPoolVolumeInfo(const TSK_POOL_VOLUME_INFO* pool_vol, int64_t parObjId, int64_t& objId) { - jstring descj = m_jniEnv->NewStringUTF(pool_vol->desc); // TODO free? + jstring descj = m_jniEnv->NewStringUTF(pool_vol->desc); jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addVolumeMethodID, parObjId, (int64_t)pool_vol->index, pool_vol->block, pool_vol->num_blocks, descj, pool_vol->flags); objId = (int64_t)objIdj; + //m_jniEnv->ReleaseStringUTFChars(descj, pool_vol->desc); + if (objId < 0) { return TSK_ERR; } @@ -345,13 +353,15 @@ TSK_RETVAL_ENUM TskAutoDbJava::addVolumeInfo(const TSK_VS_PART_INFO* vs_part, int64_t parObjId, int64_t& objId) { - jstring descj = m_jniEnv->NewStringUTF(vs_part->desc); // TODO free? + jstring descj = m_jniEnv->NewStringUTF(vs_part->desc); jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addVolumeMethodID, parObjId, (uint64_t)vs_part->addr, vs_part->start, vs_part->len, descj, vs_part->flags); objId = (int64_t)objIdj; + //m_jniEnv->ReleaseStringUTFChars(descj, vs_part->desc); + if (objId < 0) { return TSK_ERR; } @@ -548,7 +558,6 @@ TskAutoDbJava::addFile(TSK_FS_FILE* fs_file, int uid = 0; int type = TSK_FS_ATTR_TYPE_NOT_FOUND; int idx = 0; - char* zSQL; if (fs_file->name == NULL) return TSK_OK; @@ -613,9 +622,9 @@ TskAutoDbJava::addFile(TSK_FS_FILE* fs_file, strncpy(escaped_path, "/", path_len); strncat(escaped_path, path, path_len - strlen(escaped_path)); - jstring namej = m_jniEnv->NewStringUTF(name); // TODO free? - jstring pathj = m_jniEnv->NewStringUTF(escaped_path); // TODO free? - jstring extj = m_jniEnv->NewStringUTF(extension); // TODO free? + jstring namej = m_jniEnv->NewStringUTF(name); + jstring pathj = m_jniEnv->NewStringUTF(escaped_path); + jstring extj = m_jniEnv->NewStringUTF(extension); // Add the file to the database jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addFileMethodID, @@ -631,6 +640,10 @@ TskAutoDbJava::addFile(TSK_FS_FILE* fs_file, pathj, extj); objId = (int64_t)objIdj; + // m_jniEnv->ReleaseStringUTFChars(namej, name); + // m_jniEnv->ReleaseStringUTFChars(pathj, escaped_path); + // m_jniEnv->ReleaseStringUTFChars(extj, extension); + if (objId < 0) { return TSK_ERR; } @@ -657,9 +670,8 @@ TskAutoDbJava::addFile(TSK_FS_FILE* fs_file, if (strlen(extension) > 0) { strncat(extension, "-slack", 6); } - jstring slackNamej = m_jniEnv->NewStringUTF(name); // TODO free? - jstring slackExtJ = m_jniEnv->NewStringUTF(extension); // TODO free? - + jstring slackNamej = m_jniEnv->NewStringUTF(name); + jstring slackExtj = m_jniEnv->NewStringUTF(extension); TSK_OFF_T slackSize = fs_attr->nrd.allocsize - fs_attr->nrd.initsize; // Add slack file to database @@ -673,9 +685,12 @@ TskAutoDbJava::addFile(TSK_FS_FILE* fs_file, slackSize, (unsigned long long)crtime, (unsigned long long)ctime, (unsigned long long) atime, (unsigned long long) mtime, meta_mode, gid, uid, // md5TextPtr, known, - pathj, slackExtJ); + pathj, slackExtj); int64_t slackObjId = (int64_t)objIdj; + // m_jniEnv->ReleaseStringUTFChars(slackNamej, name); + // m_jniEnv->ReleaseStringUTFChars(slackExtj, extension); + if (slackObjId < 0) { return TSK_ERR; } @@ -788,13 +803,15 @@ TskAutoDbJava::addFileWithLayoutRange(const TSK_DB_FILES_TYPE_ENUM dbFileType, c fileNameSs << "_" << parentObjId << "_" << ranges[0].byteStart; fileNameSs << "_" << (ranges[numRanges - 1].byteStart + ranges[numRanges - 1].byteLen); - jstring namej = m_jniEnv->NewStringUTF(fileNameSs.str().c_str()); // TODO free? + jstring namej = m_jniEnv->NewStringUTF(fileNameSs.str().c_str()); // Insert into tsk files and tsk objects jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addLayoutFileMethodID, parentObjId, fsObjId, dataSourceObjId, dbFileType, namej, size); objId = (int64_t)objIdj; + // m_jniEnv->ReleaseStringUTFChars(namej, fileNameSs.str().c_str()); + if (objId < 0) { return TSK_ERR; } @@ -864,12 +881,14 @@ TskAutoDbJava::addUnallocFsBlockFilesParent(const int64_t fsObjId, int64_t& objI int64_t dataSourceObjId) { const char * const unallocDirName = "$Unalloc"; - jstring namej = m_jniEnv->NewStringUTF(unallocDirName); // TODO free? + jstring namej = m_jniEnv->NewStringUTF(unallocDirName); jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addUnallocParentMethodID, fsObjId, namej); objId = (int64_t)objIdj; + // m_jniEnv->ReleaseStringUTFChars(namej, unallocDirName); + if (objId < 0) { return TSK_ERR; } @@ -1016,14 +1035,17 @@ TskAutoDbJava::findParObjId(const TSK_FS_FILE* fs_file, const char* parentPath, return -1; } - jstring jpath = m_jniEnv->NewStringUTF(parent_path); // TODO free? - jstring jname = m_jniEnv->NewStringUTF(parent_name); // TODO free? + jstring jpath = m_jniEnv->NewStringUTF(parent_path); + jstring jname = m_jniEnv->NewStringUTF(parent_name); // Look up in the database jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_getParentIdMethodID, fs_file->name->par_addr, fsObjId, jpath, jname); int64_t objId = (int64_t)objIdj; + // m_jniEnv->ReleaseStringUTFChars(jpath, parent_path); + // m_jniEnv->ReleaseStringUTFChars(jname, parent_name); + if (objId < 0) { return -1; } @@ -1044,19 +1066,35 @@ TSK_RETVAL_ENUM TskAutoDbJava::addUnallocatedPoolVolume(int vol_index, int64_t parObjId, int64_t& objId) { char *desc = "Unallocated Blocks"; - jstring descj = m_jniEnv->NewStringUTF(desc); // TODO free? + jstring descj = m_jniEnv->NewStringUTF(desc); jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addVolumeMethodID, parObjId, vol_index, 0, 0, descj, 0); objId = (int64_t)objIdj; + // m_jniEnv->ReleaseStringUTFChars(descj, desc); + if (objId < 0) { return TSK_ERR; } return TSK_OK; } +void TskAutoDbJava::close() { + if (m_jniEnv == NULL) { + return; + } + + if (m_javaDbObj != NULL) { + m_jniEnv->DeleteGlobalRef(m_javaDbObj); + } + + if (m_callbackClass != NULL) { + m_jniEnv->DeleteGlobalRef(m_callbackClass); + } +} + int64_t TskAutoDbJava::getImageID() { return m_curImgId; } diff --git a/bindings/java/jni/auto_db_java.h b/bindings/java/jni/auto_db_java.h index 0c41b2153d97a1022e1f4d2e826b694d5238bc82..46db10aaeb40703e5e808a8a9e7a94c4248c28a5 100644 --- a/bindings/java/jni/auto_db_java.h +++ b/bindings/java/jni/auto_db_java.h @@ -42,6 +42,7 @@ class TskAutoDbJava :public TskAuto { virtual uint8_t openImageUtf8(int, const char *const images[], TSK_IMG_TYPE_ENUM, unsigned int a_ssize, const char* deviceId = NULL); virtual void closeImage(); + void close(); virtual void setTz(string tzone); virtual TSK_FILTER_ENUM filterVs(const TSK_VS_INFO * vs_info); @@ -52,12 +53,6 @@ class TskAutoDbJava :public TskAuto { virtual TSK_RETVAL_ENUM processFile(TSK_FS_FILE * fs_file, const char *path); const std::string getCurDir(); - - /** - * Check if we can talk to the database. - * Returns true if the database is reachable with current credentials, false otherwise. - */ - bool isDbOpen(); /** * Sets whether or not the file systems for an image should be added when @@ -159,9 +154,9 @@ class TskAutoDbJava :public TskAuto { uint32_t hash(const unsigned char* str); // JNI data - JNIEnv * m_jniEnv; - jclass m_callbackClass; - jobject m_javaDbObj; + JNIEnv * m_jniEnv = NULL; + jclass m_callbackClass = NULL; + jobject m_javaDbObj = NULL; jmethodID m_addImageMethodID = NULL; jmethodID m_addImageNameMethodID = NULL; jmethodID m_addVolumeSystemMethodID = NULL; diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.cpp b/bindings/java/jni/dataModel_SleuthkitJNI.cpp index e640922044444a289402de3db66d24fb4652ea14..990f7608be08114575e83cb5c9bfcb69dc0789da 100644 --- a/bindings/java/jni/dataModel_SleuthkitJNI.cpp +++ b/bindings/java/jni/dataModel_SleuthkitJNI.cpp @@ -1119,20 +1119,12 @@ JNIEXPORT void JNICALL } if (ret == 1) { - //fatal error + // Fatal error setThrowTskCoreError(env, msgss.str().c_str()); } else if (ret == 2) { - // TODO TODO - setThrowTskCoreError(env, msgss.str().c_str()); - /*if(tskAuto->isDbOpen()) { - // if we can still talk to the database, it's a non-fatal error - setThrowTskDataError(env, msgss.str().c_str()); - } - else { - // we cannot talk to the database, fatal error - setThrowTskCoreError(env, msgss.str().c_str()); - }*/ + // Non-fatal error + setThrowTskDataError(env, msgss.str().c_str()); } } @@ -1151,7 +1143,7 @@ JNIEXPORT void JNICALL free(imagepaths8); env->ReleaseStringUTFChars(deviceId, (const char *) device_id); - // if process completes successfully, must call revertAddImgNat or commitAddImgNat to free the TskAutoDb + // // Must call finishAddImgNat to free the TskAutoDb } /* @@ -1281,6 +1273,7 @@ Java_org_sleuthkit_datamodel_SleuthkitJNI_finishAddImgNat(JNIEnv * env, return -1; } int64_t imgId = tskAuto->getImageID(); + tskAuto->close(); delete tskAuto; tskAuto = 0; if (imgId == -1) {