Merge pull request #2843 from mapnik/fix-webp-views

Fix potential crash when encoding webp via image_view
This commit is contained in:
Artem Pavlenko 2015-05-22 08:59:03 +01:00
commit 8d911d8c77
2 changed files with 34 additions and 6 deletions

View file

@ -78,9 +78,11 @@ inline int import_image(T2 const& im_in,
bool alpha) bool alpha)
{ {
image<typename T2::pixel> const& data = im_in.data(); image<typename T2::pixel> const& data = im_in.data();
int stride = sizeof(typename T2::pixel_type) * im_in.width(); std::size_t width = im_in.width();
if (data.width() == im_in.width() && std::size_t height = im_in.height();
data.height() == im_in.height()) int stride = sizeof(typename T2::pixel_type) * width;
if (data.width() == width &&
data.height() == height)
{ {
if (alpha) if (alpha)
{ {
@ -98,12 +100,12 @@ inline int import_image(T2 const& im_in,
else else
{ {
// need to copy: https://github.com/mapnik/mapnik/issues/2024 // need to copy: https://github.com/mapnik/mapnik/issues/2024
image_rgba8 im(im_in.width(),im_in.height()); image_rgba8 im(width,height);
for (unsigned y = 0; y < im_in.height(); ++y) for (unsigned y = 0; y < height; ++y)
{ {
typename T2::pixel_type const * row_from = im_in.get_row(y); typename T2::pixel_type const * row_from = im_in.get_row(y);
image_rgba8::pixel_type * row_to = im.get_row(y); image_rgba8::pixel_type * row_to = im.get_row(y);
std::copy(row_from, row_from + stride, row_to); std::copy(row_from, row_from + width, row_to);
} }
if (alpha) if (alpha)
{ {

View file

@ -0,0 +1,26 @@
#if defined(HAVE_WEBP)
#include "catch.hpp"
#include <mapnik/image_util.hpp>
#include <mapnik/image_view_any.hpp>
#include <mapnik/webp_io.hpp>
TEST_CASE("webp io") {
SECTION("does not crash accessing view") {
std::stringstream s;
mapnik::image_rgba8 im(1024,1024);
mapnik::image_view_rgba8 view(512,512,1024,1024,im);
WebPConfig config;
if (!WebPConfigInit(&config))
{
throw std::runtime_error("version mismatch");
}
save_as_webp(s,view,config,true);
}
}
#endif