diff --git a/src/cryfs-cli/Cli.cpp b/src/cryfs-cli/Cli.cpp index ad7b4107..3d8f099d 100644 --- a/src/cryfs-cli/Cli.cpp +++ b/src/cryfs-cli/Cli.cpp @@ -157,9 +157,7 @@ namespace cryfs_cli { fuse->init(); return fuse; } catch (const CryfsException &e) { - if (e.what() != string()) { - LOG(ERR, "Error {}: {}", static_cast(e.errorCode()), e.what()); - } + throw; // CryfsException is only thrown if setup goes wrong. Throw it through so that we get the correct process exit code. } catch (const std::exception &e) { LOG(ERR, "Crashed: {}", e.what()); } catch (...) { diff --git a/src/jni/include/libcryfs-jni.h b/src/jni/include/libcryfs-jni.h index 50eecb27..f65ad0b6 100644 --- a/src/jni/include/libcryfs-jni.h +++ b/src/jni/include/libcryfs-jni.h @@ -2,7 +2,7 @@ jlong cryfs_init(JNIEnv *env, jstring jbaseDir, jstring jlocalSateDir, jbyteArray jpassword, jbyteArray jgivenHash, jobject returnedHash, jboolean createBaseDir, - jstring jcipher); + jstring jcipher, jobject jerrorCode); jboolean cryfs_change_encryption_key(JNIEnv *env, jstring jbaseDir, jstring jlocalStateDir, jbyteArray jcurrentPassword, jbyteArray jgivenHash, diff --git a/src/jni/libcryfs-jni.cpp b/src/jni/libcryfs-jni.cpp index 4582cd3f..a58b52c8 100644 --- a/src/jni/libcryfs-jni.cpp +++ b/src/jni/libcryfs-jni.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -14,18 +15,21 @@ using fspp::fuse::Fuse; std::set validFusePtrs; +jfieldID getValueField(JNIEnv* env, jobject object) { + return env->GetFieldID(env->GetObjectClass(object), "value", "Ljava/lang/Object;"); +} + void setReturnedPasswordHash(JNIEnv* env, jobject jreturnedHash, const SizedData& returnedHash) { - jfieldID value = env->GetFieldID(env->GetObjectClass(jreturnedHash), "value", "Ljava/lang/Object;"); jbyteArray jpasswordHash = env->NewByteArray(returnedHash.size); env->SetByteArrayRegion(jpasswordHash, 0, returnedHash.size, reinterpret_cast(returnedHash.data)); delete[] returnedHash.data; - env->SetObjectField(jreturnedHash, value, jpasswordHash); + env->SetObjectField(jreturnedHash, getValueField(env, jreturnedHash), jpasswordHash); } extern "C" jlong cryfs_init(JNIEnv *env, jstring jbaseDir, jstring jlocalStateDir, jbyteArray jpassword, jbyteArray jgivenHash, jobject jreturnedHash, jboolean createBaseDir, - jstring jcipher) { + jstring jcipher, jobject jerrorCode) { const char* baseDir = env->GetStringUTFChars(jbaseDir, NULL); const char* localStateDir = env->GetStringUTFChars(jlocalStateDir, NULL); boost::optional cipher = none; @@ -54,8 +58,18 @@ cryfs_init(JNIEnv *env, jstring jbaseDir, jstring jlocalStateDir, jbyteArray jpa } } - Fuse* fuse = Cli(keyGenerator, SCrypt::DefaultSettings).initFilesystem(options, credentials); - + Fuse* fuse = 0; + try { + fuse = Cli(keyGenerator, SCrypt::DefaultSettings).initFilesystem(options, credentials); + } catch (const cryfs::CryfsException &e) { + int errorCode = static_cast(e.errorCode()); + if (e.what() != string()) { + LOG(cpputils::logging::ERR, "Error {}: {}", errorCode, e.what()); + } + jclass integerClass = env->FindClass("java/lang/Integer"); + jobject integer = env->NewObject(integerClass, env->GetMethodID(integerClass, "", "(I)V"), errorCode); + env->SetObjectField(jerrorCode, getValueField(env, jerrorCode), integer); + } if (jpassword == NULL) { env->ReleaseByteArrayElements(jgivenHash, reinterpret_cast(credentials.givenHash.data), 0); }