Rewrite avifCodecVersions again, again. Someone put strlcat() in the real C standard, please.
diff --git a/src/avif.c b/src/avif.c index 6569459..6a1a403 100644 --- a/src/avif.c +++ b/src/avif.c
@@ -475,16 +475,31 @@ return NULL; } +static void append(char ** writePos, size_t * remainingLen, const char * appendStr) +{ + size_t appendLen = strlen(appendStr); + if (appendLen > *remainingLen) { + appendLen = *remainingLen; + } + + memcpy(*writePos, appendStr, appendLen); + *remainingLen -= appendLen; + *writePos += appendLen; + *(*writePos) = 0; +} + void avifCodecVersions(char outBuffer[256]) { - const size_t maxChars = 255; - outBuffer[0] = 0; + size_t remainingLen = 255; + char * writePos = outBuffer; + *writePos = 0; + for (int i = 0; i < availableCodecsCount; ++i) { if (i > 0) { - strncat(outBuffer, ", ", maxChars); + append(&writePos, &remainingLen, ", "); } - strncat(outBuffer, availableCodecs[i].name, maxChars); - strncat(outBuffer, ":", maxChars); - strncat(outBuffer, availableCodecs[i].version(), maxChars); + append(&writePos, &remainingLen, availableCodecs[i].name); + append(&writePos, &remainingLen, ":"); + append(&writePos, &remainingLen, availableCodecs[i].version()); } }