Fix the PNG handler crashing in low memory situations.

Obtaining a netsurf bitmap buffer may fail on some frontends (RISC OS
especially) as the bitmap allocation is not performed until the
buffer is requested. The PNG image handler failed to check for this
when populating the row pointer structure.
This commit is contained in:
Vincent Sanders 2015-05-12 08:32:32 +01:00
parent 37aad9c749
commit d038af3178

View File

@ -404,6 +404,13 @@ static png_bytep *calc_row_pointers(struct bitmap *bitmap)
png_bytep *row_ptrs; png_bytep *row_ptrs;
int hloop; int hloop;
/* The buffer allocation may occour when the buffer is aquired
* and therefore may fail.
*/
if (buffer == NULL) {
return NULL;
}
row_ptrs = malloc(sizeof(png_bytep) * height); row_ptrs = malloc(sizeof(png_bytep) * height);
if (row_ptrs != NULL) { if (row_ptrs != NULL) {
@ -485,6 +492,9 @@ png_cache_convert(struct content *c)
if (row_pointers != NULL) { if (row_pointers != NULL) {
png_read_image(png_ptr, (png_bytep *) row_pointers); png_read_image(png_ptr, (png_bytep *) row_pointers);
} else {
guit->bitmap->destroy((struct bitmap *)bitmap);
bitmap = NULL;
} }
png_cache_convert_error: png_cache_convert_error:
@ -492,7 +502,9 @@ png_cache_convert_error:
/* cleanup png read */ /* cleanup png read */
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info_ptr); png_destroy_read_struct(&png_ptr, &info_ptr, &end_info_ptr);
if (row_pointers != NULL) {
free((png_bytep *) row_pointers); free((png_bytep *) row_pointers);
}
if (bitmap != NULL) { if (bitmap != NULL) {
guit->bitmap->modified((struct bitmap *)bitmap); guit->bitmap->modified((struct bitmap *)bitmap);