Use unsigned version of short numbers in ZipImplementation
Because some two-byte represented numbers (like amount of files in the zip) exceed 32767 (but less than 65534)
This commit is contained in:
committed by
TeamCityServer
parent
ea5157cadc
commit
b547870d71
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.cli.jvm.compiler.jarfs
|
package org.jetbrains.kotlin.cli.jvm.compiler.jarfs
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer
|
||||||
import java.nio.ByteOrder
|
import java.nio.ByteOrder
|
||||||
import java.nio.MappedByteBuffer
|
import java.nio.MappedByteBuffer
|
||||||
import java.util.zip.Inflater
|
import java.util.zip.Inflater
|
||||||
@@ -35,7 +36,7 @@ fun MappedByteBuffer.contentsToByteArray(
|
|||||||
): ByteArray {
|
): ByteArray {
|
||||||
order(ByteOrder.LITTLE_ENDIAN)
|
order(ByteOrder.LITTLE_ENDIAN)
|
||||||
val extraSize =
|
val extraSize =
|
||||||
getShort(zipEntryDescription.offsetInFile + LOCAL_FILE_HEADER_EXTRA_OFFSET)
|
getUnsignedShort(zipEntryDescription.offsetInFile + LOCAL_FILE_HEADER_EXTRA_OFFSET)
|
||||||
|
|
||||||
position(
|
position(
|
||||||
zipEntryDescription.offsetInFile + LOCAL_FILE_HEADER_SIZE + zipEntryDescription.fileNameSize + extraSize
|
zipEntryDescription.offsetInFile + LOCAL_FILE_HEADER_SIZE + zipEntryDescription.fileNameSize + extraSize
|
||||||
@@ -66,7 +67,7 @@ fun MappedByteBuffer.parseCentralDirectory(): List<ZipEntryDescription> {
|
|||||||
getInt(offset) == 0x06054b50
|
getInt(offset) == 0x06054b50
|
||||||
}
|
}
|
||||||
|
|
||||||
val entriesNumber = getShort(endOfCentralDirectoryOffset + 10)
|
val entriesNumber = getUnsignedShort(endOfCentralDirectoryOffset + 10)
|
||||||
val offsetOfCentralDirectory = getInt(endOfCentralDirectoryOffset + 16)
|
val offsetOfCentralDirectory = getInt(endOfCentralDirectoryOffset + 16)
|
||||||
|
|
||||||
var currentOffset = offsetOfCentralDirectory
|
var currentOffset = offsetOfCentralDirectory
|
||||||
@@ -85,9 +86,9 @@ fun MappedByteBuffer.parseCentralDirectory(): List<ZipEntryDescription> {
|
|||||||
|
|
||||||
val compressedSize = getInt(currentOffset + 20)
|
val compressedSize = getInt(currentOffset + 20)
|
||||||
val uncompressedSize = getInt(currentOffset + 24)
|
val uncompressedSize = getInt(currentOffset + 24)
|
||||||
val fileNameLength = getShort(currentOffset + 28).toInt()
|
val fileNameLength = getUnsignedShort(currentOffset + 28).toInt()
|
||||||
val extraLength = getShort(currentOffset + 30).toInt()
|
val extraLength = getUnsignedShort(currentOffset + 30).toInt()
|
||||||
val fileCommentLength = getShort(currentOffset + 32).toInt()
|
val fileCommentLength = getUnsignedShort(currentOffset + 32).toInt()
|
||||||
|
|
||||||
val offsetOfFileData = getInt(currentOffset + 42)
|
val offsetOfFileData = getInt(currentOffset + 42)
|
||||||
|
|
||||||
@@ -118,3 +119,5 @@ fun MappedByteBuffer.parseCentralDirectory(): List<ZipEntryDescription> {
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun ByteBuffer.getUnsignedShort(offset: Int): Int = java.lang.Short.toUnsignedInt(getShort(offset))
|
||||||
|
|||||||
Reference in New Issue
Block a user