libpng/pngmem.c

316 lines
7.7 KiB
C
Raw Normal View History

1998-03-07 12:06:55 +00:00
1995-11-28 17:22:13 +00:00
/* pngmem.c - stub functions for memory allocation
1998-01-01 13:13:13 +00:00
*
* Last changed in libpng 1.6.0 [(PENDING RELEASE)]
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
2000-06-04 19:29:29 +00:00
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
1998-01-01 13:13:13 +00:00
*
* This code is released under the libpng license.
* For conditions of distribution and use, see the disclaimer
* and license in png.h
*
1998-04-21 20:03:57 +00:00
* This file provides a location for all memory allocation. Users who
1998-06-14 19:43:31 +00:00
* need special memory handling are expected to supply replacement
* functions for png_malloc() and png_free(), and to use
* png_create_read_struct_2() and png_create_write_struct_2() to
* identify the replacement functions.
1998-01-01 13:13:13 +00:00
*/
1995-07-20 07:43:20 +00:00
2008-07-10 14:13:13 +00:00
#include "pngpriv.h"
2006-02-21 04:09:05 +00:00
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
1996-06-05 20:50:50 +00:00
/* Allocate memory for a png_struct or a png_info. The malloc and
1997-01-17 07:34:35 +00:00
memset can be replaced by a single call to calloc() if this is thought
2002-06-20 11:54:34 +00:00
to improve performance noticably. */
PNG_FUNCTION(png_voidp /* PRIVATE */,
png_create_struct,(int type),PNG_ALLOCATED)
1996-06-05 20:50:50 +00:00
{
# ifdef PNG_USER_MEM_SUPPORTED
2006-08-19 18:59:24 +00:00
return (png_create_struct_2(type, NULL, NULL));
1998-06-06 20:31:35 +00:00
}
/* Allocate memory for a png_struct or a png_info. The malloc and
memset can be replaced by a single call to calloc() if this is thought
2002-06-20 11:54:34 +00:00
to improve performance noticably. */
PNG_FUNCTION(png_voidp /* PRIVATE */,
png_create_struct_2,(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr),
PNG_ALLOCATED)
1998-06-06 20:31:35 +00:00
{
# endif /* PNG_USER_MEM_SUPPORTED */
1997-05-16 07:46:07 +00:00
png_size_t size;
1996-06-05 20:50:50 +00:00
png_voidp struct_ptr;
if (type == PNG_STRUCT_INFO)
2008-07-10 14:13:13 +00:00
size = png_sizeof(png_info);
1996-06-05 20:50:50 +00:00
else if (type == PNG_STRUCT_PNG)
2008-07-10 14:13:13 +00:00
size = png_sizeof(png_struct);
1996-06-05 20:50:50 +00:00
else
2001-10-27 12:35:13 +00:00
return (NULL);
1996-06-05 20:50:50 +00:00
# ifdef PNG_USER_MEM_SUPPORTED
2006-08-19 18:59:24 +00:00
if (malloc_fn != NULL)
1998-06-06 20:31:35 +00:00
{
2001-11-07 13:10:08 +00:00
png_struct dummy_struct;
png_structp png_ptr = &dummy_struct;
png_ptr->mem_ptr=mem_ptr;
2001-11-24 20:53:31 +00:00
struct_ptr = (*(malloc_fn))(png_ptr, size);
2001-05-18 09:54:50 +00:00
if (struct_ptr != NULL)
1998-06-06 20:31:35 +00:00
png_memset(struct_ptr, 0, size);
1998-06-06 20:31:35 +00:00
return (struct_ptr);
}
# endif /* PNG_USER_MEM_SUPPORTED */
1998-06-06 20:31:35 +00:00
# if defined(__TURBOC__) && !defined(__FLAT__)
2008-07-10 14:13:13 +00:00
struct_ptr = (png_voidp)farmalloc(size);
# else
# if defined(_MSC_VER) && defined(MAXSEG_64K)
2008-07-10 14:13:13 +00:00
struct_ptr = (png_voidp)halloc(size, 1);
# else
2008-07-10 14:13:13 +00:00
struct_ptr = (png_voidp)malloc(size);
# endif
# endif
2004-07-28 13:20:44 +00:00
if (struct_ptr != NULL)
1996-06-05 20:50:50 +00:00
png_memset(struct_ptr, 0, size);
return (struct_ptr);
}
/* Free memory allocated by a png_create_struct() call */
2000-05-06 19:09:57 +00:00
void /* PRIVATE */
1996-06-05 20:50:50 +00:00
png_destroy_struct(png_voidp struct_ptr)
{
# ifdef PNG_USER_MEM_SUPPORTED
2006-08-19 18:59:24 +00:00
png_destroy_struct_2(struct_ptr, NULL, NULL);
1998-06-06 20:31:35 +00:00
}
/* Free memory allocated by a png_create_struct() call */
2000-05-06 19:09:57 +00:00
void /* PRIVATE */
2001-05-18 09:54:50 +00:00
png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
png_voidp mem_ptr)
1998-06-06 20:31:35 +00:00
{
# endif /* PNG_USER_MEM_SUPPORTED */
1997-05-16 07:46:07 +00:00
if (struct_ptr != NULL)
1998-01-31 03:45:12 +00:00
{
# ifdef PNG_USER_MEM_SUPPORTED
2008-07-10 14:13:13 +00:00
if (free_fn != NULL)
1998-06-06 20:31:35 +00:00
{
png_struct dummy_struct;
png_structp png_ptr = &dummy_struct;
2001-05-18 09:54:50 +00:00
png_ptr->mem_ptr=mem_ptr;
1998-06-06 20:31:35 +00:00
(*(free_fn))(png_ptr, struct_ptr);
return;
}
# endif /* PNG_USER_MEM_SUPPORTED */
# if defined(__TURBOC__) && !defined(__FLAT__)
2008-07-10 14:13:13 +00:00
farfree(struct_ptr);
# else
# if defined(_MSC_VER) && defined(MAXSEG_64K)
2008-07-10 14:13:13 +00:00
hfree(struct_ptr);
# else
2008-07-10 14:13:13 +00:00
free(struct_ptr);
# endif
# endif
1998-01-31 03:45:12 +00:00
}
1996-06-05 20:50:50 +00:00
}
1996-01-16 07:51:56 +00:00
/* Allocate memory. For reasonable files, size should never exceed
* 64K. However, zlib may allocate more then 64K if you don't tell
* it not to. See zconf.h and png.h for more information. zlib does
* need to allocate exactly 64K, so whatever you call here must
* have the ability to do that.
*/
1996-01-16 07:51:56 +00:00
PNG_FUNCTION(png_voidp,PNGAPI
png_calloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
2009-02-14 16:32:18 +00:00
{
png_voidp ret;
ret = (png_malloc(png_ptr, size));
2009-02-14 16:32:18 +00:00
if (ret != NULL)
png_memset(ret,0,(png_size_t)size);
2009-02-14 16:32:18 +00:00
return (ret);
}
PNG_FUNCTION(png_voidp,PNGAPI
png_malloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
1996-01-16 07:51:56 +00:00
{
1996-01-26 07:38:47 +00:00
png_voidp ret;
2002-05-25 16:12:10 +00:00
# ifdef PNG_USER_MEM_SUPPORTED
1997-05-16 07:46:07 +00:00
if (png_ptr == NULL || size == 0)
2001-10-27 12:35:13 +00:00
return (NULL);
1996-01-16 07:51:56 +00:00
2006-08-19 18:59:24 +00:00
if (png_ptr->malloc_fn != NULL)
ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
1998-06-06 20:31:35 +00:00
else
ret = (png_malloc_default(png_ptr, size));
2004-07-28 13:20:44 +00:00
if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
2008-07-10 14:13:13 +00:00
png_error(png_ptr, "Out of Memory");
2004-07-28 13:20:44 +00:00
return (ret);
1998-06-06 20:31:35 +00:00
}
2002-05-25 16:12:10 +00:00
PNG_FUNCTION(png_voidp,PNGAPI
png_malloc_default,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
1998-06-06 20:31:35 +00:00
{
png_voidp ret;
# endif /* PNG_USER_MEM_SUPPORTED */
1998-06-06 20:31:35 +00:00
2004-08-04 11:34:52 +00:00
if (png_ptr == NULL || size == 0)
return (NULL);
# ifdef PNG_MAX_MALLOC_64K
2008-07-10 14:13:13 +00:00
if (size > (png_uint_32)65536L)
2002-02-22 05:14:23 +00:00
{
# ifndef PNG_USER_MEM_SUPPORTED
2008-07-10 14:13:13 +00:00
if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
2002-02-22 05:14:23 +00:00
png_error(png_ptr, "Cannot Allocate > 64K");
2002-02-22 05:14:23 +00:00
else
# endif
2002-02-22 05:14:23 +00:00
return NULL;
}
# endif
1995-07-20 07:43:20 +00:00
/* Check for overflow */
# if defined(__TURBOC__) && !defined(__FLAT__)
if (size != (unsigned long)size)
ret = NULL;
else
ret = farmalloc(size);
# else
# if defined(_MSC_VER) && defined(MAXSEG_64K)
if (size != (unsigned long)size)
ret = NULL;
else
ret = halloc(size, 1);
# else
if (size != (size_t)size)
ret = NULL;
else
ret = malloc((size_t)size);
# endif
# endif
1995-07-20 07:43:20 +00:00
# ifndef PNG_USER_MEM_SUPPORTED
2002-02-22 05:14:23 +00:00
if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
1995-12-19 09:22:19 +00:00
png_error(png_ptr, "Out of Memory");
# endif
1995-07-20 07:43:20 +00:00
1998-02-01 02:07:59 +00:00
return (ret);
1995-07-20 07:43:20 +00:00
}
1998-06-06 20:31:35 +00:00
/* Free a pointer allocated by png_malloc(). If ptr is NULL, return
* without taking any action.
*/
2000-05-06 19:09:57 +00:00
void PNGAPI
1998-06-06 20:31:35 +00:00
png_free(png_structp png_ptr, png_voidp ptr)
1995-07-20 07:43:20 +00:00
{
1997-05-16 07:46:07 +00:00
if (png_ptr == NULL || ptr == NULL)
1996-01-26 07:38:47 +00:00
return;
1995-07-20 07:43:20 +00:00
# ifdef PNG_USER_MEM_SUPPORTED
1998-06-06 20:31:35 +00:00
if (png_ptr->free_fn != NULL)
{
(*(png_ptr->free_fn))(png_ptr, ptr);
return;
}
else
png_free_default(png_ptr, ptr);
1998-06-06 20:31:35 +00:00
}
2002-03-26 00:49:08 +00:00
void PNGAPI
1998-06-06 20:31:35 +00:00
png_free_default(png_structp png_ptr, png_voidp ptr)
{
1999-10-23 13:39:18 +00:00
if (png_ptr == NULL || ptr == NULL)
return;
# endif /* PNG_USER_MEM_SUPPORTED */
2008-07-10 14:13:13 +00:00
# if defined(__TURBOC__) && !defined(__FLAT__)
2008-07-10 14:13:13 +00:00
farfree(ptr);
# else
# if defined(_MSC_VER) && defined(MAXSEG_64K)
2008-07-10 14:13:13 +00:00
hfree(ptr);
# else
2008-07-10 14:13:13 +00:00
free(ptr);
# endif
# endif
1995-07-20 07:43:20 +00:00
}
1995-12-19 09:22:19 +00:00
2002-07-02 03:23:46 +00:00
/* This function was added at libpng version 1.2.3. The png_malloc_warn()
2004-07-28 13:20:44 +00:00
* function will set up png_malloc() to issue a png_warning and return NULL
* instead of issuing a png_error, if it fails to allocate the requested
* memory.
2002-05-25 16:12:10 +00:00
*/
PNG_FUNCTION(png_voidp,PNGAPI
png_malloc_warn,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
2002-05-25 16:12:10 +00:00
{
png_voidp ptr;
2006-11-17 02:35:49 +00:00
png_uint_32 save_flags;
if (png_ptr == NULL)
return (NULL);
2002-05-25 16:12:10 +00:00
2008-07-25 13:51:18 +00:00
save_flags = png_ptr->flags;
2002-05-25 16:12:10 +00:00
png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
ptr = (png_voidp)png_malloc((png_structp)png_ptr, size);
png_ptr->flags=save_flags;
return(ptr);
}
2008-07-10 14:13:13 +00:00
1998-06-06 20:31:35 +00:00
#ifdef PNG_USER_MEM_SUPPORTED
/* This function is called when the application wants to use another method
* of allocating and freeing memory.
*/
2000-05-06 19:09:57 +00:00
void PNGAPI
1998-06-06 20:31:35 +00:00
png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr
malloc_fn, png_free_ptr free_fn)
{
2008-07-25 13:51:18 +00:00
if (png_ptr != NULL)
{
png_ptr->mem_ptr = mem_ptr;
png_ptr->malloc_fn = malloc_fn;
png_ptr->free_fn = free_fn;
2006-11-14 16:53:30 +00:00
}
1998-06-06 20:31:35 +00:00
}
/* This function returns a pointer to the mem_ptr associated with the user
* functions. The application should free any memory associated with this
* pointer before png_write_destroy and png_read_destroy are called.
*/
2000-05-06 19:09:57 +00:00
png_voidp PNGAPI
png_get_mem_ptr(png_const_structp png_ptr)
1998-06-06 20:31:35 +00:00
{
if (png_ptr == NULL)
return (NULL);
1998-06-06 20:31:35 +00:00
return ((png_voidp)png_ptr->mem_ptr);
}
#endif /* PNG_USER_MEM_SUPPORTED */
2006-02-21 04:09:05 +00:00
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */