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