Miscellaneous cleanup changes to apps/ and tests/
apps/avifdec.c:
* Handle avifDecoderSetIOFile() failures.
apps/avifenc.c:
* Check for not only a zero return value (empty file) but also a
negative return value (failure) of ftell().
* In error messages, change "content" to "metadata" when referring to
Exif and XMP.
tests/aviftest.c:
* Carry over my recent changes from avifIOMemoryReaderRead() to
avifIOTestReaderRead().
* Declare local variables holding strlen() return values as size_t
rather than int to avoid the casts to int.
* Add the new --io-only option to the syntax help message.
diff --git a/apps/avifdec.c b/apps/avifdec.c
index b0bdca7..79ca30c 100644
--- a/apps/avifdec.c
+++ b/apps/avifdec.c
@@ -41,8 +41,13 @@
static int info(const char * inputFilename)
{
avifDecoder * decoder = avifDecoderCreate();
- avifDecoderSetIOFile(decoder, inputFilename);
- avifResult result = avifDecoderParse(decoder);
+ avifResult result = avifDecoderSetIOFile(decoder, inputFilename);
+ if (result != AVIF_RESULT_OK) {
+ fprintf(stderr, "Cannot open file for read: %s\n", inputFilename);
+ avifDecoderDestroy(decoder);
+ return 1;
+ }
+ result = avifDecoderParse(decoder);
if (result == AVIF_RESULT_OK) {
printf("Image decoded: %s\n", inputFilename);
diff --git a/apps/avifenc.c b/apps/avifenc.c
index 32a900e..b5215a9 100644
--- a/apps/avifenc.c
+++ b/apps/avifenc.c
@@ -242,11 +242,12 @@
}
fseek(f, 0, SEEK_END);
- size_t fileSize = (size_t)ftell(f);
- if (!fileSize) {
+ long pos = ftell(f);
+ if (pos <= 0) {
fclose(f);
return AVIF_FALSE;
}
+ size_t fileSize = (size_t)pos;
fseek(f, 0, SEEK_SET);
avifRWDataRealloc(raw, fileSize);
@@ -449,14 +450,14 @@
} else if (!strcmp(arg, "--exif")) {
NEXTARG();
if (!readEntireFile(arg, &exifOverride)) {
- fprintf(stderr, "ERROR: Unable to read Exif content: %s\n", arg);
+ fprintf(stderr, "ERROR: Unable to read Exif metadata: %s\n", arg);
returnCode = 1;
goto cleanup;
}
} else if (!strcmp(arg, "--xmp")) {
NEXTARG();
if (!readEntireFile(arg, &xmpOverride)) {
- fprintf(stderr, "ERROR: Unable to read XMP content: %s\n", arg);
+ fprintf(stderr, "ERROR: Unable to read XMP metadata: %s\n", arg);
returnCode = 1;
goto cleanup;
}
diff --git a/tests/aviftest.c b/tests/aviftest.c
index d7bdea6..86b6406 100644
--- a/tests/aviftest.c
+++ b/tests/aviftest.c
@@ -273,18 +273,19 @@
avifIOTestReader * reader = (avifIOTestReader *)io;
// Sanitize/clamp incoming request
- if (offset >= reader->rodata.size) {
- offset = 0;
- size = 0;
+ if (offset > reader->rodata.size) {
+ // The offset is past the end of the buffer.
+ return AVIF_RESULT_IO_ERROR;
}
- if ((offset + size) > reader->rodata.size) {
- size = reader->rodata.size - offset;
+ uint64_t availableSize = reader->rodata.size - offset;
+ if (size > availableSize) {
+ size = availableSize;
}
- if (offset >= reader->availableBytes) {
+ if (offset > reader->availableBytes) {
return AVIF_RESULT_WAITING_ON_IO;
}
- if ((offset + size) > reader->availableBytes) {
+ if (size > (reader->availableBytes - offset)) {
return AVIF_RESULT_WAITING_ON_IO;
}
@@ -320,8 +321,8 @@
static const char * ioSuffix = "/io/";
char ioDir[FILENAME_MAX_LENGTH + 1];
- int dataDirLen = (int)strlen(dataDir);
- int ioSuffixLen = (int)strlen(ioSuffix);
+ size_t dataDirLen = strlen(dataDir);
+ size_t ioSuffixLen = strlen(ioSuffix);
if ((dataDirLen + ioSuffixLen) > FILENAME_MAX_LENGTH) {
printf("Path too long: %s\n", dataDir);
@@ -329,7 +330,7 @@
}
strcpy(ioDir, dataDir);
strcat(ioDir, ioSuffix);
- int ioDirLen = (int)strlen(ioDir);
+ size_t ioDirLen = strlen(ioDir);
int retCode = 0;
@@ -339,7 +340,7 @@
const char * filename = nextFilename(ioDir, "avif", &nfd);
for (; filename != NULL; filename = nextFilename(ioDir, "avif", &nfd)) {
char fullFilename[FILENAME_MAX_LENGTH + 1];
- int filenameLen = (int)strlen(filename);
+ size_t filenameLen = strlen(filename);
if ((ioDirLen + filenameLen) > FILENAME_MAX_LENGTH) {
printf("Path too long: %s\n", filename);
return 1;
@@ -426,7 +427,8 @@
fprintf(stderr,
"Syntax: aviftest [options] dataDir [testFilter]\n"
"Options:\n"
- " -g : Generate tests\n");
+ " -g : Generate Encode/Decode tests\n"
+ " --io-only : Run IO tests only\n");
}
int main(int argc, char * argv[])