aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Leon Scroggins III <scroggo@google.com>2018-06-26 10:49:42 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-06-26 15:22:12 +0000
commit665949a3ecf1fbe188a8387aa9a3db99432f82ec (patch)
tree8b6c981ae07395181e75676fa2d2551f648536c0
parent439b99451445a9d61f0670bbe3f588f5b08f59fa (diff)
Update libjpeg-turbo to pre-2.0.0 (from 1.5.3)
jpeg_skip_scanlines was incorrectly incrementing an internal counter, resulting in an infinite loop. (This only occurs for certain types of progressive images, using certain sample sizes.) The fix is at https://github.com/libjpeg-turbo/libjpeg-turbo/commit/26f109290dc4ffc9c522d9f5d5a7d5d1ee2c0e0a. This is included in tip-of-tree, which is unofficially 2.0.0, so go ahead and update to it. Add a test based on the original bug. Bug: b/78329453 Change-Id: I5ade9924812324d58668c26f71cd622ef93f40a7 Reviewed-on: https://skia-review.googlesource.com/129459 Commit-Queue: Leon Scroggins <scroggo@google.com> Reviewed-by: Mike Klein <mtklein@google.com>
-rw-r--r--DEPS2
-rw-r--r--resources/images/b78329453.jpegbin0 -> 46457 bytes
-rw-r--r--tests/CodecTest.cpp36
-rw-r--r--third_party/libjpeg-turbo/BUILD.gn8
4 files changed, 41 insertions, 5 deletions
diff --git a/DEPS b/DEPS
index f8a574e995..f99906c7d6 100644
--- a/DEPS
+++ b/DEPS
@@ -18,7 +18,7 @@ deps = {
"third_party/externals/imgui" : "https://skia.googlesource.com/external/github.com/ocornut/imgui.git@6384eee34f08cb7eab8d835043e1738e4adcdf75",
# TODO: remove jsoncpp after migrating clients to SkJSON
"third_party/externals/jsoncpp" : "https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git@1.0.0",
- "third_party/externals/libjpeg-turbo" : "https://skia.googlesource.com/external/github.com/libjpeg-turbo/libjpeg-turbo.git@1.5.3",
+ "third_party/externals/libjpeg-turbo" : "https://skia.googlesource.com/external/github.com/libjpeg-turbo/libjpeg-turbo.git@26f109290dc4ffc9c522d9f5d5a7d5d1ee2c0e0a",
"third_party/externals/libpng" : "https://skia.googlesource.com/third_party/libpng.git@v1.6.33",
"third_party/externals/libwebp" : "https://chromium.googlesource.com/webm/libwebp.git@v0.6.1",
"third_party/externals/lua" : "https://skia.googlesource.com/external/github.com/lua/lua.git@v5-3-4",
diff --git a/resources/images/b78329453.jpeg b/resources/images/b78329453.jpeg
new file mode 100644
index 0000000000..b962b9eedd
--- /dev/null
+++ b/resources/images/b78329453.jpeg
Binary files differ
diff --git a/tests/CodecTest.cpp b/tests/CodecTest.cpp
index 14b227c7d0..5b1ef0e06d 100644
--- a/tests/CodecTest.cpp
+++ b/tests/CodecTest.cpp
@@ -1581,6 +1581,42 @@ DEF_TEST(Codec_ossfuzz6274, r) {
}
}
+DEF_TEST(Codec_78329453, r) {
+ if (GetResourcePath().isEmpty()) {
+ return;
+ }
+
+ const char* file = "images/b78329453.jpeg";
+ auto data = GetResourceAsData(file);
+ if (!data) {
+ ERRORF(r, "Missing %s", file);
+ return;
+ }
+
+ auto codec = SkAndroidCodec::MakeFromCodec(SkCodec::MakeFromData(data));
+ if (!codec) {
+ ERRORF(r, "failed to create codec from %s", file);
+ return;
+ }
+
+ // A bug in jpeg_skip_scanlines resulted in an infinite loop for this specific
+ // sample size on this image. Other sample sizes could have had the same result,
+ // but the ones tested by DM happen to not.
+ constexpr int kSampleSize = 19;
+ const auto size = codec->getSampledDimensions(kSampleSize);
+ auto info = codec->getInfo().makeWH(size.width(), size.height());
+ SkBitmap bm;
+ bm.allocPixels(info);
+ bm.eraseColor(SK_ColorTRANSPARENT);
+
+ SkAndroidCodec::AndroidOptions options;
+ options.fSampleSize = kSampleSize;
+ auto result = codec->getAndroidPixels(info, bm.getPixels(), bm.rowBytes(), &options);
+ if (result != SkCodec::kSuccess) {
+ ERRORF(r, "failed to decode with error %s", SkCodec::ResultToString(result));
+ }
+}
+
DEF_TEST(Codec_crbug807324, r) {
if (GetResourcePath().isEmpty()) {
return;
diff --git a/third_party/libjpeg-turbo/BUILD.gn b/third_party/libjpeg-turbo/BUILD.gn
index 66e10955d5..1f9b486637 100644
--- a/third_party/libjpeg-turbo/BUILD.gn
+++ b/third_party/libjpeg-turbo/BUILD.gn
@@ -72,13 +72,13 @@ if (skia_use_system_libjpeg_turbo) {
if (current_cpu == "arm" && !is_ios) {
sources += [
- "../externals/libjpeg-turbo/simd/jsimd_arm.c",
- "../externals/libjpeg-turbo/simd/jsimd_arm_neon.S",
+ "../externals/libjpeg-turbo/simd/arm/jsimd.c",
+ "../externals/libjpeg-turbo/simd/arm/jsimd_neon.S",
]
} else if (current_cpu == "arm64" && !is_ios) {
sources += [
- "../externals/libjpeg-turbo/simd/jsimd_arm64.c",
- "../externals/libjpeg-turbo/simd/jsimd_arm64_neon.S",
+ "../externals/libjpeg-turbo/simd/arm64/jsimd.c",
+ "../externals/libjpeg-turbo/simd/arm64/jsimd_neon.S",
]
} else {
sources += [ "../externals/libjpeg-turbo/jsimd_none.c" ]