Blame tests/tiff/tiff_invalid_read.c

Packit Service df60bb
/*
Packit Service df60bb
We're testing that reading corrupt TIFF files doesn't cause any memory issues,
Packit Service df60bb
and that the operation gracefully fails (i.e. gdImageCreateFromTiffPtr() returns
Packit Service df60bb
NULL).
Packit Service df60bb
*/
Packit Service df60bb
Packit Service df60bb
#include "gd.h"
Packit Service df60bb
#include "gdtest.h"
Packit Service df60bb
Packit Service df60bb
Packit Service df60bb
static void check_file(char *basename);
Packit Service df60bb
static size_t read_test_file(char **buffer, char *basename);
Packit Service df60bb
Packit Service df60bb
Packit Service df60bb
int main()
Packit Service df60bb
{
Packit Service df60bb
    check_file("tiff_invalid_read_1.tiff");
Packit Service df60bb
    check_file("tiff_invalid_read_2.tiff");
Packit Service df60bb
    check_file("tiff_invalid_read_3.tiff");
Packit Service df60bb
Packit Service df60bb
    return gdNumFailures();
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
Packit Service df60bb
static void check_file(char *basename)
Packit Service df60bb
{
Packit Service df60bb
    gdImagePtr im;
Packit Service df60bb
    char *buffer;
Packit Service df60bb
    size_t size;
Packit Service df60bb
Packit Service df60bb
    size = read_test_file(&buffer, basename);
Packit Service df60bb
    im = gdImageCreateFromTiffPtr(size, (void *) buffer);
Packit Service df60bb
    gdTestAssert(im == NULL);
Packit Service df60bb
    free(buffer);
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
Packit Service df60bb
static size_t read_test_file(char **buffer, char *basename)
Packit Service df60bb
{
Packit Service df60bb
    char *filename;
Packit Service df60bb
    FILE *fp;
Packit Service df60bb
    size_t exp_size, act_size;
Packit Service df60bb
Packit Service df60bb
    filename = gdTestFilePath2("tiff", basename);
Packit Service df60bb
    fp = fopen(filename, "rb");
Packit Service df60bb
    gdTestAssert(fp != NULL);
Packit Service df60bb
Packit Service df60bb
	fseek(fp, 0, SEEK_END);
Packit Service df60bb
	exp_size = ftell(fp);
Packit Service df60bb
	fseek(fp, 0, SEEK_SET);
Packit Service df60bb
Packit Service df60bb
    *buffer = malloc(exp_size);
Packit Service df60bb
    gdTestAssert(*buffer != NULL);
Packit Service df60bb
    act_size = fread(*buffer, sizeof(**buffer), exp_size, fp);
Packit Service df60bb
    gdTestAssert(act_size == exp_size);
Packit Service df60bb
Packit Service df60bb
    fclose(fp);
Packit Service df60bb
    free(filename);
Packit Service df60bb
Packit Service df60bb
    return act_size;
Packit Service df60bb
}