From badc8fe08c9e47b87df66b8a16c67010e3614e35 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Mon, 15 May 2023 21:27:09 +0200 Subject: [PATCH] fix empty bytes object construction --- .../Benchmarks/Benchmarks.csproj | 4 ++-- dotnet/Razorvine.Pickle/Pickle/Pickle.csproj | 8 ++++---- .../Pickle/Objects/ByteArrayConstructor.cs | 6 +++++- .../UnitTests/Pickle/UnpicklerTests.cs | 9 +++++++++ .../Razorvine.Pickle/UnitTests/UnitTests.csproj | 6 +++--- java/.idea/compiler.xml | 6 +++--- .../libraries/Maven__junit_junit_4_13_1.xml | 13 ------------- .../Maven__org_hamcrest_hamcrest_core_1_3.xml | 13 ------------- java/.idea/misc.xml | 3 ++- java/.idea/modules.xml | 9 --------- java/pickle.iml | 17 ----------------- .../pickle/objects/ByteArrayConstructor.java | 8 ++++++-- .../razorvine/pickle/objects/package-info.java | 2 +- .../java/net/razorvine/pickle/package-info.java | 2 +- .../razorvine/pickle/test/UnpicklerTest.java | 9 +++++++++ 15 files changed, 45 insertions(+), 70 deletions(-) delete mode 100644 java/.idea/libraries/Maven__junit_junit_4_13_1.xml delete mode 100644 java/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml delete mode 100644 java/.idea/modules.xml delete mode 100644 java/pickle.iml diff --git a/dotnet/Razorvine.Pickle/Benchmarks/Benchmarks.csproj b/dotnet/Razorvine.Pickle/Benchmarks/Benchmarks.csproj index c1bacbd..a78fcd6 100644 --- a/dotnet/Razorvine.Pickle/Benchmarks/Benchmarks.csproj +++ b/dotnet/Razorvine.Pickle/Benchmarks/Benchmarks.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/dotnet/Razorvine.Pickle/Pickle/Pickle.csproj b/dotnet/Razorvine.Pickle/Pickle/Pickle.csproj index ef50957..e21a2e0 100644 --- a/dotnet/Razorvine.Pickle/Pickle/Pickle.csproj +++ b/dotnet/Razorvine.Pickle/Pickle/Pickle.csproj @@ -8,9 +8,9 @@ Irmen de Jong Python pickle serialization protocol library for .NET Razorvine.Pickle - 1.3.0 - 1.3.0.0 - 1.3.0.0 + 1.4.0 + 1.4.0.0 + 1.4.0.0 true false Pickle.snk @@ -25,6 +25,6 @@ Stand alone pickle library. - + diff --git a/dotnet/Razorvine.Pickle/Pickle/Pickle/Objects/ByteArrayConstructor.cs b/dotnet/Razorvine.Pickle/Pickle/Pickle/Objects/ByteArrayConstructor.cs index 00742d2..0669019 100644 --- a/dotnet/Razorvine.Pickle/Pickle/Pickle/Objects/ByteArrayConstructor.cs +++ b/dotnet/Razorvine.Pickle/Pickle/Pickle/Objects/ByteArrayConstructor.cs @@ -15,9 +15,13 @@ public class ByteArrayConstructor : IObjectConstructor { public object construct(object[] args) { // args for bytearray constructor: [ String string, String encoding ] // args for bytearray constructor (from python3 bytes): [ ArrayList ] or just [byte[]] (when it uses BINBYTES opcode) - if (args.Length != 1 && args.Length != 2) + // or, zero arguments: empty bytearray. + if (args.Length>2) throw new PickleException("invalid pickle data for bytearray; expected 1 or 2 args, got "+args.Length); + if (args.Length == 0) + return new byte[]{}; + if(args.Length==1) { if(args[0] is byte[]) { return args[0]; diff --git a/dotnet/Razorvine.Pickle/UnitTests/Pickle/UnpicklerTests.cs b/dotnet/Razorvine.Pickle/UnitTests/Pickle/UnpicklerTests.cs index 51cf46d..5ef1b48 100644 --- a/dotnet/Razorvine.Pickle/UnitTests/Pickle/UnpicklerTests.cs +++ b/dotnet/Razorvine.Pickle/UnitTests/Pickle/UnpicklerTests.cs @@ -407,6 +407,15 @@ public void TestBytesAndByteArray() Assert.Equal(Encoding.ASCII.GetBytes("ABCDEFGH"), (byte[])U(p3)); } + [Fact] + public void TestUnpickleEmptyBytes() { + byte[] pickled = { + 128, 2, 99, 95, 95, 98, 117, 105, 108, 116, 105, 110, 95, 95, 10, 98, 121, 116, 101, 115, 10, 113, 0, 41, 82, 113, 1, 46 + }; + byte[] obj = (byte[]) (new Unpickler().loads(pickled)); + Assert.Empty(obj); + } + [Fact] public void TestArray() { diff --git a/dotnet/Razorvine.Pickle/UnitTests/UnitTests.csproj b/dotnet/Razorvine.Pickle/UnitTests/UnitTests.csproj index e7f8901..2ec7b26 100644 --- a/dotnet/Razorvine.Pickle/UnitTests/UnitTests.csproj +++ b/dotnet/Razorvine.Pickle/UnitTests/UnitTests.csproj @@ -7,9 +7,9 @@ 7.3 - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/java/.idea/compiler.xml b/java/.idea/compiler.xml index f0d60f7..f266876 100644 --- a/java/.idea/compiler.xml +++ b/java/.idea/compiler.xml @@ -7,16 +7,16 @@ - + - + \ No newline at end of file diff --git a/java/.idea/libraries/Maven__junit_junit_4_13_1.xml b/java/.idea/libraries/Maven__junit_junit_4_13_1.xml deleted file mode 100644 index 9fa24fc..0000000 --- a/java/.idea/libraries/Maven__junit_junit_4_13_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/java/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/java/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml deleted file mode 100644 index f58bbc1..0000000 --- a/java/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/java/.idea/misc.xml b/java/.idea/misc.xml index e8942bd..b7b1c11 100644 --- a/java/.idea/misc.xml +++ b/java/.idea/misc.xml @@ -1,5 +1,6 @@ + - + \ No newline at end of file diff --git a/java/.idea/modules.xml b/java/.idea/modules.xml deleted file mode 100644 index f84b693..0000000 --- a/java/.idea/modules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/java/pickle.iml b/java/pickle.iml deleted file mode 100644 index 3a298a2..0000000 --- a/java/pickle.iml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/java/src/main/java/net/razorvine/pickle/objects/ByteArrayConstructor.java b/java/src/main/java/net/razorvine/pickle/objects/ByteArrayConstructor.java index 6d16eed..b71b128 100644 --- a/java/src/main/java/net/razorvine/pickle/objects/ByteArrayConstructor.java +++ b/java/src/main/java/net/razorvine/pickle/objects/ByteArrayConstructor.java @@ -16,8 +16,12 @@ public class ByteArrayConstructor implements IObjectConstructor { public Object construct(Object[] args) throws PickleException { // args for bytearray constructor: [ String string, String encoding ] // args for bytearray constructor (from python3 bytes): [ ArrayList ] or just [byte[]] (when it uses BINBYTES opcode) - if (args.length != 1 && args.length != 2) - throw new PickleException("invalid pickle data for bytearray; expected 1 or 2 args, got "+args.length); + // or, zero arguments: empty bytearray. + if (args.length>2) + throw new PickleException("invalid pickle data for bytearray; expected 0, 1 or 2 args, got "+args.length); + + if(args.length==0) + return new byte[0]; if(args.length==1) { if(args[0] instanceof byte[]) { diff --git a/java/src/main/java/net/razorvine/pickle/objects/package-info.java b/java/src/main/java/net/razorvine/pickle/objects/package-info.java index 4ff3e48..f93e1c5 100644 --- a/java/src/main/java/net/razorvine/pickle/objects/package-info.java +++ b/java/src/main/java/net/razorvine/pickle/objects/package-info.java @@ -2,7 +2,7 @@ * Object constructors and other utility classes for the pickle package. * * @author Irmen de Jong (irmen@razorvine.net) - * @version 1.2 + * @version 1.4 * @see net.razorvine.pickle */ package net.razorvine.pickle.objects; diff --git a/java/src/main/java/net/razorvine/pickle/package-info.java b/java/src/main/java/net/razorvine/pickle/package-info.java index 4eb9ba7..c720421 100644 --- a/java/src/main/java/net/razorvine/pickle/package-info.java +++ b/java/src/main/java/net/razorvine/pickle/package-info.java @@ -10,7 +10,7 @@ * functionality. * * @author Irmen de Jong (irmen@razorvine.net) - * @version 1.2 + * @version 1.4 */ package net.razorvine.pickle; diff --git a/java/src/test/java/net/razorvine/pickle/test/UnpicklerTest.java b/java/src/test/java/net/razorvine/pickle/test/UnpicklerTest.java index aaa37b6..fc11efc 100644 --- a/java/src/test/java/net/razorvine/pickle/test/UnpicklerTest.java +++ b/java/src/test/java/net/razorvine/pickle/test/UnpicklerTest.java @@ -498,6 +498,15 @@ public void testBytesAndByteArray() throws IOException assertArrayEquals(new byte[]{'A','B','C','D','E','F','G','H'}, (byte[])U(p3)); } + @Test + public void testUnpickleEmptyBytes() throws IOException { + byte[] pickled = new byte[] { + (byte)128, 2, 99, 95, 95, 98, 117, 105, 108, 116, 105, 110, 95, 95, 10, 98, 121, 116, 101, 115, 10, 113, 0, 41, 82, 113, 1, 46 + }; + byte[] obj = (byte[]) (new Unpickler().loads(pickled)); + assertEquals(0, obj.length); + } + @Test public void testArray() throws PickleException, IOException {