diff --git a/src/libraries/System.IO.Compression/src/System/IO/Compression/DeflateManaged/HuffmanTree.cs b/src/libraries/System.IO.Compression/src/System/IO/Compression/DeflateManaged/HuffmanTree.cs index f2262caad22986..a4f1f621df37ee 100644 --- a/src/libraries/System.IO.Compression/src/System/IO/Compression/DeflateManaged/HuffmanTree.cs +++ b/src/libraries/System.IO.Compression/src/System/IO/Compression/DeflateManaged/HuffmanTree.cs @@ -247,6 +247,12 @@ private void CreateTable() } index = -value; // go to next node + if (index >= array.Length) + { + // prevent an IndexOutOfRangeException from array[index] + throw new InvalidDataException(SR.InvalidHuffmanData); + } + codeBitMask <<= 1; overflowBits--; } while (overflowBits != 0); diff --git a/src/libraries/System.IO.Compression/tests/ZipArchive/zip_InvalidParametersAndStrangeFiles.cs b/src/libraries/System.IO.Compression/tests/ZipArchive/zip_InvalidParametersAndStrangeFiles.cs index 87695ad071edff..1bb8b2a113b05a 100644 --- a/src/libraries/System.IO.Compression/tests/ZipArchive/zip_InvalidParametersAndStrangeFiles.cs +++ b/src/libraries/System.IO.Compression/tests/ZipArchive/zip_InvalidParametersAndStrangeFiles.cs @@ -871,6 +871,24 @@ public void ReadArchive_WithDiskStartNumberGreaterThanIntMax() Assert.Null(exception); } + /// + /// This test checks that an InvalidDataException will be thrown when consuming a zip with bad Huffman data. + /// + [Fact] + public static async Task ZipArchive_InvalidHuffmanData() + { + string filename = bad("HuffmanTreeException.zip"); + using (ZipArchive archive = new ZipArchive(await StreamHelpers.CreateTempCopyStream(filename), ZipArchiveMode.Read)) + { + ZipArchiveEntry e = archive.Entries[0]; + using (MemoryStream ms = new MemoryStream()) + using (Stream s = e.Open()) + { + Assert.Throws(() => s.CopyTo(ms)); //"Should throw on creating Huffman tree" + } + } + } + private static readonly byte[] s_slightlyIncorrectZip64 = { // ===== Local file header signature 0x04034b50