342
361
png_debug(1, "in png_free_data");
343
363
if (png_ptr == NULL || info_ptr == NULL)
346
#if defined(PNG_TEXT_SUPPORTED)
347
/* free text item num or (if num == -1) all text items */
366
#ifdef PNG_TEXT_SUPPORTED
367
/* Free text item num or (if num == -1) all text items */
348
368
#ifdef PNG_FREE_ME_SUPPORTED
349
if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)
369
if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)
351
if (mask & PNG_FREE_TEXT)
371
if (mask & PNG_FREE_TEXT)
356
if (info_ptr->text && info_ptr->text[num].key)
358
png_free(png_ptr, info_ptr->text[num].key);
359
info_ptr->text[num].key = NULL;
365
for (i = 0; i < info_ptr->num_text; i++)
366
png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i);
367
png_free(png_ptr, info_ptr->text);
368
info_ptr->text = NULL;
369
info_ptr->num_text=0;
376
if (info_ptr->text && info_ptr->text[num].key)
378
png_free(png_ptr, info_ptr->text[num].key);
379
info_ptr->text[num].key = NULL;
385
for (i = 0; i < info_ptr->num_text; i++)
386
png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i);
387
png_free(png_ptr, info_ptr->text);
388
info_ptr->text = NULL;
389
info_ptr->num_text=0;
374
#if defined(PNG_tRNS_SUPPORTED)
375
/* free any tRNS entry */
394
#ifdef PNG_tRNS_SUPPORTED
395
/* Free any tRNS entry */
376
396
#ifdef PNG_FREE_ME_SUPPORTED
377
if ((mask & PNG_FREE_TRNS) & info_ptr->free_me)
397
if ((mask & PNG_FREE_TRNS) & info_ptr->free_me)
379
if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS))
399
if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS))
382
png_free(png_ptr, info_ptr->trans);
383
info_ptr->trans = NULL;
384
info_ptr->valid &= ~PNG_INFO_tRNS;
402
png_free(png_ptr, info_ptr->trans);
403
info_ptr->trans = NULL;
404
info_ptr->valid &= ~PNG_INFO_tRNS;
385
405
#ifndef PNG_FREE_ME_SUPPORTED
386
png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
406
png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
391
#if defined(PNG_sCAL_SUPPORTED)
392
/* free any sCAL entry */
411
#ifdef PNG_sCAL_SUPPORTED
412
/* Free any sCAL entry */
393
413
#ifdef PNG_FREE_ME_SUPPORTED
394
if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
414
if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
396
if (mask & PNG_FREE_SCAL)
416
if (mask & PNG_FREE_SCAL)
399
419
#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
400
png_free(png_ptr, info_ptr->scal_s_width);
401
png_free(png_ptr, info_ptr->scal_s_height);
402
info_ptr->scal_s_width = NULL;
403
info_ptr->scal_s_height = NULL;
405
info_ptr->valid &= ~PNG_INFO_sCAL;
409
#if defined(PNG_pCAL_SUPPORTED)
410
/* free any pCAL entry */
411
#ifdef PNG_FREE_ME_SUPPORTED
412
if ((mask & PNG_FREE_PCAL) & info_ptr->free_me)
414
if (mask & PNG_FREE_PCAL)
417
png_free(png_ptr, info_ptr->pcal_purpose);
418
png_free(png_ptr, info_ptr->pcal_units);
419
info_ptr->pcal_purpose = NULL;
420
info_ptr->pcal_units = NULL;
421
if (info_ptr->pcal_params != NULL)
424
for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
426
png_free(png_ptr, info_ptr->pcal_params[i]);
427
info_ptr->pcal_params[i]=NULL;
429
png_free(png_ptr, info_ptr->pcal_params);
430
info_ptr->pcal_params = NULL;
432
info_ptr->valid &= ~PNG_INFO_pCAL;
436
#if defined(PNG_iCCP_SUPPORTED)
437
/* free any iCCP entry */
438
#ifdef PNG_FREE_ME_SUPPORTED
439
if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
441
if (mask & PNG_FREE_ICCP)
444
png_free(png_ptr, info_ptr->iccp_name);
445
png_free(png_ptr, info_ptr->iccp_profile);
446
info_ptr->iccp_name = NULL;
447
info_ptr->iccp_profile = NULL;
448
info_ptr->valid &= ~PNG_INFO_iCCP;
452
#if defined(PNG_sPLT_SUPPORTED)
453
/* free a given sPLT entry, or (if num == -1) all sPLT entries */
454
#ifdef PNG_FREE_ME_SUPPORTED
455
if ((mask & PNG_FREE_SPLT) & info_ptr->free_me)
457
if (mask & PNG_FREE_SPLT)
462
if (info_ptr->splt_palettes)
464
png_free(png_ptr, info_ptr->splt_palettes[num].name);
465
png_free(png_ptr, info_ptr->splt_palettes[num].entries);
466
info_ptr->splt_palettes[num].name = NULL;
467
info_ptr->splt_palettes[num].entries = NULL;
472
if (info_ptr->splt_palettes_num)
420
png_free(png_ptr, info_ptr->scal_s_width);
421
png_free(png_ptr, info_ptr->scal_s_height);
422
info_ptr->scal_s_width = NULL;
423
info_ptr->scal_s_height = NULL;
425
info_ptr->valid &= ~PNG_INFO_sCAL;
429
#ifdef PNG_pCAL_SUPPORTED
430
/* Free any pCAL entry */
431
#ifdef PNG_FREE_ME_SUPPORTED
432
if ((mask & PNG_FREE_PCAL) & info_ptr->free_me)
434
if (mask & PNG_FREE_PCAL)
437
png_free(png_ptr, info_ptr->pcal_purpose);
438
png_free(png_ptr, info_ptr->pcal_units);
439
info_ptr->pcal_purpose = NULL;
440
info_ptr->pcal_units = NULL;
441
if (info_ptr->pcal_params != NULL)
444
for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
446
png_free(png_ptr, info_ptr->pcal_params[i]);
447
info_ptr->pcal_params[i] = NULL;
449
png_free(png_ptr, info_ptr->pcal_params);
450
info_ptr->pcal_params = NULL;
452
info_ptr->valid &= ~PNG_INFO_pCAL;
456
#ifdef PNG_iCCP_SUPPORTED
457
/* Free any iCCP entry */
458
#ifdef PNG_FREE_ME_SUPPORTED
459
if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
461
if (mask & PNG_FREE_ICCP)
464
png_free(png_ptr, info_ptr->iccp_name);
465
png_free(png_ptr, info_ptr->iccp_profile);
466
info_ptr->iccp_name = NULL;
467
info_ptr->iccp_profile = NULL;
468
info_ptr->valid &= ~PNG_INFO_iCCP;
472
#ifdef PNG_sPLT_SUPPORTED
473
/* Free a given sPLT entry, or (if num == -1) all sPLT entries */
474
#ifdef PNG_FREE_ME_SUPPORTED
475
if ((mask & PNG_FREE_SPLT) & info_ptr->free_me)
477
if (mask & PNG_FREE_SPLT)
482
if (info_ptr->splt_palettes)
484
png_free(png_ptr, info_ptr->splt_palettes[num].name);
485
png_free(png_ptr, info_ptr->splt_palettes[num].entries);
486
info_ptr->splt_palettes[num].name = NULL;
487
info_ptr->splt_palettes[num].entries = NULL;
492
if (info_ptr->splt_palettes_num)
495
for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
496
png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i);
498
png_free(png_ptr, info_ptr->splt_palettes);
499
info_ptr->splt_palettes = NULL;
500
info_ptr->splt_palettes_num = 0;
502
info_ptr->valid &= ~PNG_INFO_sPLT;
507
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
508
if (png_ptr->unknown_chunk.data)
510
png_free(png_ptr, png_ptr->unknown_chunk.data);
511
png_ptr->unknown_chunk.data = NULL;
514
#ifdef PNG_FREE_ME_SUPPORTED
515
if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
517
if (mask & PNG_FREE_UNKN)
522
if (info_ptr->unknown_chunks)
524
png_free(png_ptr, info_ptr->unknown_chunks[num].data);
525
info_ptr->unknown_chunks[num].data = NULL;
475
for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
476
png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i);
478
png_free(png_ptr, info_ptr->splt_palettes);
479
info_ptr->splt_palettes = NULL;
480
info_ptr->splt_palettes_num = 0;
482
info_ptr->valid &= ~PNG_INFO_sPLT;
487
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
488
if (png_ptr->unknown_chunk.data)
490
png_free(png_ptr, png_ptr->unknown_chunk.data);
491
png_ptr->unknown_chunk.data = NULL;
494
#ifdef PNG_FREE_ME_SUPPORTED
495
if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
497
if (mask & PNG_FREE_UNKN)
502
if (info_ptr->unknown_chunks)
504
png_free(png_ptr, info_ptr->unknown_chunks[num].data);
505
info_ptr->unknown_chunks[num].data = NULL;
512
if (info_ptr->unknown_chunks_num)
514
for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++)
515
png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i);
517
png_free(png_ptr, info_ptr->unknown_chunks);
518
info_ptr->unknown_chunks = NULL;
519
info_ptr->unknown_chunks_num = 0;
525
#if defined(PNG_hIST_SUPPORTED)
526
/* free any hIST entry */
527
#ifdef PNG_FREE_ME_SUPPORTED
528
if ((mask & PNG_FREE_HIST) & info_ptr->free_me)
530
if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST))
533
png_free(png_ptr, info_ptr->hist);
534
info_ptr->hist = NULL;
535
info_ptr->valid &= ~PNG_INFO_hIST;
536
#ifndef PNG_FREE_ME_SUPPORTED
537
png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
542
/* free any PLTE entry that was internally allocated */
543
#ifdef PNG_FREE_ME_SUPPORTED
544
if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
546
if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE))
549
png_zfree(png_ptr, info_ptr->palette);
550
info_ptr->palette = NULL;
551
info_ptr->valid &= ~PNG_INFO_PLTE;
552
#ifndef PNG_FREE_ME_SUPPORTED
553
png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
555
info_ptr->num_palette = 0;
558
#if defined(PNG_INFO_IMAGE_SUPPORTED)
559
/* free any image bits attached to the info structure */
560
#ifdef PNG_FREE_ME_SUPPORTED
561
if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
563
if (mask & PNG_FREE_ROWS)
566
if (info_ptr->row_pointers)
569
for (row = 0; row < (int)info_ptr->height; row++)
571
png_free(png_ptr, info_ptr->row_pointers[row]);
572
info_ptr->row_pointers[row]=NULL;
574
png_free(png_ptr, info_ptr->row_pointers);
575
info_ptr->row_pointers=NULL;
577
info_ptr->valid &= ~PNG_INFO_IDAT;
532
if (info_ptr->unknown_chunks_num)
534
for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++)
535
png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i);
537
png_free(png_ptr, info_ptr->unknown_chunks);
538
info_ptr->unknown_chunks = NULL;
539
info_ptr->unknown_chunks_num = 0;
545
#ifdef PNG_hIST_SUPPORTED
546
/* Free any hIST entry */
547
#ifdef PNG_FREE_ME_SUPPORTED
548
if ((mask & PNG_FREE_HIST) & info_ptr->free_me)
550
if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST))
553
png_free(png_ptr, info_ptr->hist);
554
info_ptr->hist = NULL;
555
info_ptr->valid &= ~PNG_INFO_hIST;
556
#ifndef PNG_FREE_ME_SUPPORTED
557
png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
562
/* Free any PLTE entry that was internally allocated */
563
#ifdef PNG_FREE_ME_SUPPORTED
564
if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
566
if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE))
569
png_zfree(png_ptr, info_ptr->palette);
570
info_ptr->palette = NULL;
571
info_ptr->valid &= ~PNG_INFO_PLTE;
572
#ifndef PNG_FREE_ME_SUPPORTED
573
png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
575
info_ptr->num_palette = 0;
578
#ifdef PNG_INFO_IMAGE_SUPPORTED
579
/* Free any image bits attached to the info structure */
580
#ifdef PNG_FREE_ME_SUPPORTED
581
if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
583
if (mask & PNG_FREE_ROWS)
586
if (info_ptr->row_pointers)
589
for (row = 0; row < (int)info_ptr->height; row++)
591
png_free(png_ptr, info_ptr->row_pointers[row]);
592
info_ptr->row_pointers[row] = NULL;
594
png_free(png_ptr, info_ptr->row_pointers);
595
info_ptr->row_pointers = NULL;
597
info_ptr->valid &= ~PNG_INFO_IDAT;
581
601
#ifdef PNG_FREE_ME_SUPPORTED
583
info_ptr->free_me &= ~mask;
603
info_ptr->free_me &= ~mask;
585
info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL);
605
info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL);
909
#endif /* NO_PNG_CHECK_cHRM */
956
#endif /* PNG_CHECK_cHRM_SUPPORTED */
910
957
#endif /* PNG_cHRM_SUPPORTED */
960
png_check_IHDR(png_structp png_ptr,
961
png_uint_32 width, png_uint_32 height, int bit_depth,
962
int color_type, int interlace_type, int compression_type,
967
/* Check for width and height valid values */
970
png_warning(png_ptr, "Image width is zero in IHDR");
976
png_warning(png_ptr, "Image height is zero in IHDR");
980
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
981
if (width > png_ptr->user_width_max || width > PNG_USER_WIDTH_MAX)
983
if (width > PNG_USER_WIDTH_MAX)
986
png_warning(png_ptr, "Image width exceeds user limit in IHDR");
990
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
991
if (height > png_ptr->user_height_max || height > PNG_USER_HEIGHT_MAX)
993
if (height > PNG_USER_HEIGHT_MAX)
996
png_warning(png_ptr, "Image height exceeds user limit in IHDR");
1000
if (width > PNG_UINT_31_MAX)
1002
png_warning(png_ptr, "Invalid image width in IHDR");
1006
if ( height > PNG_UINT_31_MAX)
1008
png_warning(png_ptr, "Invalid image height in IHDR");
1012
if ( width > (PNG_UINT_32_MAX
1013
>> 3) /* 8-byte RGBA pixels */
1014
- 64 /* bigrowbuf hack */
1015
- 1 /* filter byte */
1016
- 7*8 /* rounding of width to multiple of 8 pixels */
1017
- 8) /* extra max_pixel_depth pad */
1018
png_warning(png_ptr, "Width is too large for libpng to process pixels");
1020
/* Check other values */
1021
if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 &&
1022
bit_depth != 8 && bit_depth != 16)
1024
png_warning(png_ptr, "Invalid bit depth in IHDR");
1028
if (color_type < 0 || color_type == 1 ||
1029
color_type == 5 || color_type > 6)
1031
png_warning(png_ptr, "Invalid color type in IHDR");
1035
if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) ||
1036
((color_type == PNG_COLOR_TYPE_RGB ||
1037
color_type == PNG_COLOR_TYPE_GRAY_ALPHA ||
1038
color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8))
1040
png_warning(png_ptr, "Invalid color type/bit depth combination in IHDR");
1044
if (interlace_type >= PNG_INTERLACE_LAST)
1046
png_warning(png_ptr, "Unknown interlace method in IHDR");
1050
if (compression_type != PNG_COMPRESSION_TYPE_BASE)
1052
png_warning(png_ptr, "Unknown compression method in IHDR");
1056
#ifdef PNG_MNG_FEATURES_SUPPORTED
1057
/* Accept filter_method 64 (intrapixel differencing) only if
1058
* 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
1059
* 2. Libpng did not read a PNG signature (this filter_method is only
1060
* used in PNG datastreams that are embedded in MNG datastreams) and
1061
* 3. The application called png_permit_mng_features with a mask that
1062
* included PNG_FLAG_MNG_FILTER_64 and
1063
* 4. The filter_method is 64 and
1064
* 5. The color_type is RGB or RGBA
1066
if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) &&
1067
png_ptr->mng_features_permitted)
1068
png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
1070
if (filter_type != PNG_FILTER_TYPE_BASE)
1072
if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
1073
(filter_type == PNG_INTRAPIXEL_DIFFERENCING) &&
1074
((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) == 0) &&
1075
(color_type == PNG_COLOR_TYPE_RGB ||
1076
color_type == PNG_COLOR_TYPE_RGB_ALPHA)))
1078
png_warning(png_ptr, "Unknown filter method in IHDR");
1082
if (png_ptr->mode & PNG_HAVE_PNG_SIGNATURE)
1084
png_warning(png_ptr, "Invalid filter method in IHDR");
1090
if (filter_type != PNG_FILTER_TYPE_BASE)
1092
png_warning(png_ptr, "Unknown filter method in IHDR");
1098
png_error(png_ptr, "Invalid IHDR data");
911
1100
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */