libgd/tests/avif/bad_input.c

73 lines
2.0 KiB
C

/**
* File: bad_input.c
*
* Make sure that the AVIF encoding and decoding functions handle bad input gracefully.
*/
#include <stdio.h>
#include <string.h>
#include "gd.h"
#include "gdtest.h"
#define PATH "avif/"
#define MAX_FILEPATH_LENGTH 50
#define NON_AVIF_FILE_NAME "sunset.png"
#define AVIF_FILE_NAME "sunset.avif"
int main() {
FILE *fp;
int retval;
char nonAvifFilePath[MAX_FILEPATH_LENGTH], avifFilePath[MAX_FILEPATH_LENGTH];
gdImagePtr realIm, badIm;
void *rv;
int size;
// Create paths for our files.
strcpy(avifFilePath, PATH);
strcat(avifFilePath, AVIF_FILE_NAME);
strcpy(nonAvifFilePath, PATH);
strcat(nonAvifFilePath, NON_AVIF_FILE_NAME);
// Read in an AVIF image for testing.
fp = gdTestFileOpen(avifFilePath);
realIm = gdImageCreateFromAvif(fp);
fclose(fp);
if (!gdTestAssertMsg(realIm != NULL, "gdImageCreateFromAvif() failed\n"))
return 1;
// Try to decode a non-AVIF file.
fp = gdTestFileOpen(nonAvifFilePath);
badIm = gdImageCreateFromAvif(fp);
fclose(fp);
gdTestAssertMsg(badIm == NULL, "gdImageCreateFromAvif() failed to return NULL when passed a non-AVIF file\n");
if (badIm)
gdImageDestroy(badIm);
// Try to encode a valid image with bad quality parameters. This should still work.
rv = gdImageAvifPtrEx(realIm, &size, 400, 10);
gdTestAssertMsg(rv != NULL, "gdImageAvifPtrEx() rejected an overly high quality param instead of clamping it to a valid value");
gdFree(rv);
rv = gdImageAvifPtrEx(realIm, &size, -4, 10);
gdTestAssertMsg(rv != NULL, "gdImageAvifPtrEx() rejected a negative quality param instead of clamping it to a valid value");
gdFree(rv);
rv = gdImageAvifPtrEx(realIm, &size, 30, 30);
gdTestAssertMsg(rv != NULL, "gdImageAvifPtrEx() rejected an overly high speed param instead of clamping it to a valid value");
gdFree(rv);
rv = gdImageAvifPtrEx(realIm, &size, 30, -4);
gdTestAssertMsg(rv != NULL, "gdImageAvifPtrEx() rejected a negative speed param instead of clamping it to a valid value");
gdFree(rv);
gdImageDestroy(realIm);
return gdNumFailures();
}