From 2690590c1fc8c8134562c1a29734f749a03584bd Mon Sep 17 00:00:00 2001 From: Jonathan Hepp Date: Thu, 1 Aug 2024 10:58:23 +0300 Subject: [PATCH] Fix JVM crash when finalizing a session that wasn't properly initialized (#139) (#140) --- zenoh-kotlin/src/commonMain/kotlin/io/zenoh/Session.kt | 7 +++++-- zenoh-kotlin/src/commonTest/kotlin/io/zenoh/SessionTest.kt | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/zenoh-kotlin/src/commonMain/kotlin/io/zenoh/Session.kt b/zenoh-kotlin/src/commonMain/kotlin/io/zenoh/Session.kt index de0bfd067..6712ef157 100644 --- a/zenoh-kotlin/src/commonMain/kotlin/io/zenoh/Session.kt +++ b/zenoh-kotlin/src/commonMain/kotlin/io/zenoh/Session.kt @@ -50,7 +50,7 @@ import java.time.Duration */ class Session private constructor(private val config: Config) : AutoCloseable { - private var jniSession: JNISession? = JNISession() + private var jniSession: JNISession? = null companion object { @@ -439,7 +439,10 @@ class Session private constructor(private val config: Config) : AutoCloseable { /** Launches the session through the jni session, returning the [Session] on success. */ private fun launch(): Result = runCatching { - return jniSession!!.open(config).map { this@Session } + jniSession = JNISession() + return jniSession!!.open(config) + .map { this@Session } + .onFailure { jniSession = null } } } diff --git a/zenoh-kotlin/src/commonTest/kotlin/io/zenoh/SessionTest.kt b/zenoh-kotlin/src/commonTest/kotlin/io/zenoh/SessionTest.kt index af41ca49d..55a4652e9 100644 --- a/zenoh-kotlin/src/commonTest/kotlin/io/zenoh/SessionTest.kt +++ b/zenoh-kotlin/src/commonTest/kotlin/io/zenoh/SessionTest.kt @@ -19,6 +19,7 @@ import io.zenoh.keyexpr.KeyExpr import io.zenoh.keyexpr.intoKeyExpr import io.zenoh.sample.Sample import kotlinx.coroutines.runBlocking +import java.nio.file.Path import kotlin.test.* class SessionTest { @@ -42,6 +43,12 @@ class SessionTest { assertFalse(session.isOpen()) } + @Test + fun sessionOpeningFailure() { + val invalidConfig = Config.from(Path.of("invalid")) + assertFailsWith { Session.open(invalidConfig).getOrThrow() } + } + @Test fun sessionClose_succeedsDespiteNotFreeingAllDeclarations() { val session = Session.open().getOrThrow()