Check for min int in BMP header

Bug: os-fuzz:6288

Negating it is undefined, so don't try.

Change-Id: I055520b8036dd8b355e744114717e08d76206bc1
Reviewed-on: https://skia-review.googlesource.com/107062
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Leon Scroggins <scroggo@google.com>
diff --git a/resources/invalid_images/osfuzz6288.bmp b/resources/invalid_images/osfuzz6288.bmp
new file mode 100644
index 0000000..fd6e0b8
--- /dev/null
+++ b/resources/invalid_images/osfuzz6288.bmp
Binary files differ
diff --git a/src/codec/SkBmpCodec.cpp b/src/codec/SkBmpCodec.cpp
index d97dff0..7dd49a5 100644
--- a/src/codec/SkBmpCodec.cpp
+++ b/src/codec/SkBmpCodec.cpp
@@ -268,6 +268,11 @@
     // Check for valid dimensions from header
     SkCodec::SkScanlineOrder rowOrder = SkCodec::kBottomUp_SkScanlineOrder;
     if (height < 0) {
+        // We can't negate INT32_MIN.
+        if (height == INT32_MIN) {
+            return kInvalidInput;
+        }
+
         height = -height;
         rowOrder = SkCodec::kTopDown_SkScanlineOrder;
     }
diff --git a/tests/CodecTest.cpp b/tests/CodecTest.cpp
index 8172751..290686f 100644
--- a/tests/CodecTest.cpp
+++ b/tests/CodecTest.cpp
@@ -623,7 +623,7 @@
 static void test_invalid(skiatest::Reporter* r, const char path[]) {
     auto data = GetResourceAsData(path);
     if (!data) {
-        ERRORF(r, "Failed to get resources %s", path);
+        ERRORF(r, "Failed to get resource %s", path);
         return;
     }
 
@@ -655,6 +655,7 @@
 #endif
     test_invalid(r, "invalid_images/b37623797.ico");
     test_invalid(r, "invalid_images/osfuzz6295.webp");
+    test_invalid(r, "invalid_images/osfuzz6288.bmp");
 }
 
 #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED