| Index: skia/tools/filter_fuzz_stub/filter_fuzz_stub.cc | 
| diff --git a/skia/tools/filter_fuzz_stub/filter_fuzz_stub.cc b/skia/tools/filter_fuzz_stub/filter_fuzz_stub.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..6da11369f3ca5ca0bc3c0dc5503233e910c56164 | 
| --- /dev/null | 
| +++ b/skia/tools/filter_fuzz_stub/filter_fuzz_stub.cc | 
| @@ -0,0 +1,93 @@ | 
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "base/file_util.h" | 
| +#include "base/logging.h" | 
| +#include "third_party/skia/include/core/SkBitmapDevice.h" | 
| +#include "third_party/skia/include/core/SkCanvas.h" | 
| +#include "third_party/skia/include/core/SkFlattenableSerialization.h" | 
| +#include "third_party/skia/include/core/SkImageFilter.h" | 
| + | 
| +namespace { | 
| + | 
| +static const int BitmapSize = 24; | 
| + | 
| +bool ReadTestCase(const char* filename, std::string* ipc_filter_message) { | 
| +  base::FilePath filepath = base::FilePath::FromUTF8Unsafe(filename); | 
| + | 
| +  if (!base::ReadFileToString(filepath, ipc_filter_message)) { | 
| +    LOG(ERROR) << filename << ": couldn't read file."; | 
| +    return false; | 
| +  } | 
| + | 
| +  return true; | 
| +} | 
| + | 
| +void RunTestCase(std::string& ipc_filter_message, SkBitmap& bitmap, | 
| +                 SkCanvas* canvas) { | 
| +  // This call shouldn't crash or cause ASAN to flag any memory issues | 
| +  // If nothing bad happens within this call, everything is fine | 
| +  SkFlattenable* flattenable = SkValidatingDeserializeFlattenable( | 
| +        ipc_filter_message.c_str(), ipc_filter_message.size(), | 
| +        SkImageFilter::GetFlattenableType()); | 
| + | 
| +  // Adding some info, but the test passed if we got here without any trouble | 
| +  if (flattenable != NULL) { | 
| +    LOG(INFO) << "Valid stream detected."; | 
| +    // Let's see if using the filters can cause any trouble... | 
| +    SkPaint paint; | 
| +    paint.setImageFilter(static_cast<SkImageFilter*>(flattenable))->unref(); | 
| +    canvas->save(); | 
| +    canvas->clipRect(SkRect::MakeXYWH( | 
| +        0, 0, SkIntToScalar(BitmapSize), SkIntToScalar(BitmapSize))); | 
| + | 
| +    // This call shouldn't crash or cause ASAN to flag any memory issues | 
| +    // If nothing bad happens within this call, everything is fine | 
| +    canvas->drawBitmap(bitmap, 0, 0, &paint); | 
| + | 
| +    LOG(INFO) << "Filter DAG rendered successfully"; | 
| +    canvas->restore(); | 
| +  } else { | 
| +    LOG(INFO) << "Invalid stream detected."; | 
| +  } | 
| +} | 
| + | 
| +bool ReadAndRunTestCase(const char* filename, SkBitmap& bitmap, | 
| +                        SkCanvas* canvas) { | 
| +  std::string ipc_filter_message; | 
| + | 
| +  LOG(INFO) << "Test case: " << filename; | 
| + | 
| +  // ReadTestCase will print a useful error message if it fails. | 
| +  if (!ReadTestCase(filename, &ipc_filter_message)) | 
| +    return false; | 
| + | 
| +  RunTestCase(ipc_filter_message, bitmap, canvas); | 
| + | 
| +  return true; | 
| +} | 
| + | 
| +} | 
| + | 
| +int main(int argc, char** argv) { | 
| +  int ret = 0; | 
| + | 
| +  SkBitmap bitmap; | 
| +  bitmap.setConfig(SkBitmap::kARGB_8888_Config, BitmapSize, BitmapSize); | 
| +  bitmap.allocPixels(); | 
| +  SkBitmapDevice device(bitmap); | 
| +  SkCanvas canvas(&device); | 
| +  canvas.clear(0x00000000); | 
| + | 
| +  for (int i = 1; i < argc; i++) | 
| +    if (!ReadAndRunTestCase(argv[i], bitmap, &canvas)) | 
| +      ret = 2; | 
| + | 
| +  // Cluster-Fuzz likes "#EOF" as the last line of output to help distinguish | 
| +  // successful runs from crashes. | 
| +  printf("#EOF\n"); | 
| + | 
| +  return ret; | 
| +} | 
| + | 
|  |