From 6c308ae4c453f6f2bd5806b12c71206bb105f907 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Thu, 28 Sep 2017 01:01:08 +0200
Subject: [PATCH] Fixed a bug where quassel violates the QtDatastream protocol

---
 .../primitive/serializer/DateTimeSerializer.kt     |  6 ------
 .../primitive/serializer/StringSerializer.kt       |  2 +-
 .../kuschku/libquassel/session/CoreConnection.kt   |  5 +++++
 .../kuschku/libquassel/util/helpers/ArrayHelper.kt | 14 ++++++++++++++
 .../libquassel/util/helpers/ByteBufferHelper.kt    |  7 +++++++
 5 files changed, 27 insertions(+), 7 deletions(-)
 create mode 100644 lib/src/main/java/de/kuschku/libquassel/util/helpers/ArrayHelper.kt

diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt
index 3d6f407e2..a0b0451e0 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt
@@ -64,12 +64,6 @@ object DateTimeSerializer : Serializer<Temporal> {
           .with(JulianFields.JULIAN_DAY, julianDay)
           .with(ChronoField.MILLI_OF_DAY, milliOfDay)
           .toInstant()
-      TimeSpec.OffsetFromUTC ->
-        Instant.EPOCH.atOffset(
-          ZoneOffset.ofTotalSeconds(IntSerializer.deserialize(buffer, features)))
-          .with(JulianFields.JULIAN_DAY, julianDay)
-          .with(ChronoField.MILLI_OF_DAY, milliOfDay)
-          .toInstant()
       else                   ->
         Instant.EPOCH.atOffset(ZoneOffset.UTC)
           .with(JulianFields.JULIAN_DAY, julianDay)
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
index d893b2d44..86a270e1c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
@@ -89,7 +89,7 @@ abstract class StringSerializer(
       null
     } else {
       val limit = buffer.limit()
-      buffer.limit(buffer.position() + len - trailingNullBytes)
+      buffer.limit(buffer.position() + Math.max(0, len - trailingNullBytes))
       val charBuffer = charBuffer(len)
       decoder.reset()
       decoder.decode(buffer, charBuffer, true)
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
index 73ca50adb..398a9f30f 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
@@ -14,6 +14,7 @@ import de.kuschku.libquassel.util.compatibility.HandlerService
 import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.*
 import de.kuschku.libquassel.util.compatibility.log
 import de.kuschku.libquassel.util.hasFlag
+import de.kuschku.libquassel.util.helpers.hexDump
 import de.kuschku.libquassel.util.helpers.write
 import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import de.kuschku.libquassel.util.nio.WrappedChannel
@@ -191,10 +192,12 @@ class CoreConnection(
           session.handle(msg)
         } catch (e: Throwable) {
           log(WARN, TAG, "Error encountered while handling sigproxy message", e)
+          log(WARN, TAG, msg.toString())
         }
       }
     } catch (e: Throwable) {
       log(WARN, TAG, "Error encountered while parsing sigproxy message", e)
+      dataBuffer.hexDump()
     }
   }
 
@@ -207,9 +210,11 @@ class CoreConnection(
         session.handle(msg)
       } catch (e: Throwable) {
         log(WARN, TAG, "Error encountered while handling handshake message", e)
+        log(WARN, TAG, msg.toString())
       }
     } catch (e: Throwable) {
       log(WARN, TAG, "Error encountered while parsing handshake message", e)
+      dataBuffer.hexDump()
     }
   }
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/helpers/ArrayHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ArrayHelper.kt
new file mode 100644
index 000000000..0acd30bec
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ArrayHelper.kt
@@ -0,0 +1,14 @@
+package de.kuschku.libquassel.util.helpers
+
+import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.WARN
+import de.kuschku.libquassel.util.compatibility.log
+
+fun ByteArray.hexDump() {
+  for (i in 0 until this.size step 33) {
+    log(WARN, "HexDump",
+        (0 until 33).map { it + i }.filter { it < this.size }.joinToString(" ") {
+          String.format("%02x", this[it])
+        }
+    )
+  }
+}
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/helpers/ByteBufferHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ByteBufferHelper.kt
index 0401092c7..209c4343e 100644
--- a/lib/src/main/java/de/kuschku/libquassel/util/helpers/ByteBufferHelper.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ByteBufferHelper.kt
@@ -15,3 +15,10 @@ fun ByteBuffer?.deserializeString(serializer: StringSerializer) = if (this == nu
 } else {
   serializer.deserializeAll(this)
 }
+
+fun ByteBuffer.hexDump() {
+  val target = ByteBuffer.allocate(this.capacity())
+  this.clear()
+  this.copyTo(target)
+  target.array().hexDump()
+}
-- 
GitLab