1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 04:27:44 +00:00

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
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, ...); int dbgprintf(const char* fmt, ...);
ssize_t dbgputstr(const char*, ssize_t); ssize_t dbgputstr(const char*, ssize_t);
int sprintf(char* buf, const char* fmt, ...); int sprintf(char* buf, const char* fmt, ...);
int snprintf(char* buffer, size_t, const char* fmt, ...);
} }
# endif # endif
#else #else

View file

@ -144,6 +144,34 @@ int sprintf(char* buffer, const char* fmt, ...)
return ret; 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) static void debugger_out(char ch)
{ {
if (serial_debug) if (serial_debug)

View file

@ -34,6 +34,7 @@ int dbgputstr(const char*, int);
int kernelputstr(const char*, int); int kernelputstr(const char*, int);
int kprintf(const char* fmt, ...); int kprintf(const char* fmt, ...);
int sprintf(char* buf, 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); void set_serial_debug(bool on_or_off);
int get_serial_debug(); int get_serial_debug();
} }