diff options
author | Cary Clark <caryclark@google.com> | 2016-11-15 13:22:25 -0500 |
---|---|---|
committer | Cary Clark <caryclark@google.com> | 2016-11-15 19:03:36 +0000 |
commit | 918fb1fe6ff5349a2d1e5fb6872139f5fb931480 (patch) | |
tree | 3ee1a67b9d336959d885d6a4bb819e3bedc2d795 | |
parent | fb191da789c988b6ed1502cc1c210be3f9c53b52 (diff) |
fuzz hang fix and pathops client debugging
The ASAN fuzzer on chrome caught a hanging state.
To capture the data, allow the pathops client debugging
to run in a release build.
TBR=reed@google.com
BUG=665295
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=4834
Change-Id: I6b2c2baabd63994f63aa730d2ee7828986b5ab89
Reviewed-on: https://skia-review.googlesource.com/4834
Commit-Queue: Cary Clark <caryclark@google.com>
Reviewed-by: Cary Clark <caryclark@google.com>
-rw-r--r-- | src/pathops/SkOpSegment.cpp | 7 | ||||
-rw-r--r-- | src/pathops/SkPathOpsDebug.cpp | 4 | ||||
-rw-r--r-- | src/pathops/SkPathOpsDebug.h | 4 | ||||
-rw-r--r-- | src/pathops/SkPathOpsOp.cpp | 7 | ||||
-rw-r--r-- | src/pathops/SkPathOpsSimplify.cpp | 7 | ||||
-rw-r--r-- | tests/PathOpsOpTest.cpp | 27 | ||||
-rw-r--r-- | tests/skia_test.cpp | 2 |
7 files changed, 50 insertions, 8 deletions
diff --git a/src/pathops/SkOpSegment.cpp b/src/pathops/SkOpSegment.cpp index f3f874710e..a1818d36cd 100644 --- a/src/pathops/SkOpSegment.cpp +++ b/src/pathops/SkOpSegment.cpp @@ -837,12 +837,19 @@ SkOpSpanBase* SkOpSegment::markAndChaseDone(SkOpSpanBase* start, SkOpSpanBase* e markDone(minSpan); SkOpSpanBase* last = nullptr; SkOpSegment* other = this; + SkOpSpan* priorDone = nullptr; + SkOpSpan* lastDone = nullptr; while ((other = other->nextChase(&start, &step, &minSpan, &last))) { if (other->done()) { SkASSERT(!last); break; } + if (lastDone == minSpan || priorDone == minSpan) { + return nullptr; + } other->markDone(minSpan); + priorDone = lastDone; + lastDone = minSpan; } return last; } diff --git a/src/pathops/SkPathOpsDebug.cpp b/src/pathops/SkPathOpsDebug.cpp index 58b33c0ab9..0906c456e7 100644 --- a/src/pathops/SkPathOpsDebug.cpp +++ b/src/pathops/SkPathOpsDebug.cpp @@ -13,7 +13,7 @@ #include "SkPathOpsDebug.h" #include "SkString.h" -#ifdef SK_DEBUG +#if DEBUG_DUMP_VERIFY bool SkPathOpsDebug::gDumpOp; // set to true to write op to file before a crash bool SkPathOpsDebug::gVerifyOp; // set to true to compare result against regions #endif @@ -2906,7 +2906,7 @@ void SkPathOpsDebug::ShowOnePath(const SkPath& path, const char* name, bool incl showPathContours(iter, name); } -#ifdef SK_DEBUG +#if DEBUG_DUMP_VERIFY #include "SkData.h" #include "SkStream.h" diff --git a/src/pathops/SkPathOpsDebug.h b/src/pathops/SkPathOpsDebug.h index 0258d58c9e..aba02b1c8b 100644 --- a/src/pathops/SkPathOpsDebug.h +++ b/src/pathops/SkPathOpsDebug.h @@ -58,6 +58,7 @@ class SkOpContourHead; #define DEBUG_CUBIC_BINARY_SEARCH 0 #define DEBUG_CUBIC_SPLIT 0 #define DEBUG_DUMP_SEGMENTS 0 +#define DEBUG_DUMP_VERIFY 0 #define DEBUG_FLOW 0 #define DEBUG_LIMIT_WIND_SUM 0 #define DEBUG_MARK_DONE 0 @@ -87,6 +88,7 @@ class SkOpContourHead; #define DEBUG_COINCIDENCE_VERBOSE 01 #define DEBUG_CUBIC_BINARY_SEARCH 0 #define DEBUG_CUBIC_SPLIT 1 +#define DEBUG_DUMP_VERIFY 0 #define DEBUG_DUMP_SEGMENTS 1 #define DEBUG_FLOW 1 #define DEBUG_LIMIT_WIND_SUM 15 @@ -375,7 +377,7 @@ public: static bool gRunFail; static bool gVeryVerbose; -#ifdef SK_DEBUG +#if DEBUG_DUMP_VERIFY static bool gDumpOp; static bool gVerifyOp; diff --git a/src/pathops/SkPathOpsOp.cpp b/src/pathops/SkPathOpsOp.cpp index f423ba9123..f6b08ead07 100644 --- a/src/pathops/SkPathOpsOp.cpp +++ b/src/pathops/SkPathOpsOp.cpp @@ -223,7 +223,10 @@ bool OpDebug(const SkPath& one, const SkPath& two, SkPathOp op, SkPath* result SkOpGlobalState globalState(contourList, &allocator SkDEBUGPARAMS(skipAssert) SkDEBUGPARAMS(testName)); SkOpCoincidence coincidence(&globalState); -#ifdef SK_DEBUG +#if DEBUG_DUMP_VERIFY +#ifndef SK_DEBUG + const char* testName = "release"; +#endif if (SkPathOpsDebug::gDumpOp) { SkPathOpsDebug::DumpOp(one, two, op, testName); } @@ -316,7 +319,7 @@ bool OpDebug(const SkPath& one, const SkPath& two, SkPathOp op, SkPath* result } bool Op(const SkPath& one, const SkPath& two, SkPathOp op, SkPath* result) { -#ifdef SK_DEBUG +#if DEBUG_DUMP_VERIFY if (SkPathOpsDebug::gVerifyOp) { if (!OpDebug(one, two, op, result SkDEBUGPARAMS(false) SkDEBUGPARAMS(nullptr))) { SkPathOpsDebug::ReportOpFail(one, two, op); diff --git a/src/pathops/SkPathOpsSimplify.cpp b/src/pathops/SkPathOpsSimplify.cpp index d587c3bbbb..8cd770dd54 100644 --- a/src/pathops/SkPathOpsSimplify.cpp +++ b/src/pathops/SkPathOpsSimplify.cpp @@ -158,7 +158,10 @@ bool SimplifyDebug(const SkPath& path, SkPath* result SkOpGlobalState globalState(contourList, &allocator SkDEBUGPARAMS(skipAssert) SkDEBUGPARAMS(testName)); SkOpCoincidence coincidence(&globalState); -#ifdef SK_DEBUG +#if DEBUG_DUMP_VERIFY +#ifndef SK_DEBUG + const char* testName = "release"; +#endif if (SkPathOpsDebug::gDumpOp) { SkPathOpsDebug::DumpSimplify(path, testName); } @@ -223,7 +226,7 @@ bool SimplifyDebug(const SkPath& path, SkPath* result } bool Simplify(const SkPath& path, SkPath* result) { -#ifdef SK_DEBUG +#if DEBUG_DUMP_VERIFY if (SkPathOpsDebug::gVerifyOp) { if (!SimplifyDebug(path, result SkDEBUGPARAMS(false) SkDEBUGPARAMS(nullptr))) { SkPathOpsDebug::ReportSimplifyFail(path); diff --git a/tests/PathOpsOpTest.cpp b/tests/PathOpsOpTest.cpp index f5bbfcdef0..68250959b5 100644 --- a/tests/PathOpsOpTest.cpp +++ b/tests/PathOpsOpTest.cpp @@ -8348,7 +8348,34 @@ path.conicTo(SkBits2Float(0x552d5b5b), SkBits2Float(0x3b5a6839), SkBits2Float(0x testPathOpFuzz(reporter, path1, path2, (SkPathOp) 0, filename); } +static void fuzzhang_1(skiatest::Reporter* reporter, const char* filename) {
+ SkPath path;
+ path.setFillType((SkPath::FillType) 1);
+path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000)); // 0, 0
+path.cubicTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000), SkBits2Float(0x668ece09), SkBits2Float(0x00000000), SkBits2Float(0x6751c81a), SkBits2Float(0x61c4b0fb)); // 0, 0, 3.37188e+23f, 0, 9.90666e+23f, 4.53539e+20f
+path.conicTo(SkBits2Float(0x66f837a9), SkBits2Float(0x00000000), SkBits2Float(0x00000000), SkBits2Float(0x00000000), SkBits2Float(0x3f823406)); // 5.86087e+23f, 0, 0, 0, 1.01721f
+path.close();
+path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000)); // 0, 0
+path.quadTo(SkBits2Float(0x675b1bfe), SkBits2Float(0x00000000), SkBits2Float(0x67d76c42), SkBits2Float(0x6292c469)); // 1.03471e+24f, 0, 2.03461e+24f, 1.35369e+21f
+path.cubicTo(SkBits2Float(0x6a16df68), SkBits2Float(0x651a2f15), SkBits2Float(0x6c1e7f31), SkBits2Float(0x67a1f9b4), SkBits2Float(0x00000000), SkBits2Float(0x6a2a291f)); // 4.55985e+25f, 4.55071e+22f, 7.66444e+26f, 1.52981e+24f, 0, 5.14279e+25f
+path.conicTo(SkBits2Float(0x680dcb75), SkBits2Float(0x68dd898d), SkBits2Float(0x681a434a), SkBits2Float(0x6871046b), SkBits2Float(0x3fea0440)); // 2.67843e+24f, 8.36944e+24f, 2.91394e+24f, 4.55269e+24f, 1.82825f
+path.quadTo(SkBits2Float(0x679e1b26), SkBits2Float(0x687703c4), SkBits2Float(0x00000000), SkBits2Float(0x687d2968)); // 1.49327e+24f, 4.66598e+24f, 0, 4.78209e+24f
+path.lineTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000)); // 0, 0
+path.close();
+
+ SkPath path1(path);
+ path.reset();
+ path.setFillType((SkPath::FillType) 0);
+path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000)); // 0, 0
+path.cubicTo(SkBits2Float(0x535353ec), SkBits2Float(0x98989898), SkBits2Float(0x98989898), SkBits2Float(0xf207f36e), SkBits2Float(0xf3f2f2f2), SkBits2Float(0xed3a9781)); // 9.07646e+11f, -3.94452e-24f, -3.94452e-24f, -2.69278e+30f, -3.84968e+31f, -3.60921e+27f
+path.quadTo(SkBits2Float(0xf8f8c0ed), SkBits2Float(0xf8f8f8f8), SkBits2Float(0x9f9f9f9f), SkBits2Float(0x3014149f)); // -4.03626e+34f, -4.03981e+34f, -6.76032e-20f, 5.38714e-10f
+
+ SkPath path2(path);
+ testPathOp(reporter, path1, path2, (SkPathOp) 0, filename);
+}
+ static struct TestDesc failTests[] = { + TEST(fuzzhang_1), TEST(fuzz763_57), TEST(fuzz763_56), TEST(fuzz763_55), diff --git a/tests/skia_test.cpp b/tests/skia_test.cpp index 93b6c698b2..4cb55d0853 100644 --- a/tests/skia_test.cpp +++ b/tests/skia_test.cpp @@ -137,7 +137,7 @@ static bool should_run(const char* testName, bool isGPUTest) { int test_main(); int test_main() { -#ifdef SK_DEBUG +#if DEBUG_DUMP_VERIFY SkPathOpsDebug::gDumpOp = FLAGS_dumpOp; SkPathOpsDebug::gVerifyOp = FLAGS_verifyOp; #endif |