123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- #include "pngpriv.h"
- #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
- void
- png_destroy_png_struct(png_structrp png_ptr)
- {
- if (png_ptr != NULL)
- {
-
- png_struct dummy_struct = *png_ptr;
- memset(png_ptr, 0, (sizeof *png_ptr));
- png_free(&dummy_struct, png_ptr);
- # ifdef PNG_SETJMP_SUPPORTED
-
- png_free_jmpbuf(&dummy_struct);
- # endif
- }
- }
- PNG_FUNCTION(png_voidp,PNGAPI
- png_calloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
- {
- png_voidp ret;
- ret = png_malloc(png_ptr, size);
- if (ret != NULL)
- memset(ret, 0, size);
- return ret;
- }
- PNG_FUNCTION(png_voidp ,
- png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size),
- PNG_ALLOCATED)
- {
-
- #ifndef PNG_USER_MEM_SUPPORTED
- PNG_UNUSED(png_ptr)
- #endif
-
- if (size > 0 && size <= PNG_SIZE_MAX
- # ifdef PNG_MAX_MALLOC_64K
- && size <= 65536U
- # endif
- )
- {
- #ifdef PNG_USER_MEM_SUPPORTED
- if (png_ptr != NULL && png_ptr->malloc_fn != NULL)
- return png_ptr->malloc_fn(png_constcast(png_structrp,png_ptr), size);
- else
- #endif
- return malloc((size_t)size);
- }
- else
- return NULL;
- }
- #if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\
- defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED)
- static png_voidp
- png_malloc_array_checked(png_const_structrp png_ptr, int nelements,
- size_t element_size)
- {
- png_alloc_size_t req = (png_alloc_size_t)nelements;
- if (req <= PNG_SIZE_MAX/element_size)
- return png_malloc_base(png_ptr, req * element_size);
-
- return NULL;
- }
- PNG_FUNCTION(png_voidp ,
- png_malloc_array,(png_const_structrp png_ptr, int nelements,
- size_t element_size),PNG_ALLOCATED)
- {
- if (nelements <= 0 || element_size == 0)
- png_error(png_ptr, "internal error: array alloc");
- return png_malloc_array_checked(png_ptr, nelements, element_size);
- }
- PNG_FUNCTION(png_voidp ,
- png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,
- int old_elements, int add_elements, size_t element_size),PNG_ALLOCATED)
- {
-
- if (add_elements <= 0 || element_size == 0 || old_elements < 0 ||
- (old_array == NULL && old_elements > 0))
- png_error(png_ptr, "internal error: array realloc");
-
- if (add_elements <= INT_MAX - old_elements)
- {
- png_voidp new_array = png_malloc_array_checked(png_ptr,
- old_elements+add_elements, element_size);
- if (new_array != NULL)
- {
-
- if (old_elements > 0)
- memcpy(new_array, old_array, element_size*(unsigned)old_elements);
- memset((char*)new_array + element_size*(unsigned)old_elements, 0,
- element_size*(unsigned)add_elements);
- return new_array;
- }
- }
- return NULL;
- }
- #endif
- PNG_FUNCTION(png_voidp,PNGAPI
- png_malloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
- {
- png_voidp ret;
- if (png_ptr == NULL)
- return NULL;
- ret = png_malloc_base(png_ptr, size);
- if (ret == NULL)
- png_error(png_ptr, "Out of memory");
- return ret;
- }
- #ifdef PNG_USER_MEM_SUPPORTED
- PNG_FUNCTION(png_voidp,PNGAPI
- png_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size),
- PNG_ALLOCATED PNG_DEPRECATED)
- {
- png_voidp ret;
- if (png_ptr == NULL)
- return NULL;
-
- ret = png_malloc_base(NULL, size);
- if (ret == NULL)
- png_error(png_ptr, "Out of Memory");
- return ret;
- }
- #endif
- PNG_FUNCTION(png_voidp,PNGAPI
- png_malloc_warn,(png_const_structrp png_ptr, png_alloc_size_t size),
- PNG_ALLOCATED)
- {
- if (png_ptr != NULL)
- {
- png_voidp ret = png_malloc_base(png_ptr, size);
- if (ret != NULL)
- return ret;
- png_warning(png_ptr, "Out of memory");
- }
- return NULL;
- }
- void PNGAPI
- png_free(png_const_structrp png_ptr, png_voidp ptr)
- {
- if (png_ptr == NULL || ptr == NULL)
- return;
- #ifdef PNG_USER_MEM_SUPPORTED
- if (png_ptr->free_fn != NULL)
- png_ptr->free_fn(png_constcast(png_structrp,png_ptr), ptr);
- else
- png_free_default(png_ptr, ptr);
- }
- PNG_FUNCTION(void,PNGAPI
- png_free_default,(png_const_structrp png_ptr, png_voidp ptr),PNG_DEPRECATED)
- {
- if (png_ptr == NULL || ptr == NULL)
- return;
- #endif
- free(ptr);
- }
- #ifdef PNG_USER_MEM_SUPPORTED
- void PNGAPI
- png_set_mem_fn(png_structrp png_ptr, png_voidp mem_ptr, png_malloc_ptr
- malloc_fn, png_free_ptr free_fn)
- {
- if (png_ptr != NULL)
- {
- png_ptr->mem_ptr = mem_ptr;
- png_ptr->malloc_fn = malloc_fn;
- png_ptr->free_fn = free_fn;
- }
- }
- png_voidp PNGAPI
- png_get_mem_ptr(png_const_structrp png_ptr)
- {
- if (png_ptr == NULL)
- return NULL;
- return png_ptr->mem_ptr;
- }
- #endif
- #endif
|