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