From ba65f0b08ee8b93195c3f3277820771f5b62aa52 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 23:26:28 +0100 Subject: [PATCH] Fix Memory DOS in ImageFont * A corrupt or specially crafted TTF font could have font metrics that lead to unreasonably large sizes when rendering text in font. ImageFont.py did not check the image size before allocating memory for it. * Found with oss-fuzz * This dates from the PIL fork --- ...e8e927ba6c0d38274a37c1567560eb33baf74627.ttf | Bin 0 -> 50373 bytes Tests/test_imagefont.py | 13 +++++++++++++ src/PIL/ImageFont.py | 1 + 3 files changed, 14 insertions(+) create mode 100644 Tests/fonts/oom-e8e927ba6c0d38274a37c1567560eb33baf74627.ttf diff --git a/Tests/fonts/oom-e8e927ba6c0d38274a37c1567560eb33baf74627.ttf b/Tests/fonts/oom-e8e927ba6c0d38274a37c1567560eb33baf74627.ttf new file mode 100644 index 0000000000000000000000000000000000000000..79013251524b109bad3ec84ed9f2864f7cca6e1e GIT binary patch literal 50373 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