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