178acf96a67db1fe64a89fa7207195d1a79efc0c3dml/*
278acf96a67db1fe64a89fa7207195d1a79efc0c3dml * Copyright 2015 Google Inc.
378acf96a67db1fe64a89fa7207195d1a79efc0c3dml *
478acf96a67db1fe64a89fa7207195d1a79efc0c3dml * Use of this source code is governed by a BSD-style license that can be
578acf96a67db1fe64a89fa7207195d1a79efc0c3dml * found in the LICENSE file.
678acf96a67db1fe64a89fa7207195d1a79efc0c3dml */
778acf96a67db1fe64a89fa7207195d1a79efc0c3dml
878acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "SkBitmap.h"
978acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "SkCanvas.h"
1078acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "SkForceLinking.h"
1178acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "SkImageDecoder.h"
1278acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "SkImageInfo.h"
1378acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "SkSurface.h"
1478acf96a67db1fe64a89fa7207195d1a79efc0c3dml#include "Test.h"
1578acf96a67db1fe64a89fa7207195d1a79efc0c3dml
1678acf96a67db1fe64a89fa7207195d1a79efc0c3dml// A 20x1 image with 8 bits per pixel and a palette size of 2. Pixel values are 255, 254... Run
1778acf96a67db1fe64a89fa7207195d1a79efc0c3dml// this test with ASAN to make sure we don't try to access before/after any palette-sized buffers.
1878acf96a67db1fe64a89fa7207195d1a79efc0c3dmlunsigned char gPng[] = {
1978acf96a67db1fe64a89fa7207195d1a79efc0c3dml    0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
2078acf96a67db1fe64a89fa7207195d1a79efc0c3dml    0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01,
2178acf96a67db1fe64a89fa7207195d1a79efc0c3dml    0x08, 0x03, 0x00, 0x00, 0x00, 0xe9, 0x4c, 0x7e, 0x17, 0x00, 0x00, 0x00,
2278acf96a67db1fe64a89fa7207195d1a79efc0c3dml    0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
2378acf96a67db1fe64a89fa7207195d1a79efc0c3dml    0x1c, 0x00, 0x0f, 0x01, 0xb9, 0x8f, 0x00, 0x00, 0x00, 0x06, 0x50, 0x4c,
2478acf96a67db1fe64a89fa7207195d1a79efc0c3dml    0x54, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x67, 0xb9, 0xcf,
2578acf96a67db1fe64a89fa7207195d1a79efc0c3dml    0x00, 0x00, 0x00, 0x20, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0xfd,
2678acf96a67db1fe64a89fa7207195d1a79efc0c3dml    0x07, 0x01, 0x00, 0x20, 0x08, 0x00, 0x41, 0xbc, 0x5b, 0xe8, 0xdf, 0x97,
2778acf96a67db1fe64a89fa7207195d1a79efc0c3dml    0x99, 0xe3, 0x92, 0xa0, 0xf2, 0xdf, 0x3d, 0x7b, 0x0d, 0xda, 0x04, 0x1c,
2878acf96a67db1fe64a89fa7207195d1a79efc0c3dml    0x03, 0xad, 0x00, 0x38, 0x5c, 0x2e, 0xad, 0x12, 0x00, 0x00, 0x00, 0x00,
2978acf96a67db1fe64a89fa7207195d1a79efc0c3dml    0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
3078acf96a67db1fe64a89fa7207195d1a79efc0c3dml};
3178acf96a67db1fe64a89fa7207195d1a79efc0c3dml
3278acf96a67db1fe64a89fa7207195d1a79efc0c3dmlDEF_TEST(IndexedPngOverflow, reporter) {
3378acf96a67db1fe64a89fa7207195d1a79efc0c3dml    SkBitmap image;
3478acf96a67db1fe64a89fa7207195d1a79efc0c3dml    SkForceLinking(false);
3578acf96a67db1fe64a89fa7207195d1a79efc0c3dml    bool success = SkImageDecoder::DecodeMemory(
3678acf96a67db1fe64a89fa7207195d1a79efc0c3dml        gPng, sizeof(gPng), &image, SkColorType::kUnknown_SkColorType,
3778acf96a67db1fe64a89fa7207195d1a79efc0c3dml        SkImageDecoder::kDecodePixels_Mode);
3878acf96a67db1fe64a89fa7207195d1a79efc0c3dml    REPORTER_ASSERT(reporter, success);
3978acf96a67db1fe64a89fa7207195d1a79efc0c3dml
4078acf96a67db1fe64a89fa7207195d1a79efc0c3dml    SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(SkImageInfo::MakeN32Premul(20, 1)));
4178acf96a67db1fe64a89fa7207195d1a79efc0c3dml    SkCanvas* canvas = surface->getCanvas();
4278acf96a67db1fe64a89fa7207195d1a79efc0c3dml    SkRect destRect = SkRect::MakeXYWH(0, 0, 20, 1);
4378acf96a67db1fe64a89fa7207195d1a79efc0c3dml    canvas->drawBitmapRect(image, destRect, NULL);
4478acf96a67db1fe64a89fa7207195d1a79efc0c3dml}
45