TestMoz2D.cpp (2663B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include "FuzzingInterface.h" 7 #include "FuzzingBufferReader.h" 8 #include "mozilla/webrender/webrender_ffi.h" 9 10 static int testInitMoz2D(int* argc, char*** argv) { return 0; } 11 12 static int testMoz2DRenderCallback(const uint8_t* buf, size_t size) { 13 FuzzingBufferReader fuzzBuf(buf, size); 14 15 uint8_t imageFormat = MOZ_TRY(fuzzBuf.Read<uint8_t>()); 16 17 mozilla::wr::LayoutIntRect renderRect; 18 renderRect.min.x = MOZ_TRY(fuzzBuf.Read<int32_t>()); 19 renderRect.min.y = MOZ_TRY(fuzzBuf.Read<int32_t>()); 20 renderRect.max.x = MOZ_TRY(fuzzBuf.Read<int32_t>()); 21 renderRect.max.y = MOZ_TRY(fuzzBuf.Read<int32_t>()); 22 23 mozilla::wr::DeviceIntRect visibleRect; 24 visibleRect.min.x = MOZ_TRY(fuzzBuf.Read<int32_t>()); 25 visibleRect.min.y = MOZ_TRY(fuzzBuf.Read<int32_t>()); 26 visibleRect.max.x = MOZ_TRY(fuzzBuf.Read<int32_t>()); 27 visibleRect.max.y = MOZ_TRY(fuzzBuf.Read<int32_t>()); 28 29 uint16_t tileSize = MOZ_TRY(fuzzBuf.Read<uint16_t>()); 30 31 mozilla::wr::TileOffset tileOffset; 32 if (tileSize) { 33 tileOffset.x = MOZ_TRY(fuzzBuf.Read<int32_t>()); 34 tileOffset.y = MOZ_TRY(fuzzBuf.Read<int32_t>()); 35 } 36 37 uint8_t haveDirtyRect = MOZ_TRY(fuzzBuf.Read<uint8_t>()); 38 39 mozilla::wr::LayoutIntRect dirtyRect; 40 if (!!haveDirtyRect) { 41 dirtyRect.min.x = MOZ_TRY(fuzzBuf.Read<int32_t>()); 42 dirtyRect.min.y = MOZ_TRY(fuzzBuf.Read<int32_t>()); 43 dirtyRect.max.x = MOZ_TRY(fuzzBuf.Read<int32_t>()); 44 dirtyRect.max.y = MOZ_TRY(fuzzBuf.Read<int32_t>()); 45 } 46 47 uint32_t outLength = MOZ_TRY(fuzzBuf.Read<uint32_t>()); 48 if (outLength >= 10 * 1024 * 1024) { 49 return 0; 50 } 51 52 uint32_t blobLength = fuzzBuf.Length(); 53 // limit buffer lengths to prevent oom 54 if (blobLength >= 10 * 1024 * 1024) { 55 return 0; 56 } 57 58 UniquePtr<uint8_t[]> blobBuffer(new uint8_t[blobLength]); 59 memcpy(blobBuffer.get(), fuzzBuf.Pos(), blobLength); 60 61 UniquePtr<uint8_t[]> outBuffer(new uint8_t[outLength]); 62 63 wr_moz2d_render_cb(mozilla::wr::ByteSlice{blobBuffer.get(), blobLength}, 64 static_cast<mozilla::wr::ImageFormat>(imageFormat), 65 &renderRect, &visibleRect, tileSize, 66 tileSize ? &tileOffset : nullptr, 67 !!haveDirtyRect ? &dirtyRect : nullptr, 68 mozilla::wr::MutByteSlice{outBuffer.get(), outLength}); 69 70 return 0; 71 } 72 73 MOZ_FUZZING_INTERFACE_RAW(testInitMoz2D, testMoz2DRenderCallback, Moz2D);