stifle /0 warnings in TF invert
No path through allows an infinite term in the inverse.
It's all funneled through tf_is_valid().
Bug: oss-fuzz:12430, oss-fuzz:12426
Change-Id: Id65cada5dceb7c18c1ff86ae29d012e86db98972
Reviewed-on: https://skia-review.googlesource.com/c/182072
Auto-Submit: Mike Klein <mtklein@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/profiles/fuzz/zero_g.icc b/profiles/fuzz/zero_g.icc
new file mode 100644
index 0000000..dbd1202
--- /dev/null
+++ b/profiles/fuzz/zero_g.icc
Binary files differ
diff --git a/profiles/fuzz/zero_g.icc.txt b/profiles/fuzz/zero_g.icc.txt
new file mode 100644
index 0000000..8577aab
--- /dev/null
+++ b/profiles/fuzz/zero_g.icc.txt
@@ -0,0 +1,38 @@
+ Size : 0x00000090 : 144
+ Data color space : 0x47524159 : 'GRAY'
+ PCS : 0x58595A20 : 'XYZ '
+ Tag count : 0x00000001 : 1
+
+ Tag : Type : Size : Offset
+ ------ : ------ : ------ : --------
+ 'kTRC' : 'curv' : 32 : 104
+
+rTRC : 0, 1, 0, 0, 0, 0, 0
+gTRC : 0, 1, 0, 0, 0, 0, 0
+bTRC : 0, 1, 0, 0, 0, 0, 0
+ XYZ : | 0.961425781 0.000000000 0.000000000 |
+ | 0.000000000 1.000488281 0.000000000 |
+ | 0.000000000 0.000000000 0.832519531 |
+252 random bytes transformed to linear XYZD50 bytes:
+ f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+ f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+ f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+ f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+ f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+ f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+ f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+ f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+ f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f500d4 f5ffd4
+ f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+ f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+ f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4 f5ffd4
+81 edge-case pixels transformed to sRGB 8888 (unpremul):
+ 00000000 004a00ff 004a00ff 0000ff00 0000fcff 0000fcff 0000ff00 0000fcff 0000fcff
+ 00ff2e00 00ff00ff 00ff00ff 00f8ff00 00fffffd 00fffffd 00f8ff00 00fffffd 00fffffd
+ 00ff2e00 00ff00ff 00ff00ff 00f8ff00 00fffffd 00fffffd 00f8ff00 00fffffd 00fffffd
+ 7f000000 7f4a00ff 7f4a00ff 7f00ff00 7f00fcff 7f00fcff 7f00ff00 7f00fcff 7f00fcff
+ 7fff2e00 7fff00ff 7fff00ff 7ff8ff00 7ffffffd 7ffffffd 7ff8ff00 7ffffffd 7ffffffd
+ 7fff2e00 7fff00ff 7fff00ff 7ff8ff00 7ffffffd 7ffffffd 7ff8ff00 7ffffffd 7ffffffd
+ ff000000 ff4a00ff ff4a00ff ff00ff00 ff00fcff ff00fcff ff00ff00 ff00fcff ff00fcff
+ ffff2e00 ffff00ff ffff00ff fff8ff00 fffffffd fffffffd fff8ff00 fffffffd fffffffd
+ ffff2e00 ffff00ff ffff00ff fff8ff00 fffffffd fffffffd fff8ff00 fffffffd fffffffd
diff --git a/skcms.cc b/skcms.cc
index c2617d3..19ea5a2 100644
--- a/skcms.cc
+++ b/skcms.cc
@@ -1403,6 +1403,9 @@
: powf_(tf->a * x + tf->b, tf->g) + tf->e);
}
+#if defined(__clang__)
+ [[clang::no_sanitize("float-divide-by-zero")]] // Checked for by tf_is_valid() on the way out.
+#endif
bool skcms_TransferFunction_invert(const skcms_TransferFunction* src, skcms_TransferFunction* dst) {
if (!tf_is_valid(src)) {
return false;
diff --git a/tests.c b/tests.c
index ad3ef83..c6ae8a8 100644
--- a/tests.c
+++ b/tests.c
@@ -601,6 +601,9 @@
// This calibrated profile has a non-zero black.
"profiles/misc/calibrated_nonzero_black.icc",
+
+ // A zero g term causes a divide by zero when inverting.
+ "profiles/fuzz/zero_g.icc", // oss-fuzz:12430
};
static void test_Parse(bool regen) {