xref: /aosp_15_r20/external/cronet/testing/libfuzzer/fuzzers/skia_path_common.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2016 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "testing/libfuzzer/fuzzers/skia_path_common.h"
6 
7 #include "third_party/skia/include/core/SkPath.h"
8 
9 // This is needed because SkPath::readFromMemory does not seem to be able to
10 // be able to handle arbitrary input.
BuildPath(const uint8_t ** data,size_t * size,SkPath * path,int last_verb)11 void BuildPath(const uint8_t** data,
12                size_t* size,
13                SkPath* path,
14                int last_verb) {
15   uint8_t operation;
16   SkScalar a, b, c, d, e, f;
17   while (read<uint8_t>(data, size, &operation)) {
18     switch (operation % (last_verb + 1)) {
19       case SkPath::Verb::kMove_Verb:
20         if (!read<SkScalar>(data, size, &a) || !read<SkScalar>(data, size, &b))
21           return;
22         path->moveTo(a, b);
23         break;
24 
25       case SkPath::Verb::kLine_Verb:
26         if (!read<SkScalar>(data, size, &a) || !read<SkScalar>(data, size, &b))
27           return;
28         path->lineTo(a, b);
29         break;
30 
31       case SkPath::Verb::kQuad_Verb:
32         if (!read<SkScalar>(data, size, &a) ||
33             !read<SkScalar>(data, size, &b) ||
34             !read<SkScalar>(data, size, &c) ||
35             !read<SkScalar>(data, size, &d))
36           return;
37         path->quadTo(a, b, c, d);
38         break;
39 
40       case SkPath::Verb::kConic_Verb:
41         if (!read<SkScalar>(data, size, &a) ||
42             !read<SkScalar>(data, size, &b) ||
43             !read<SkScalar>(data, size, &c) ||
44             !read<SkScalar>(data, size, &d) ||
45             !read<SkScalar>(data, size, &e))
46           return;
47         path->conicTo(a, b, c, d, e);
48         break;
49 
50       case SkPath::Verb::kCubic_Verb:
51         if (!read<SkScalar>(data, size, &a) ||
52             !read<SkScalar>(data, size, &b) ||
53             !read<SkScalar>(data, size, &c) ||
54             !read<SkScalar>(data, size, &d) ||
55             !read<SkScalar>(data, size, &e) ||
56             !read<SkScalar>(data, size, &f))
57           return;
58         path->cubicTo(a, b, c, d, e, f);
59         break;
60 
61       case SkPath::Verb::kClose_Verb:
62         path->close();
63         break;
64 
65       case SkPath::Verb::kDone_Verb:
66         // In this case, simply exit.
67         return;
68     }
69   }
70 }
71