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