Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | |
| 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 <cstddef> | |
| 6 #include <cstdint> | |
| 7 #include <random> | |
| 8 | |
| 9 #include "base/logging.h" | |
| 10 #include "base/strings/string_piece.h" | |
| 11 #include "testing/libfuzzer/fuzzers/color_space_data.h" | |
| 12 #include "third_party/qcms/src/qcms.h" | |
| 13 | |
| 14 static constexpr size_t kPixels = 2048 / 4; | |
| 15 | |
| 16 static uint32_t pixels[kPixels]; | |
| 17 | |
| 18 static void GeneratePixels(size_t hash) { | |
| 19 static std::uniform_int_distribution<uint32_t> uniform(0u, ~0u); | |
| 20 | |
| 21 std::mt19937_64 random(hash); | |
| 22 for (size_t i = 0; i < arraysize(pixels); ++i) | |
| 23 pixels[i] = uniform(random); | |
| 24 } | |
| 25 | |
| 26 static qcms_profile* test; | |
| 27 static qcms_profile* srgb; | |
| 28 | |
| 29 static void ColorTransform(bool input) { | |
| 30 if (!test) | |
| 31 return; | |
| 32 | |
| 33 const qcms_intent intent = QCMS_INTENT_DEFAULT; | |
| 34 const qcms_data_type format = QCMS_DATA_RGBA_8; | |
| 35 | |
| 36 auto transform = | |
|
dcheng
2017/04/12 07:19:23
Nit: auto*
Noel Gordon
2017/04/12 12:09:47
Done.
| |
| 37 input ? qcms_transform_create(test, format, srgb, format, intent) | |
| 38 : qcms_transform_create(srgb, format, test, format, intent); | |
| 39 if (!transform) | |
| 40 return; | |
| 41 | |
| 42 static uint32_t output[kPixels]; | |
| 43 | |
| 44 qcms_transform_data(transform, pixels, output, kPixels); | |
| 45 qcms_transform_release(transform); | |
| 46 } | |
| 47 | |
| 48 static qcms_profile* SelectProfile(size_t hash) { | |
| 49 static qcms_profile* profiles[4] = { | |
| 50 qcms_profile_from_memory(kSRGBData, arraysize(kSRGBData)), | |
| 51 qcms_profile_from_memory(kSRGBPara, arraysize(kSRGBPara)), | |
| 52 qcms_profile_from_memory(kAdobeData, arraysize(kAdobeData)), | |
| 53 qcms_profile_sRGB(), | |
| 54 }; | |
| 55 | |
| 56 return profiles[hash & 3]; | |
| 57 } | |
| 58 | |
| 59 inline size_t Hash(const char* data, size_t size) { | |
| 60 return base::StringPieceHash()(base::StringPiece(data, size)); | |
| 61 } | |
| 62 | |
| 63 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | |
| 64 constexpr size_t kSizeLimit = 4 * 1024 * 1024; | |
| 65 if (size < 128 || size > kSizeLimit) | |
| 66 return 0; | |
| 67 | |
| 68 test = qcms_profile_from_memory(data, size); | |
| 69 if (!test) | |
| 70 return 0; | |
| 71 | |
| 72 const size_t hash = Hash(reinterpret_cast<const char*>(data), size); | |
|
dcheng
2017/04/12 07:19:23
How about just running this through base::SHA1Hash
Noel Gordon
2017/04/12 12:09:47
Too slow: need a good and fast hash.
dcheng
2017/04/12 20:21:10
Hmm... how about just use one byte of the test inp
| |
| 73 srgb = SelectProfile(hash); | |
| 74 GeneratePixels(hash); | |
| 75 | |
| 76 qcms_profile_precache_output_transform(srgb); | |
| 77 ColorTransform(true); | |
| 78 | |
| 79 qcms_profile_precache_output_transform(test); | |
| 80 ColorTransform(false); | |
| 81 | |
| 82 qcms_profile_release(test); | |
| 83 return 0; | |
| 84 } | |
| OLD | NEW |