|
@@ -1,7 +1,7 @@
|
|
|
|
|
|
/* pngset.c - storage of image information into info struct
|
|
/* pngset.c - storage of image information into info struct
|
|
*
|
|
*
|
|
- * Copyright (c) 2018-2022 Cosmin Truta
|
|
|
|
|
|
+ * Copyright (c) 2018-2023 Cosmin Truta
|
|
* Copyright (c) 1998-2018 Glenn Randers-Pehrson
|
|
* Copyright (c) 1998-2018 Glenn Randers-Pehrson
|
|
* Copyright (c) 1996-1997 Andreas Dilger
|
|
* Copyright (c) 1996-1997 Andreas Dilger
|
|
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
|
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
|
@@ -137,46 +137,40 @@ png_set_cHRM_XYZ(png_const_structrp png_ptr, png_inforp info_ptr, double red_X,
|
|
#ifdef PNG_eXIf_SUPPORTED
|
|
#ifdef PNG_eXIf_SUPPORTED
|
|
void PNGAPI
|
|
void PNGAPI
|
|
png_set_eXIf(png_const_structrp png_ptr, png_inforp info_ptr,
|
|
png_set_eXIf(png_const_structrp png_ptr, png_inforp info_ptr,
|
|
- png_bytep eXIf_buf)
|
|
|
|
|
|
+ png_bytep exif)
|
|
{
|
|
{
|
|
png_warning(png_ptr, "png_set_eXIf does not work; use png_set_eXIf_1");
|
|
png_warning(png_ptr, "png_set_eXIf does not work; use png_set_eXIf_1");
|
|
PNG_UNUSED(info_ptr)
|
|
PNG_UNUSED(info_ptr)
|
|
- PNG_UNUSED(eXIf_buf)
|
|
|
|
|
|
+ PNG_UNUSED(exif)
|
|
}
|
|
}
|
|
|
|
|
|
void PNGAPI
|
|
void PNGAPI
|
|
png_set_eXIf_1(png_const_structrp png_ptr, png_inforp info_ptr,
|
|
png_set_eXIf_1(png_const_structrp png_ptr, png_inforp info_ptr,
|
|
- png_uint_32 num_exif, png_bytep eXIf_buf)
|
|
|
|
|
|
+ png_uint_32 num_exif, png_bytep exif)
|
|
{
|
|
{
|
|
- int i;
|
|
|
|
|
|
+ png_bytep new_exif;
|
|
|
|
|
|
png_debug1(1, "in %s storage function", "eXIf");
|
|
png_debug1(1, "in %s storage function", "eXIf");
|
|
|
|
|
|
- if (png_ptr == NULL || info_ptr == NULL)
|
|
|
|
|
|
+ if (png_ptr == NULL || info_ptr == NULL ||
|
|
|
|
+ (png_ptr->mode & PNG_WROTE_eXIf) != 0)
|
|
return;
|
|
return;
|
|
|
|
|
|
- if (info_ptr->exif)
|
|
|
|
- {
|
|
|
|
- png_free(png_ptr, info_ptr->exif);
|
|
|
|
- info_ptr->exif = NULL;
|
|
|
|
- }
|
|
|
|
|
|
+ new_exif = png_voidcast(png_bytep, png_malloc_warn(png_ptr, num_exif));
|
|
|
|
|
|
- info_ptr->num_exif = num_exif;
|
|
|
|
-
|
|
|
|
- info_ptr->exif = png_voidcast(png_bytep, png_malloc_warn(png_ptr,
|
|
|
|
- info_ptr->num_exif));
|
|
|
|
-
|
|
|
|
- if (info_ptr->exif == NULL)
|
|
|
|
|
|
+ if (new_exif == NULL)
|
|
{
|
|
{
|
|
png_warning(png_ptr, "Insufficient memory for eXIf chunk data");
|
|
png_warning(png_ptr, "Insufficient memory for eXIf chunk data");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- info_ptr->free_me |= PNG_FREE_EXIF;
|
|
|
|
|
|
+ memcpy(new_exif, exif, (size_t)num_exif);
|
|
|
|
|
|
- for (i = 0; i < (int) info_ptr->num_exif; i++)
|
|
|
|
- info_ptr->exif[i] = eXIf_buf[i];
|
|
|
|
|
|
+ png_free_data(png_ptr, info_ptr, PNG_FREE_EXIF, 0);
|
|
|
|
|
|
|
|
+ info_ptr->num_exif = num_exif;
|
|
|
|
+ info_ptr->exif = new_exif;
|
|
|
|
+ info_ptr->free_me |= PNG_FREE_EXIF;
|
|
info_ptr->valid |= PNG_INFO_eXIf;
|
|
info_ptr->valid |= PNG_INFO_eXIf;
|
|
}
|
|
}
|
|
#endif /* eXIf */
|
|
#endif /* eXIf */
|
|
@@ -237,15 +231,13 @@ png_set_hIST(png_const_structrp png_ptr, png_inforp info_ptr,
|
|
if (info_ptr->hist == NULL)
|
|
if (info_ptr->hist == NULL)
|
|
{
|
|
{
|
|
png_warning(png_ptr, "Insufficient memory for hIST chunk data");
|
|
png_warning(png_ptr, "Insufficient memory for hIST chunk data");
|
|
-
|
|
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- info_ptr->free_me |= PNG_FREE_HIST;
|
|
|
|
-
|
|
|
|
for (i = 0; i < info_ptr->num_palette; i++)
|
|
for (i = 0; i < info_ptr->num_palette; i++)
|
|
info_ptr->hist[i] = hist[i];
|
|
info_ptr->hist[i] = hist[i];
|
|
|
|
|
|
|
|
+ info_ptr->free_me |= PNG_FREE_HIST;
|
|
info_ptr->valid |= PNG_INFO_hIST;
|
|
info_ptr->valid |= PNG_INFO_hIST;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
@@ -367,6 +359,8 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
|
|
|
|
|
memcpy(info_ptr->pcal_purpose, purpose, length);
|
|
memcpy(info_ptr->pcal_purpose, purpose, length);
|
|
|
|
|
|
|
|
+ info_ptr->free_me |= PNG_FREE_PCAL;
|
|
|
|
+
|
|
png_debug(3, "storing X0, X1, type, and nparams in info");
|
|
png_debug(3, "storing X0, X1, type, and nparams in info");
|
|
info_ptr->pcal_X0 = X0;
|
|
info_ptr->pcal_X0 = X0;
|
|
info_ptr->pcal_X1 = X1;
|
|
info_ptr->pcal_X1 = X1;
|
|
@@ -383,7 +377,6 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
|
if (info_ptr->pcal_units == NULL)
|
|
if (info_ptr->pcal_units == NULL)
|
|
{
|
|
{
|
|
png_warning(png_ptr, "Insufficient memory for pCAL units");
|
|
png_warning(png_ptr, "Insufficient memory for pCAL units");
|
|
-
|
|
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -395,7 +388,6 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
|
if (info_ptr->pcal_params == NULL)
|
|
if (info_ptr->pcal_params == NULL)
|
|
{
|
|
{
|
|
png_warning(png_ptr, "Insufficient memory for pCAL params");
|
|
png_warning(png_ptr, "Insufficient memory for pCAL params");
|
|
-
|
|
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -413,7 +405,6 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
|
if (info_ptr->pcal_params[i] == NULL)
|
|
if (info_ptr->pcal_params[i] == NULL)
|
|
{
|
|
{
|
|
png_warning(png_ptr, "Insufficient memory for pCAL parameter");
|
|
png_warning(png_ptr, "Insufficient memory for pCAL parameter");
|
|
-
|
|
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -421,7 +412,6 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
|
}
|
|
}
|
|
|
|
|
|
info_ptr->valid |= PNG_INFO_pCAL;
|
|
info_ptr->valid |= PNG_INFO_pCAL;
|
|
- info_ptr->free_me |= PNG_FREE_PCAL;
|
|
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
@@ -478,18 +468,17 @@ png_set_sCAL_s(png_const_structrp png_ptr, png_inforp info_ptr,
|
|
|
|
|
|
if (info_ptr->scal_s_height == NULL)
|
|
if (info_ptr->scal_s_height == NULL)
|
|
{
|
|
{
|
|
- png_free (png_ptr, info_ptr->scal_s_width);
|
|
|
|
|
|
+ png_free(png_ptr, info_ptr->scal_s_width);
|
|
info_ptr->scal_s_width = NULL;
|
|
info_ptr->scal_s_width = NULL;
|
|
|
|
|
|
png_warning(png_ptr, "Memory allocation failed while processing sCAL");
|
|
png_warning(png_ptr, "Memory allocation failed while processing sCAL");
|
|
-
|
|
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
memcpy(info_ptr->scal_s_height, sheight, lengthh);
|
|
memcpy(info_ptr->scal_s_height, sheight, lengthh);
|
|
|
|
|
|
- info_ptr->valid |= PNG_INFO_sCAL;
|
|
|
|
info_ptr->free_me |= PNG_FREE_SCAL;
|
|
info_ptr->free_me |= PNG_FREE_SCAL;
|
|
|
|
+ info_ptr->valid |= PNG_INFO_sCAL;
|
|
}
|
|
}
|
|
|
|
|
|
# ifdef PNG_FLOATING_POINT_SUPPORTED
|
|
# ifdef PNG_FLOATING_POINT_SUPPORTED
|
|
@@ -625,11 +614,10 @@ png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr,
|
|
if (num_palette > 0)
|
|
if (num_palette > 0)
|
|
memcpy(png_ptr->palette, palette, (unsigned int)num_palette *
|
|
memcpy(png_ptr->palette, palette, (unsigned int)num_palette *
|
|
(sizeof (png_color)));
|
|
(sizeof (png_color)));
|
|
|
|
+
|
|
info_ptr->palette = png_ptr->palette;
|
|
info_ptr->palette = png_ptr->palette;
|
|
info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;
|
|
info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;
|
|
-
|
|
|
|
info_ptr->free_me |= PNG_FREE_PLTE;
|
|
info_ptr->free_me |= PNG_FREE_PLTE;
|
|
-
|
|
|
|
info_ptr->valid |= PNG_INFO_PLTE;
|
|
info_ptr->valid |= PNG_INFO_PLTE;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1020,8 +1008,8 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,
|
|
png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
|
|
png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
|
|
memcpy(info_ptr->trans_alpha, trans_alpha, (size_t)num_trans);
|
|
memcpy(info_ptr->trans_alpha, trans_alpha, (size_t)num_trans);
|
|
|
|
|
|
- info_ptr->valid |= PNG_INFO_tRNS;
|
|
|
|
info_ptr->free_me |= PNG_FREE_TRNS;
|
|
info_ptr->free_me |= PNG_FREE_TRNS;
|
|
|
|
+ info_ptr->valid |= PNG_INFO_tRNS;
|
|
}
|
|
}
|
|
png_ptr->trans_alpha = info_ptr->trans_alpha;
|
|
png_ptr->trans_alpha = info_ptr->trans_alpha;
|
|
}
|
|
}
|
|
@@ -1054,8 +1042,8 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,
|
|
|
|
|
|
if (num_trans != 0)
|
|
if (num_trans != 0)
|
|
{
|
|
{
|
|
- info_ptr->valid |= PNG_INFO_tRNS;
|
|
|
|
info_ptr->free_me |= PNG_FREE_TRNS;
|
|
info_ptr->free_me |= PNG_FREE_TRNS;
|
|
|
|
+ info_ptr->valid |= PNG_INFO_tRNS;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
@@ -1089,11 +1077,11 @@ png_set_sPLT(png_const_structrp png_ptr,
|
|
{
|
|
{
|
|
/* Out of memory or too many chunks */
|
|
/* Out of memory or too many chunks */
|
|
png_chunk_report(png_ptr, "too many sPLT chunks", PNG_CHUNK_WRITE_ERROR);
|
|
png_chunk_report(png_ptr, "too many sPLT chunks", PNG_CHUNK_WRITE_ERROR);
|
|
-
|
|
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
png_free(png_ptr, info_ptr->splt_palettes);
|
|
png_free(png_ptr, info_ptr->splt_palettes);
|
|
|
|
+
|
|
info_ptr->splt_palettes = np;
|
|
info_ptr->splt_palettes = np;
|
|
info_ptr->free_me |= PNG_FREE_SPLT;
|
|
info_ptr->free_me |= PNG_FREE_SPLT;
|
|
|
|
|
|
@@ -1247,11 +1235,11 @@ png_set_unknown_chunks(png_const_structrp png_ptr,
|
|
{
|
|
{
|
|
png_chunk_report(png_ptr, "too many unknown chunks",
|
|
png_chunk_report(png_ptr, "too many unknown chunks",
|
|
PNG_CHUNK_WRITE_ERROR);
|
|
PNG_CHUNK_WRITE_ERROR);
|
|
-
|
|
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
png_free(png_ptr, info_ptr->unknown_chunks);
|
|
png_free(png_ptr, info_ptr->unknown_chunks);
|
|
|
|
+
|
|
info_ptr->unknown_chunks = np; /* safe because it is initialized */
|
|
info_ptr->unknown_chunks = np; /* safe because it is initialized */
|
|
info_ptr->free_me |= PNG_FREE_UNKN;
|
|
info_ptr->free_me |= PNG_FREE_UNKN;
|
|
|
|
|