diff --git a/cinera/cinera.c b/cinera/cinera.c index ddfb6dc..e8d15b8 100644 --- a/cinera/cinera.c +++ b/cinera/cinera.c @@ -23,7 +23,7 @@ typedef struct version CINERA_APP_VERSION = { .Major = 0, .Minor = 10, - .Patch = 17 + .Patch = 18 }; #define __USE_XOPEN2K8 // NOTE(matt): O_NOFOLLOW @@ -4249,6 +4249,25 @@ CopyStringNoFormat_(int LineNumber, char *Dest, int DestSize, string String) return String.Length; } +#define ClearCopyStringNoFormatOrTerminate(Dest, DestSize, String) ClearCopyStringNoFormatOrTerminate_(__LINE__, Dest, DestSize, String) +int +ClearCopyStringNoFormatOrTerminate_(int LineNumber, char *Dest, int DestSize, string String) +{ + if(String.Length > DestSize) + { + printf("ClearCopyStringNoFormatOrTerminate() call on line %d has been passed a buffer too small (%d bytes) to contain %ld-character string:\n" + "%.*s\n", LineNumber, DestSize, String.Length, (int)String.Length, String.Base); + __asm__("int3"); + } + + Clear(Dest, DestSize); + for(int i = 0; i < String.Length; ++i) + { + *Dest++ = String.Base[i]; + } + return String.Length; +} + #define ClearCopyStringNoFormat(Dest, DestSize, String) ClearCopyStringNoFormat_(__LINE__, Dest, DestSize, String) int ClearCopyStringNoFormat_(int LineNumber, char *Dest, int DestSize, string String) @@ -11129,7 +11148,7 @@ HMMLToBuffers(buffers *CollationBuffers, template *BespokeTemplate, string BaseF if(Result == RC_SUCCESS) { - ClearCopyStringNoFormat(N->WorkingThis.OutputLocation, sizeof(N->WorkingThis.OutputLocation), OutputLocation); + ClearCopyStringNoFormatOrTerminate(N->WorkingThis.OutputLocation, sizeof(N->WorkingThis.OutputLocation), OutputLocation); buffer URLPlayer = {}; ClaimBuffer(&URLPlayer, BID_URL_PLAYER, MAX_BASE_URL_LENGTH + SLASH + MAX_RELATIVE_PAGE_LOCATION_LENGTH + SLASH + sizeof(N->WorkingThis.OutputLocation));