From 2e43bd5595db3530be7ce5c72e00e7b7186f7027 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Wed, 26 Dec 2018 21:33:33 +0100 Subject: [PATCH] Fixes bug that could cause crashes When using an alias with $i.. parameter without providing enough params it would expand to subList(i, params.size). If i was larger than the number of parameters, this would violate an invariant in subList and cause a crash. This bug was fixed, additionally the code now matches the functionality of the desktop version, further bugs introduced while porting the code have been fixed. --- .../libquassel/quassel/syncables/AliasManager.kt | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt index 132f1624e..5ac5b64b3 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt @@ -113,9 +113,9 @@ class AliasManager constructor( if (!msg.startsWith('/') || firstSpacePos == 1 || (secondSlashPos != -1 && (secondSlashPos < firstSpacePos || firstSpacePos == -1))) { if (msg.startsWith("//")) - msg = msg.substring(1) // "//asdf" is transformed to "/asdf" + msg = msg.substring(1) // "//asdf" is transformed to "/asdf" else if (msg.startsWith("/ ")) - msg.substring(2) // "/ /asdf" is transformed to "/asdf" + msg = msg.substring(2) // "/ /asdf" is transformed to "/asdf" msg = "/SAY $msg" // make sure we only send proper commands to the core } else { // check for aliases @@ -149,16 +149,12 @@ class AliasManager constructor( for (match in paramRange.findAll(command)) { val start = match.groups[1]?.value?.toIntOrNull() ?: -1 val replacement: String + val end = match.groups[2]?.value?.toIntOrNull() ?: params.size // $1.. would be "arg1 and all following" - replacement = if (match.groups[2]?.value.isNullOrEmpty()) { - params.subList(start, params.size).joinToString(" ") + replacement = if (end < start) { + "" } else { - val end = match.groups[2]?.value?.toIntOrNull() ?: -1 - if (end < start) { - "" - } else { - params.subList(start, end).joinToString(" ") - } + params.subList(start, end).joinToString(" ") } command = command.substring(0, match.range.start) + replacement + command.substring(match.range.endInclusive + 1) -- GitLab