1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngmem.c - stub functions for memory allocation
3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
4b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * Last changed in libpng 1.6.8 [December 19, 2013]
5b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * Copyright (c) 1998-2013 Glenn Randers-Pehrson
6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
9a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * This code is released under the libpng license.
10a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * For conditions of distribution and use, see the disclaimer
11a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * and license in png.h
12a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott *
13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * This file provides a location for all memory allocation.  Users who
14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * need special memory handling are expected to supply replacement
15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * functions for png_malloc() and png_free(), and to use
16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * png_create_read_struct_2() and png_create_write_struct_2() to
17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * identify the replacement functions.
18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
20b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#include "pngpriv.h"
21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
22b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
23b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Free a png_struct */
24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
25b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_destroy_png_struct(png_structrp png_ptr)
26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
27b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr != NULL)
28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
29b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* png_free might call png_error and may certainly call
30b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * png_get_mem_ptr, so fake a temporary png_struct to support this.
31b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       */
32b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_struct dummy_struct = *png_ptr;
33b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      memset(png_ptr, 0, (sizeof *png_ptr));
34b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_free(&dummy_struct, png_ptr);
35b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
36b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     ifdef PNG_SETJMP_SUPPORTED
37b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         /* We may have a jmp_buf left to deallocate. */
38b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_free_jmpbuf(&dummy_struct);
39b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     endif
40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Allocate memory.  For reasonable files, size should never exceed
44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 64K.  However, zlib may allocate more then 64K if you don't tell
45b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * it not to.  See zconf.h and png.h for more information.  zlib does
46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * need to allocate exactly 64K, so whatever you call here must
47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * have the ability to do that.
48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
49b50c217251b086440efcdb273c22f86a06c80cbaChris CraikPNG_FUNCTION(png_voidp,PNGAPI
50b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_calloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
515f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott{
525f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_voidp ret;
535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
54b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   ret = png_malloc(png_ptr, size);
55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
56b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (ret != NULL)
57b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      memset(ret, 0, size);
58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
59b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return ret;
60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
62b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* png_malloc_base, an internal function added at libpng 1.6.0, does the work of
63b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * allocating memory, taking into account limits and PNG_USER_MEM_SUPPORTED.
64b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * Checking and error handling must happen outside this routine; it returns NULL
65b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * if the allocation cannot be done (for any reason.)
66b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */
67b50c217251b086440efcdb273c22f86a06c80cbaChris CraikPNG_FUNCTION(png_voidp /* PRIVATE */,
68b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size),
69b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   PNG_ALLOCATED)
70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
71b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Moved to png_malloc_base from png_malloc_default in 1.6.0; the DOS
72b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * allocators have also been removed in 1.6.0, so any 16-bit system now has
73b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * to implement a user memory handler.  This checks to be sure it isn't
74b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * called with big numbers.
75b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
76b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifndef PNG_USER_MEM_SUPPORTED
77b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   PNG_UNUSED(png_ptr)
78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
79b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari
80b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (size > 0 && size <= PNG_SIZE_MAX
81b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     ifdef PNG_MAX_MALLOC_64K
82b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         && size <= 65536U
83b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     endif
84b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      )
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
86b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_USER_MEM_SUPPORTED
87b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (png_ptr != NULL && png_ptr->malloc_fn != NULL)
88b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return png_ptr->malloc_fn(png_constcast(png_structrp,png_ptr), size);
89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
92b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return malloc((size_t)size); /* checked for truncation above */
93b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
95b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else
96b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return NULL;
97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
99b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\
100b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED)
101b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* This is really here only to work round a spurious warning in GCC 4.6 and 4.7
102b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * that arises because of the checks in png_realloc_array that are repeated in
103b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * png_malloc_array.
104a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */
105b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic png_voidp
106b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_malloc_array_checked(png_const_structrp png_ptr, int nelements,
107b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   size_t element_size)
108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
109b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_alloc_size_t req = nelements; /* known to be > 0 */
110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
111b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (req <= PNG_SIZE_MAX/element_size)
112b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return png_malloc_base(png_ptr, req * element_size);
113b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
114b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* The failure case when the request is too large */
115b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return NULL;
116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
118b50c217251b086440efcdb273c22f86a06c80cbaChris CraikPNG_FUNCTION(png_voidp /* PRIVATE */,
119b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_malloc_array,(png_const_structrp png_ptr, int nelements,
120b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   size_t element_size),PNG_ALLOCATED)
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
122b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (nelements <= 0 || element_size == 0)
123b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_error(png_ptr, "internal error: array alloc");
124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
125b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return png_malloc_array_checked(png_ptr, nelements, element_size);
126b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
128b50c217251b086440efcdb273c22f86a06c80cbaChris CraikPNG_FUNCTION(png_voidp /* PRIVATE */,
129b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,
130b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   int old_elements, int add_elements, size_t element_size),PNG_ALLOCATED)
131b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
132b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* These are internal errors: */
133b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (add_elements <= 0 || element_size == 0 || old_elements < 0 ||
134b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      (old_array == NULL && old_elements > 0))
135b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_error(png_ptr, "internal error: array realloc");
136b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
137b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Check for overflow on the elements count (so the caller does not have to
138b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * check.)
139b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
140b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (add_elements <= INT_MAX - old_elements)
141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
142b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_voidp new_array = png_malloc_array_checked(png_ptr,
143b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         old_elements+add_elements, element_size);
144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
145b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (new_array != NULL)
146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
147b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         /* Because png_malloc_array worked the size calculations below cannot
148b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * overflow.
149b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          */
150b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (old_elements > 0)
151b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            memcpy(new_array, old_array, element_size*(unsigned)old_elements);
152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
153b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         memset((char*)new_array + element_size*(unsigned)old_elements, 0,
154b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            element_size*(unsigned)add_elements);
155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
156b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return new_array;
157b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
158b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
160b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return NULL; /* error */
161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
162b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif /* TEXT || sPLT || STORE_UNKNOWN_CHUNKS */
163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
164b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Various functions that have different error handling are derived from this.
165b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * png_malloc always exists, but if PNG_USER_MEM_SUPPORTED is defined a separate
166b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * function png_malloc_default is also provided.
167b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */
168b50c217251b086440efcdb273c22f86a06c80cbaChris CraikPNG_FUNCTION(png_voidp,PNGAPI
169b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_malloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
171b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_voidp ret;
172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
173b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr == NULL)
174b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return NULL;
175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
176b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   ret = png_malloc_base(png_ptr, size);
177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
178b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (ret == NULL)
179b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       png_error(png_ptr, "Out of memory"); /* 'm' means png_malloc */
180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
181b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return ret;
182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
185b50c217251b086440efcdb273c22f86a06c80cbaChris CraikPNG_FUNCTION(png_voidp,PNGAPI
186b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size),
187b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   PNG_ALLOCATED PNG_DEPRECATED)
1885f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott{
1895f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_voidp ret;
1905f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
191b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr == NULL)
192b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return NULL;
193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
194b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Passing 'NULL' here bypasses the application provided memory handler. */
195b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   ret = png_malloc_base(NULL/*use malloc*/, size);
196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
197b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (ret == NULL)
198b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_error(png_ptr, "Out of Memory"); /* 'M' means png_malloc_default */
199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
200b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return ret;
201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
204b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* This function was added at libpng version 1.2.3.  The png_malloc_warn()
205b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * function will issue a png_warning and return NULL instead of issuing a
206b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * png_error, if it fails to allocate the requested memory.
207b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */
208b50c217251b086440efcdb273c22f86a06c80cbaChris CraikPNG_FUNCTION(png_voidp,PNGAPI
209b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_malloc_warn,(png_const_structrp png_ptr, png_alloc_size_t size),
210b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   PNG_ALLOCATED)
211b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
212b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr != NULL)
213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
214b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_voidp ret = png_malloc_base(png_ptr, size);
215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
216b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (ret != NULL)
217b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return ret;
218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
219b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_warning(png_ptr, "Out of memory");
220b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
222b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return NULL;
223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Free a pointer allocated by png_malloc().  If ptr is NULL, return
226a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * without taking any action.
227a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */
228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
229b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_free(png_const_structrp png_ptr, png_voidp ptr)
230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr == NULL || ptr == NULL)
232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return;
233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->free_fn != NULL)
236b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_ptr->free_fn(png_constcast(png_structrp,png_ptr), ptr);
237b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
238a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   else
239a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      png_free_default(png_ptr, ptr);
240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
241b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
242b50c217251b086440efcdb273c22f86a06c80cbaChris CraikPNG_FUNCTION(void,PNGAPI
243b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_free_default,(png_const_structrp png_ptr, png_voidp ptr),PNG_DEPRECATED)
244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr == NULL || ptr == NULL)
246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return;
247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   free(ptr);
250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function is called when the application wants to use another method
254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * of allocating and freeing memory.
255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
257b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_mem_fn(png_structrp png_ptr, png_voidp mem_ptr, png_malloc_ptr
258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  malloc_fn, png_free_ptr free_fn)
259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
2604215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_ptr != NULL)
2614215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   {
2624215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_ptr->mem_ptr = mem_ptr;
2634215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_ptr->malloc_fn = malloc_fn;
2644215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_ptr->free_fn = free_fn;
265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function returns a pointer to the mem_ptr associated with the user
269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * functions.  The application should free any memory associated with this
270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * pointer before png_write_destroy and png_read_destroy are called.
271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI
273b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_get_mem_ptr(png_const_structrp png_ptr)
274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
275a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
276b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return NULL;
277b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
278b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return png_ptr->mem_ptr;
279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
282