Skip to content

Commit ff916b6

Browse files
committed
Disallow repeated keys in CBOR (WIP, need to add config switches)
Fixes Kotlin#2662
1 parent 251bca7 commit ff916b6

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

core/commonMain/src/kotlinx/serialization/SerializationExceptions.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,9 @@ internal constructor(message: String?) : SerializationException(message) {
133133
// This constructor is used by the generated serializers
134134
constructor(index: Int) : this("An unknown field for index $index")
135135
}
136+
137+
/**
138+
* Thrown when a map deserializer encounters a repeated map key (and configuration disallows this.)
139+
*/
140+
@ExperimentalSerializationApi
141+
public class RepeatedMapKeyException() : SerializationException("Duplicate keys not allowed in maps")

core/commonMain/src/kotlinx/serialization/internal/CollectionSerializers.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ public sealed class MapLikeSerializer<Key, Value, Collection, Builder : MutableM
110110
} else {
111111
decoder.decodeSerializableElement(descriptor, vIndex, valueSerializer)
112112
}
113+
if (key in builder) {
114+
throw RepeatedMapKeyException()
115+
}
113116
builder[key] = value
114117
}
115118

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package kotlinx.serialization.cbor
2+
3+
import kotlinx.serialization.assertFailsWithMessage
4+
import kotlinx.serialization.decodeFromByteArray
5+
import kotlinx.serialization.HexConverter
6+
import kotlinx.serialization.RepeatedMapKeyException
7+
import kotlin.test.Test
8+
import kotlin.test.assertEquals
9+
10+
class CborStrictModeTest {
11+
12+
/** Duplicate keys are rejected. */
13+
@Test
14+
fun testDuplicateKeys() {
15+
val duplicateKeys = HexConverter.parseHexBinary("A2617805617806")
16+
assertFailsWithMessage<RepeatedMapKeyException>("Duplicate keys not allowed in maps") {
17+
Cbor.decodeFromByteArray<Map<String, Long>>(duplicateKeys)
18+
}
19+
}
20+
}

0 commit comments

Comments
 (0)