Simplify avifDiagnosticsPrintf(), remove redundant NULL diag checks in avifROStream functions
diff --git a/src/diag.c b/src/diag.c index 3b8c244..d9cb6ea 100644 --- a/src/diag.c +++ b/src/diag.c
@@ -12,26 +12,20 @@ memset(diag->error, 0, AVIF_DIAGNOSTICS_ERROR_BUFFER_SIZE); } -static void avifDiagnosticsPrintv(avifDiagnostics * diag, const char * format, va_list args) -{ - if (*diag->error) { - // There is already a detailed error set. - return; - } - - vsnprintf(diag->error, AVIF_DIAGNOSTICS_ERROR_BUFFER_SIZE, format, args); - diag->error[AVIF_DIAGNOSTICS_ERROR_BUFFER_SIZE - 1] = '\0'; -} - void avifDiagnosticsPrintf(avifDiagnostics * diag, const char * format, ...) { if (!diag) { // It is possible this is NULL (e.g. calls to avifFileTypeIsCompatible()) return; } + if (*diag->error) { + // There is already a detailed error set. + return; + } va_list args; va_start(args, format); - avifDiagnosticsPrintv(diag, format, args); + vsnprintf(diag->error, AVIF_DIAGNOSTICS_ERROR_BUFFER_SIZE, format, args); + diag->error[AVIF_DIAGNOSTICS_ERROR_BUFFER_SIZE - 1] = '\0'; va_end(args); }
diff --git a/src/stream.c b/src/stream.c index 9b02e96..eb0eabb 100644 --- a/src/stream.c +++ b/src/stream.c
@@ -53,9 +53,7 @@ avifBool avifROStreamSkip(avifROStream * stream, size_t byteCount) { if (!avifROStreamHasBytesLeft(stream, byteCount)) { - if (stream->diag) { - avifDiagnosticsPrintf(stream->diag, "%s: Failed to skip %zu bytes, truncated data?", stream->diagContext, byteCount); - } + avifDiagnosticsPrintf(stream->diag, "%s: Failed to skip %zu bytes, truncated data?", stream->diagContext, byteCount); return AVIF_FALSE; } stream->offset += byteCount; @@ -65,9 +63,7 @@ avifBool avifROStreamRead(avifROStream * stream, uint8_t * data, size_t size) { if (!avifROStreamHasBytesLeft(stream, size)) { - if (stream->diag) { - avifDiagnosticsPrintf(stream->diag, "%s: Failed to read %zu bytes, truncated data?", stream->diagContext, size); - } + avifDiagnosticsPrintf(stream->diag, "%s: Failed to read %zu bytes, truncated data?", stream->diagContext, size); return AVIF_FALSE; } @@ -99,9 +95,7 @@ *v = tmp; } else { // Unsupported factor - if (stream->diag) { - avifDiagnosticsPrintf(stream->diag, "%s: Failed to read UX8 value; Unsupported UX8 factor [%" PRIu64 "]", stream->diagContext, factor); - } + avifDiagnosticsPrintf(stream->diag, "%s: Failed to read UX8 value; Unsupported UX8 factor [%" PRIu64 "]", stream->diagContext, factor); return AVIF_FALSE; } return AVIF_TRUE; @@ -141,9 +135,7 @@ } } if (!foundNullTerminator) { - if (stream->diag) { - avifDiagnosticsPrintf(stream->diag, "%s: Failed to find a NULL terminator when reading a string", stream->diagContext); - } + avifDiagnosticsPrintf(stream->diag, "%s: Failed to find a NULL terminator when reading a string", stream->diagContext); return AVIF_FALSE; } @@ -181,9 +173,7 @@ size_t bytesRead = stream->offset - startOffset; if ((size < bytesRead) || ((size - bytesRead) > SIZE_MAX)) { - if (stream->diag) { - avifDiagnosticsPrintf(stream->diag, "%s: Header size overflow check failure", stream->diagContext); - } + avifDiagnosticsPrintf(stream->diag, "%s: Header size overflow check failure", stream->diagContext); return AVIF_FALSE; } header->size = (size_t)(size - bytesRead); @@ -193,7 +183,11 @@ avifBool avifROStreamReadBoxHeader(avifROStream * stream, avifBoxHeader * header) { CHECK(avifROStreamReadBoxHeaderPartial(stream, header)); - return (header->size <= avifROStreamRemainingBytes(stream)); + if (header->size > avifROStreamRemainingBytes(stream)) { + avifDiagnosticsPrintf(stream->diag, "%s: Child box too large, possibly truncated data", stream->diagContext); + return AVIF_FALSE; + } + return AVIF_TRUE; } avifBool avifROStreamReadVersionAndFlags(avifROStream * stream, uint8_t * version, uint32_t * flags) @@ -214,9 +208,7 @@ uint8_t version; CHECK(avifROStreamReadVersionAndFlags(stream, &version, NULL)); if (version != enforcedVersion) { - if (stream->diag) { - avifDiagnosticsPrintf(stream->diag, "%s: Expecting box version %u, got version %u", stream->diagContext, enforcedVersion, version); - } + avifDiagnosticsPrintf(stream->diag, "%s: Expecting box version %u, got version %u", stream->diagContext, enforcedVersion, version); return AVIF_FALSE; } return AVIF_TRUE;