AK+Kernel: Support snprintf

In contrast to sprintf, which might overflow the given buffer.

I feel bad about the code duplication, but that is a pre-existing issue.
This commit is contained in:
Ben Wiederhake 2020-08-16 01:37:32 +02:00 committed by Andreas Kling
parent 2d34f0f93a
commit 0240baa42d
Notes: sideshowbarker 2024-07-19 03:17:14 +09:00
3 changed files with 30 additions and 0 deletions

View file

@ -37,6 +37,7 @@ int vdbgprintf(const char* fmt, va_list);
int dbgprintf(const char* fmt, ...);
ssize_t dbgputstr(const char*, ssize_t);
int sprintf(char* buf, const char* fmt, ...);
int snprintf(char* buffer, size_t, const char* fmt, ...);
}
# endif
#else

View file

@ -144,6 +144,34 @@ int sprintf(char* buffer, const char* fmt, ...)
return ret;
}
static size_t __vsnprintf_space_remaining;
ALWAYS_INLINE void sized_buffer_putch(char*& bufptr, char ch)
{
if (__vsnprintf_space_remaining) {
*bufptr++ = ch;
--__vsnprintf_space_remaining;
}
}
int snprintf(char* buffer, size_t size, const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
if (size) {
__vsnprintf_space_remaining = size - 1;
} else {
__vsnprintf_space_remaining = 0;
}
int ret = printf_internal(sized_buffer_putch, buffer, fmt, ap);
if (__vsnprintf_space_remaining) {
buffer[ret] = '\0';
} else if (size > 0) {
buffer[size - 1] = '\0';
}
va_end(ap);
return ret;
}
static void debugger_out(char ch)
{
if (serial_debug)

View file

@ -34,6 +34,7 @@ int dbgputstr(const char*, int);
int kernelputstr(const char*, int);
int kprintf(const char* fmt, ...);
int sprintf(char* buf, const char* fmt, ...);
int snprintf(char* buf, size_t, const char* fmt, ...);
void set_serial_debug(bool on_or_off);
int get_serial_debug();
}