Skip to content

Commit 81bce1a

Browse files
authored
Fix a bug where xlen larger than 0x7fff was rejected (#1280)
We treated this short value as unsigned and it should have been treated as signed.
1 parent b9b3fce commit 81bce1a

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

okio/src/jvmMain/kotlin/okio/GzipSource.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ class GzipSource(source: Source) : Source {
117117
if (flags.getBit(FEXTRA)) {
118118
source.require(2)
119119
if (fhcrc) updateCrc(source.buffer, 0, 2)
120-
val xlen = source.buffer.readShortLe().toLong()
120+
val xlen = (source.buffer.readShortLe().toInt() and 0xffff).toLong()
121121
source.require(xlen)
122122
if (fhcrc) updateCrc(source.buffer, 0, xlen)
123123
source.skip(xlen)

okio/src/jvmTest/kotlin/okio/GzipKotlinTest.kt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,28 @@ import org.junit.Test
2323
class GzipKotlinTest {
2424
@Test fun sink() {
2525
val data = Buffer()
26-
val gzip = (data as Sink).gzip()
27-
gzip.buffer().writeUtf8("Hi!").close()
26+
(data as Sink).gzip().buffer().use { gzip ->
27+
gzip.writeUtf8("Hi!")
28+
}
2829
assertEquals("1f8b0800000000000000f3c8540400dac59e7903000000", data.readByteString().hex())
2930
}
3031

3132
@Test fun source() {
3233
val buffer = Buffer().write("1f8b0800000000000000f3c8540400dac59e7903000000".decodeHex())
33-
val gzip = (buffer as Source).gzip()
34-
assertEquals("Hi!", gzip.buffer().readUtf8())
34+
(buffer as Source).gzip().buffer().use { gzip ->
35+
assertEquals("Hi!", gzip.readUtf8())
36+
}
37+
}
38+
39+
@Test fun extraLongXlen() {
40+
val xlen = 0xffff
41+
val buffer = Buffer()
42+
.write("1f8b0804000000000000".decodeHex())
43+
.writeShort(xlen)
44+
.write(ByteArray(xlen))
45+
.write("f3c8540400dac59e7903000000".decodeHex())
46+
(buffer as Source).gzip().buffer().use { gzip ->
47+
assertEquals("Hi!", gzip.readUtf8())
48+
}
3549
}
3650
}

0 commit comments

Comments
 (0)