From 2ea7f638d852bb9f73f520903d2a59851254dc60 Mon Sep 17 00:00:00 2001 From: Harris Date: Tue, 19 Jul 2022 14:32:05 +1000 Subject: [PATCH] fix: uninitialized exception for lateinit guardSnode in certain cases, replace with a nullable version for error handling (#926) --- .../org/session/libsession/snode/OnionRequestAPI.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt b/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt index 76d969ae3b..67404dedee 100644 --- a/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt +++ b/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt @@ -308,10 +308,11 @@ object OnionRequestAPI { */ private fun sendOnionRequest(destination: Destination, payload: Map<*, *>): Promise, Exception> { val deferred = deferred, Exception>() - lateinit var guardSnode: Snode + var guardSnode: Snode? = null buildOnionForDestination(payload, destination).success { result -> guardSnode = result.guardSnode - val url = "${guardSnode.address}:${guardSnode.port}/onion_req/v2" + val nonNullGuardSnode = result.guardSnode + val url = "${nonNullGuardSnode.address}:${nonNullGuardSnode.port}/onion_req/v2" val finalEncryptionResult = result.finalEncryptionResult val onion = finalEncryptionResult.ciphertext if (destination is Destination.Server && onion.count().toDouble() > 0.75 * FileServerAPIV2.maxFileSize.toDouble()) { @@ -398,13 +399,17 @@ object OnionRequestAPI { val promise = deferred.promise promise.fail { exception -> if (exception is HTTP.HTTPRequestFailedException && SnodeModule.isInitialized) { - val path = paths.firstOrNull { it.contains(guardSnode) } + val checkedGuardSnode = guardSnode + val path = + if (checkedGuardSnode == null) null + else paths.firstOrNull { it.contains(checkedGuardSnode) } + fun handleUnspecificError() { if (path == null) { return } var pathFailureCount = OnionRequestAPI.pathFailureCount[path] ?: 0 pathFailureCount += 1 if (pathFailureCount >= pathFailureThreshold) { - dropGuardSnode(guardSnode) + guardSnode?.let { dropGuardSnode(it) } path.forEach { snode -> @Suppress("ThrowableNotThrown") SnodeAPI.handleSnodeError(exception.statusCode, exception.json, snode, null) // Intentionally don't throw