loader tslog: Don't use sprintf

Instead, append the log entry "manually".

MFC after:	1 week
Sponsored by:	https://www.patreon.com/cperciva
This commit is contained in:
Colin Percival 2021-09-24 20:19:38 -07:00
parent 6687410af7
commit 242923eb84

View file

@ -42,6 +42,24 @@ static char * tslog_buf = NULL;
static size_t tslog_buflen = 0;
static size_t tslog_bufpos = 0;
static size_t
tsccat(char * buf, uint64_t tsc)
{
size_t len;
/* Handle upper digits. */
if (tsc >= 10)
len = tsccat(buf, tsc / 10);
else
len = 0;
/* Write the last digit. */
buf[len] = "0123456789"[tsc % 10];
/* Return the length written. */
return (len + 1);
}
void
tslog_setbuf(void * buf, size_t len)
{
@ -69,16 +87,34 @@ tslog(const char * type, const char * f, const char * s)
#else
uint64_t tsc = 0;
#endif
int len;
/* If we have no buffer, do nothing. */
if (tslog_buf == NULL)
return;
/* Append to existing buffer, if we have enough space. */
len = snprintf(&tslog_buf[tslog_bufpos],
tslog_buflen - tslog_bufpos, "0x0 %llu %s %s%s%s\n",
(unsigned long long)tsc, type, f, s ? " " : "", s ? s : "");
if ((len > 0) && (tslog_bufpos + len <= tslog_buflen))
tslog_bufpos += len;
/* Check that we have enough space. */
if (tslog_buflen - tslog_bufpos < 32 + strlen(type) + strlen(f) +
(s ? strlen(s) : 0))
return;
/* Append to existing buffer. */
strcpy(&tslog_buf[tslog_bufpos], "0x0 ");
tslog_bufpos += 4;
tslog_bufpos += tsccat(&tslog_buf[tslog_bufpos], tsc);
strcpy(&tslog_buf[tslog_bufpos], " ");
tslog_bufpos += 1;
strcpy(&tslog_buf[tslog_bufpos], type);
tslog_bufpos += strlen(type);
strcpy(&tslog_buf[tslog_bufpos], " ");
tslog_bufpos += 1;
strcpy(&tslog_buf[tslog_bufpos], f);
tslog_bufpos += strlen(f);
if (s != NULL) {
strcpy(&tslog_buf[tslog_bufpos], " ");
tslog_bufpos += 1;
strcpy(&tslog_buf[tslog_bufpos], s);
tslog_bufpos += strlen(s);
}
strcpy(&tslog_buf[tslog_bufpos], "\n");
tslog_bufpos += 1;
}