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