14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* pngmem.c - stub functions for memory allocation 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Last changed in libpng 1.6.15 [November 20, 2014] 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * This code is released under the libpng license. 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * For conditions of distribution and use, see the disclaimer 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * and license in png.h 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * This file provides a location for all memory allocation. Users who 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * need special memory handling are expected to supply replacement 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * functions for png_malloc() and png_free(), and to use 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * png_create_read_struct_2() and png_create_write_struct_2() to 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * identify the replacement functions. 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "pngpriv.h" 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid* FXMEM_DefaultAlloc(size_t byte_size); 23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid FXMEM_DefaultFree(void* pointer); 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* Free a png_struct */ 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid /* PRIVATE */ 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_destroy_png_struct(png_structrp png_ptr) 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (png_ptr != NULL) 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann /* png_free might call png_error and may certainly call 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * png_get_mem_ptr, so fake a temporary png_struct to support this. 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_struct dummy_struct = *png_ptr; 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann memset(png_ptr, 0, (sizeof *png_ptr)); 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_free(&dummy_struct, png_ptr); 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# ifdef PNG_SETJMP_SUPPORTED 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann /* We may have a jmp_buf left to deallocate. */ 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_free_jmpbuf(&dummy_struct); 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# endif 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* Allocate memory. For reasonable files, size should never exceed 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * 64K. However, zlib may allocate more than 64K if you don't tell 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * it not to. See zconf.h and png.h for more information. zlib does 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * need to allocate exactly 64K, so whatever you call here must 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * have the ability to do that. 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannPNG_FUNCTION(png_voidp,PNGAPI 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_calloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_voidp ret; 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret = png_malloc(png_ptr, size); 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ret != NULL) 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann memset(ret, 0, size); 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ret; 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* png_malloc_base, an internal function added at libpng 1.6.0, does the work of 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * allocating memory, taking into account limits and PNG_USER_MEM_SUPPORTED. 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Checking and error handling must happen outside this routine; it returns NULL 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * if the allocation cannot be done (for any reason.) 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannPNG_FUNCTION(png_voidp /* PRIVATE */, 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size), 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann PNG_ALLOCATED) 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann /* Moved to png_malloc_base from png_malloc_default in 1.6.0; the DOS 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * allocators have also been removed in 1.6.0, so any 16-bit system now has 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * to implement a user memory handler. This checks to be sure it isn't 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * called with big numbers. 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef PNG_USER_MEM_SUPPORTED 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann PNG_UNUSED(png_ptr) 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann /* Some compilers complain that this is always true. However, it 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * can be false when integer overflow happens. 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (size > 0 && size <= PNG_SIZE_MAX 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# ifdef PNG_MAX_MALLOC_64K 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann && size <= 65536U 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# endif 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_USER_MEM_SUPPORTED 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (png_ptr != NULL && png_ptr->malloc_fn != NULL) 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return png_ptr->malloc_fn(png_constcast(png_structrp,png_ptr), size); 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return FXMEM_DefaultAlloc(size); 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return NULL; 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\ 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* This is really here only to work round a spurious warning in GCC 4.6 and 4.7 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * that arises because of the checks in png_realloc_array that are repeated in 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * png_malloc_array. 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic png_voidp 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_malloc_array_checked(png_const_structrp png_ptr, int nelements, 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t element_size) 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_alloc_size_t req = nelements; /* known to be > 0 */ 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (req <= PNG_SIZE_MAX/element_size) 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return png_malloc_base(png_ptr, req * element_size); 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann /* The failure case when the request is too large */ 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return NULL; 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannPNG_FUNCTION(png_voidp /* PRIVATE */, 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_malloc_array,(png_const_structrp png_ptr, int nelements, 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t element_size),PNG_ALLOCATED) 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nelements <= 0 || element_size == 0) 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_error(png_ptr, "internal error: array alloc"); 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return png_malloc_array_checked(png_ptr, nelements, element_size); 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannPNG_FUNCTION(png_voidp /* PRIVATE */, 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array, 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int old_elements, int add_elements, size_t element_size),PNG_ALLOCATED) 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann /* These are internal errors: */ 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (add_elements <= 0 || element_size == 0 || old_elements < 0 || 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (old_array == NULL && old_elements > 0)) 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_error(png_ptr, "internal error: array realloc"); 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann /* Check for overflow on the elements count (so the caller does not have to 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * check.) 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (add_elements <= INT_MAX - old_elements) 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_voidp new_array = png_malloc_array_checked(png_ptr, 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann old_elements+add_elements, element_size); 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (new_array != NULL) 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann /* Because png_malloc_array worked the size calculations below cannot 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * overflow. 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (old_elements > 0) 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann memcpy(new_array, old_array, element_size*(unsigned)old_elements); 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann memset((char*)new_array + element_size*(unsigned)old_elements, 0, 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann element_size*(unsigned)add_elements); 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return new_array; 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return NULL; /* error */ 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* TEXT || sPLT || STORE_UNKNOWN_CHUNKS */ 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* Various functions that have different error handling are derived from this. 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * png_malloc always exists, but if PNG_USER_MEM_SUPPORTED is defined a separate 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * function png_malloc_default is also provided. 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannPNG_FUNCTION(png_voidp,PNGAPI 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_malloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_voidp ret; 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (png_ptr == NULL) 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return NULL; 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret = png_malloc_base(png_ptr, size); 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ret == NULL) 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_error(png_ptr, "Out of memory"); /* 'm' means png_malloc */ 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ret; 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_USER_MEM_SUPPORTED 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannPNG_FUNCTION(png_voidp,PNGAPI 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size), 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann PNG_ALLOCATED PNG_DEPRECATED) 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_voidp ret; 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (png_ptr == NULL) 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return NULL; 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann /* Passing 'NULL' here bypasses the application provided memory handler. */ 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret = png_malloc_base(NULL/*use malloc*/, size); 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ret == NULL) 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_error(png_ptr, "Out of Memory"); /* 'M' means png_malloc_default */ 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ret; 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* USER_MEM */ 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* This function was added at libpng version 1.2.3. The png_malloc_warn() 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * function will issue a png_warning and return NULL instead of issuing a 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * png_error, if it fails to allocate the requested memory. 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannPNG_FUNCTION(png_voidp,PNGAPI 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_malloc_warn,(png_const_structrp png_ptr, png_alloc_size_t size), 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann PNG_ALLOCATED) 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (png_ptr != NULL) 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_voidp ret = png_malloc_base(png_ptr, size); 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ret != NULL) 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ret; 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_warning(png_ptr, "Out of memory"); 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return NULL; 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* Free a pointer allocated by png_malloc(). If ptr is NULL, return 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * without taking any action. 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_free(png_const_structrp png_ptr, png_voidp ptr) 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (png_ptr == NULL || ptr == NULL) 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_USER_MEM_SUPPORTED 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (png_ptr->free_fn != NULL) 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_ptr->free_fn(png_constcast(png_structrp,png_ptr), ptr); 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_free_default(png_ptr, ptr); 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannPNG_FUNCTION(void,PNGAPI 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_free_default,(png_const_structrp png_ptr, png_voidp ptr),PNG_DEPRECATED) 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (png_ptr == NULL || ptr == NULL) 2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* USER_MEM */ 2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FXMEM_DefaultFree(ptr); 2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_USER_MEM_SUPPORTED 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* This function is called when the application wants to use another method 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * of allocating and freeing memory. 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI 2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_mem_fn(png_structrp png_ptr, png_voidp mem_ptr, png_malloc_ptr 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann malloc_fn, png_free_ptr free_fn) 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (png_ptr != NULL) 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_ptr->mem_ptr = mem_ptr; 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_ptr->malloc_fn = malloc_fn; 2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann png_ptr->free_fn = free_fn; 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* This function returns a pointer to the mem_ptr associated with the user 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * functions. The application should free any memory associated with this 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * pointer before png_write_destroy and png_read_destroy are called. 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_voidp PNGAPI 2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_get_mem_ptr(png_const_structrp png_ptr) 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{ 2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (png_ptr == NULL) 2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return NULL; 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return png_ptr->mem_ptr; 2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* USER_MEM */ 2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* READ || WRITE */ 288