From e80ede4429ac4c45565f599217a7b38410f1c94a Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 7 Sep 2011 11:04:03 +0100 Subject: [PATCH] Map keys must be unique. --- components/net/sf/briar/serial/ReaderImpl.java | 10 ++++++++-- test/net/sf/briar/serial/ReaderImplTest.java | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/components/net/sf/briar/serial/ReaderImpl.java b/components/net/sf/briar/serial/ReaderImpl.java index ffc7af901..32f56df70 100644 --- a/components/net/sf/briar/serial/ReaderImpl.java +++ b/components/net/sf/briar/serial/ReaderImpl.java @@ -497,7 +497,10 @@ class ReaderImpl implements Reader { return readMap(k, v, readLength()); } else if(next == Tag.MAP_START) { Map m = new HashMap(); - while(!hasEnd()) m.put(readObject(k), readObject(v)); + while(!hasEnd()) { + if(m.put(readObject(k), readObject(v)) != null) + throw new FormatException(); // Duplicate key + } readEnd(); return m; } else { @@ -511,7 +514,10 @@ class ReaderImpl implements Reader { assert size >= 0; if(size == 0) return Collections.emptyMap(); Map m = new HashMap(); - for(int i = 0; i < size; i++) m.put(readObject(k), readObject(v)); + for(int i = 0; i < size; i++) { + if(m.put(readObject(k), readObject(v)) != null) + throw new FormatException(); // Duplicate key + } return m; } diff --git a/test/net/sf/briar/serial/ReaderImplTest.java b/test/net/sf/briar/serial/ReaderImplTest.java index ddd310acc..aa5c0bfb7 100644 --- a/test/net/sf/briar/serial/ReaderImplTest.java +++ b/test/net/sf/briar/serial/ReaderImplTest.java @@ -248,6 +248,23 @@ public class ReaderImplTest extends TestCase { assertTrue(r.eof()); } + @Test + public void testMapKeysMustBeUnique() throws Exception { + setContents("B" + "2" + "83666F6F" + "01" + "83626172" + "02" + + "B" + "2" + "83666F6F" + "01" + "83666F6F" + "02"); + // The first map has unique keys + Map m = r.readMap(String.class, Byte.class); + assertNotNull(m); + assertEquals(2, m.size()); + assertEquals(Byte.valueOf((byte) 1), m.get("foo")); + assertEquals(Byte.valueOf((byte) 2), m.get("bar")); + // The second map has a duplicate key + try { + r.readMap(String.class, Byte.class); + fail(); + } catch(FormatException expected) {} + } + @Test public void testReadDelimitedList() throws Exception { setContents("F3" + "01" + "83666F6F" + "FC0080" + "F1");