Blame tests/tiff/tiff_invalid_read.c

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