From 03b1d38ba3c67703e648fb067570eeb1a1e61265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Andr=C3=A9s=20Margffoy=20Tuay?= Date: Wed, 15 Jul 2020 10:20:16 -0500 Subject: [PATCH] PR: Improve handling of truncated/incomplete and corrupt JPEG images (#2471) * Add corruption cases * Read jpeg headers until exhaustion * Minor error correction * Add test script * Raise exception when image is truncated * Add test * Skip damaged_jpeg folder * Compare against basename * Remove unused test file --- test/assets/damaged_jpeg/TensorFlow-LICENSE | 13 +++++++++++++ test/assets/damaged_jpeg/bad_huffman.jpg | Bin 0 -> 15416 bytes test/assets/damaged_jpeg/corrupt.jpg | Bin 0 -> 1552 bytes test/assets/damaged_jpeg/corrupt34_2.jpg | Bin 0 -> 755 bytes test/assets/damaged_jpeg/corrupt34_3.jpg | Bin 0 -> 5505 bytes test/assets/damaged_jpeg/corrupt34_4.jpg | Bin 0 -> 5092 bytes test/test_image.py | 20 ++++++++++++++++++++ torchvision/csrc/cpu/image/readjpeg_cpu.cpp | 5 ++++- 8 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 test/assets/damaged_jpeg/TensorFlow-LICENSE create mode 100644 test/assets/damaged_jpeg/bad_huffman.jpg create mode 100644 test/assets/damaged_jpeg/corrupt.jpg create mode 100644 test/assets/damaged_jpeg/corrupt34_2.jpg create mode 100644 test/assets/damaged_jpeg/corrupt34_3.jpg create mode 100644 test/assets/damaged_jpeg/corrupt34_4.jpg diff --git a/test/assets/damaged_jpeg/TensorFlow-LICENSE b/test/assets/damaged_jpeg/TensorFlow-LICENSE new file mode 100644 index 00000000000..c7563fe4e5b --- /dev/null +++ b/test/assets/damaged_jpeg/TensorFlow-LICENSE @@ -0,0 +1,13 @@ + Copyright 2019 The TensorFlow Authors. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/test/assets/damaged_jpeg/bad_huffman.jpg b/test/assets/damaged_jpeg/bad_huffman.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ef5b6f12c5588e63f9573f921286141ec0af1335 GIT binary patch literal 15416 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 literal 0 HcmV?d00001 diff --git a/test/assets/damaged_jpeg/corrupt34_3.jpg b/test/assets/damaged_jpeg/corrupt34_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c1c2a9d1e1e9d942a982c4f53815d4af0ef8e92a GIT binary patch literal 5505 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 N%VYWIp?j>Re**2dQX2pO literal 0 HcmV?d00001 diff --git a/test/test_image.py b/test/test_image.py index 09a591d19ef..0bf3daf5528 100644 --- a/test/test_image.py +++ b/test/test_image.py @@ -1,4 +1,5 @@ import os +import glob import unittest import sys @@ -10,11 +11,15 @@ IMAGE_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets") IMAGE_DIR = os.path.join(IMAGE_ROOT, "fakedata", "imagefolder") +DAMAGED_JPEG = os.path.join(IMAGE_ROOT, 'damaged_jpeg') def get_images(directory, img_ext): assert os.path.isdir(directory) for root, _, files in os.walk(directory): + if os.path.basename(root) == 'damaged_jpeg': + continue + for fl in files: _, ext = os.path.splitext(fl) if ext == img_ext: @@ -44,6 +49,21 @@ def test_decode_jpeg(self): with self.assertRaises(RuntimeError): decode_jpeg(torch.empty((100), dtype=torch.uint8)) + def test_damaged_images(self): + # Test image with bad Huffman encoding (should not raise) + bad_huff = os.path.join(DAMAGED_JPEG, 'bad_huffman.jpg') + try: + _ = read_jpeg(bad_huff) + except RuntimeError: + self.assertTrue(False) + + # Truncated images should raise an exception + truncated_images = glob.glob( + os.path.join(DAMAGED_JPEG, 'corrupt*.jpg')) + for image_path in truncated_images: + with self.assertRaises(RuntimeError): + read_jpeg(image_path) + def test_read_png(self): # Check across .png for img_path in get_images(IMAGE_DIR, ".png"): diff --git a/torchvision/csrc/cpu/image/readjpeg_cpu.cpp b/torchvision/csrc/cpu/image/readjpeg_cpu.cpp index 4954b2c2474..b3e3d2ffa5a 100644 --- a/torchvision/csrc/cpu/image/readjpeg_cpu.cpp +++ b/torchvision/csrc/cpu/image/readjpeg_cpu.cpp @@ -48,7 +48,10 @@ static void torch_jpeg_init_source(j_decompress_ptr cinfo) {} static boolean torch_jpeg_fill_input_buffer(j_decompress_ptr cinfo) { torch_jpeg_mgr* src = (torch_jpeg_mgr*)cinfo->src; - // No more data. Probably an incomplete image; just output EOI. + // No more data. Probably an incomplete image; Raise exception. + torch_jpeg_error_ptr myerr = (torch_jpeg_error_ptr)cinfo->err; + strcpy(jpegLastErrorMsg, "Image is incomplete or truncated"); + longjmp(myerr->setjmp_buffer, 1); src->pub.next_input_byte = EOI_BUFFER; src->pub.bytes_in_buffer = 1; return TRUE;