diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/links/CallLinks.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/links/CallLinks.kt index cd9cc4c85e..9430626a6c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/links/CallLinks.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/links/CallLinks.kt @@ -110,6 +110,9 @@ object CallLinks { } catch (_: UnsupportedEncodingException) { Log.w(TAG, "Invalid url: $url") return null + } catch (_: IllegalArgumentException) { + Log.w(TAG, "Invalid url: $url") + return null } val key = fragmentQuery[ROOT_KEY] diff --git a/app/src/test/java/org/thoughtcrime/securesms/calls/links/CallLinksTest.kt b/app/src/test/java/org/thoughtcrime/securesms/calls/links/CallLinksTest.kt new file mode 100644 index 0000000000..c95e66fbab --- /dev/null +++ b/app/src/test/java/org/thoughtcrime/securesms/calls/links/CallLinksTest.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2026 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.calls.links + +import org.junit.Assert.assertNull +import org.junit.BeforeClass +import org.junit.Test +import org.signal.core.util.logging.Log +import org.thoughtcrime.securesms.testutil.EmptyLogger + +/** + * See [CallLinks] + */ +class CallLinksTest { + companion object { + @JvmStatic + @BeforeClass + fun setUpClass() { + Log.initialize(EmptyLogger()) + } + } + + @Test + fun `parseUrl returns null for malformed percent escape instead of throwing`() { + assertNull(CallLinks.parseUrl("https://signal.link/call/#key=abcdef&n=%ZZ")) + } + + @Test + fun `parseUrl returns null for malformed percent escape in key instead of throwing`() { + assertNull(CallLinks.parseUrl("https://signal.link/call/#key=%ZZ")) + } +}