ref: 9bec983923411bb41ecf8af8ea116e342e0cb2d0
parent: 2220f19fa717ee7fd18838f87ead8a1ef5d308fb
parent: 2a734ecba2f37553749b8720e0ad8cb4b3198902
author: Eldred Habert <[email protected]>
date: Sun Apr 12 22:39:17 EDT 2020
Merge pull request #511 from JL2210/memory-errors Fix memory errors in makepng
--- a/src/gfx/makepng.c
+++ b/src/gfx/makepng.c
@@ -82,6 +82,9 @@
*/
if (opts->debug) {
outfile = malloc(strlen(opts->infile) + 5);
+ if (!outfile)
+ err(1, "%s: Failed to allocate memory for outfile",
+ __func__);
strcpy(outfile, opts->infile);
strcat(outfile, ".out");
} else {
@@ -110,7 +113,10 @@
8, PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
- png_palette = malloc(sizeof(png_color *) * raw_image->num_colors);
+ png_palette = malloc(sizeof(*png_palette) * raw_image->num_colors);
+ if (!png_palette)
+ err(1, "%s: Failed to allocate memory for PNG palette",
+ __func__);
for (i = 0; i < raw_image->num_colors; i++) {
png_palette[i].red = raw_image->palette[i].red;
png_palette[i].green = raw_image->palette[i].green;
@@ -207,9 +213,16 @@
if (png_get_tRNS(img->png, img->info, &trans_alpha, &num_trans,
&trans_color)) {
original_palette = palette;
- palette = malloc(sizeof(png_color) * colors_in_PLTE);
+ palette = malloc(sizeof(*palette) * colors_in_PLTE);
+ if (!palette)
+ err(1, "%s: Failed to allocate memory for palette",
+ __func__);
colors_in_new_palette = 0;
- old_to_new_palette = malloc(sizeof(uint8_t) * colors_in_PLTE);
+ old_to_new_palette = malloc(sizeof(*old_to_new_palette)
+ * colors_in_PLTE);
+ if (!old_to_new_palette)
+ err(1, "%s: Failed to allocate memory for new palette",
+ __func__);
for (i = 0; i < num_trans; i++) {
if (trans_alpha[i] == 0) {
@@ -227,8 +240,11 @@
if (colors_in_new_palette != colors_in_PLTE) {
palette = realloc(palette,
- sizeof(png_color) *
+ sizeof(*palette) *
colors_in_new_palette);
+ if (!palette)
+ err(1, "%s: Failed to allocate memory for palette",
+ __func__);
}
/*
@@ -247,6 +263,7 @@
}
}
+ free(palette);
free(old_to_new_palette);
} else {
set_raw_image_palette(raw_image, palette, colors_in_PLTE);
@@ -353,7 +370,9 @@
* By filling the palette up with black by default, if the image
* doesn't have enough colors, the palette gets padded with black.
*/
- *palette_ptr_ptr = calloc(colors, sizeof(png_color));
+ *palette_ptr_ptr = calloc(colors, sizeof(**palette_ptr_ptr));
+ if (!*palette_ptr_ptr)
+ err(1, "%s: Failed to allocate memory for palette", __func__);
palette = *palette_ptr_ptr;
*num_colors = 0;
@@ -421,10 +440,15 @@
static int fit_grayscale_palette(png_color *palette, int *num_colors)
{
int interval = 256 / colors;
- png_color *fitted_palette = malloc(sizeof(png_color) * colors);
- bool *set_indices = calloc(colors, sizeof(bool));
+ png_color *fitted_palette = malloc(sizeof(*fitted_palette) * colors);
+ bool *set_indices = calloc(colors, sizeof(*set_indices));
int i, shade_index;
+ if (!fitted_palette)
+ err(1, "%s: Failed to allocate memory for palette", __func__);
+ if (!set_indices)
+ err(1, "%s: Failed to allocate memory for indices", __func__);
+
fitted_palette[0].red = 0xFF;
fitted_palette[0].green = 0xFF;
fitted_palette[0].blue = 0xFF;
@@ -481,8 +505,11 @@
{
int i;
struct ColorWithLuminance *palette_with_luminance =
- malloc(sizeof(struct ColorWithLuminance) * num_colors);
+ malloc(sizeof(*palette_with_luminance) * num_colors);
+ if (!palette_with_luminance)
+ err(1, "%s: Failed to allocate memory for palette", __func__);
+
for (i = 0; i < num_colors; i++) {
/*
* Normally this would be done with floats, but since it's only
@@ -494,7 +521,7 @@
722 * palette[i].blue;
}
qsort(palette_with_luminance, num_colors,
- sizeof(struct ColorWithLuminance), compare_luminance);
+ sizeof(*palette_with_luminance), compare_luminance);
for (i = 0; i < num_colors; i++)
palette[i] = palette_with_luminance[i].color;
@@ -582,9 +609,16 @@
png_read_update_info(img->png, img->info);
- img->data = malloc(sizeof(png_byte *) * img->height);
- for (y = 0; y < img->height; y++)
+ img->data = malloc(sizeof(*img->data) * img->height);
+ if (!img->data)
+ err(1, "%s: Failed to allocate memory for image data",
+ __func__);
+ for (y = 0; y < img->height; y++) {
img->data[y] = malloc(png_get_rowbytes(img->png, img->info));
+ if (!img->data[y])
+ err(1, "%s: Failed to allocate memory for image data",
+ __func__);
+ }
png_read_image(img->png, img->data);
png_read_end(img->png, img->info);
@@ -596,17 +630,31 @@
struct RawIndexedImage *raw_image;
int y;
- raw_image = malloc(sizeof(struct RawIndexedImage));
+ raw_image = malloc(sizeof(*raw_image));
+ if (!raw_image)
+ err(1, "%s: Failed to allocate memory for raw image",
+ __func__);
raw_image->width = width;
raw_image->height = height;
raw_image->num_colors = num_colors;
- raw_image->palette = malloc(sizeof(struct RGBColor) * num_colors);
+ raw_image->palette = malloc(sizeof(*raw_image->palette) * num_colors);
+ if (!raw_image->palette)
+ err(1, "%s: Failed to allocate memory for raw image palette",
+ __func__);
- raw_image->data = malloc(sizeof(uint8_t *) * height);
- for (y = 0; y < height; y++)
- raw_image->data[y] = malloc(sizeof(uint8_t) * width);
+ raw_image->data = malloc(sizeof(*raw_image->data) * height);
+ if (!raw_image->data)
+ err(1, "%s: Failed to allocate memory for raw image data",
+ __func__);
+ for (y = 0; y < height; y++) {
+ raw_image->data[y] = malloc(sizeof(*raw_image->data[y])
+ * width);
+ if (!raw_image->data[y])
+ err(1, "%s: Failed to allocate memory for raw image data",
+ __func__);
+ }
return raw_image;
}
@@ -690,7 +738,10 @@
png_text *text;
char buffer[3];
- text = malloc(sizeof(png_text));
+ text = malloc(sizeof(*text));
+ if (!text)
+ err(1, "%s: Failed to allocate memory for PNG text",
+ __func__);
if (png_options->horizontal) {
text[0].key = "h";