Skip to content

Commit

Permalink
AK+Kernel: Support snprintf
Browse files Browse the repository at this point in the history
In contrast to sprintf, which might overflow the given buffer.

I feel bad about the code duplication, but that is a pre-existing issue.
  • Loading branch information
BenWiederhake authored and awesomekling committed Aug 22, 2020
1 parent 2d34f0f commit 0240baa
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 0 deletions.
1 change: 1 addition & 0 deletions AK/kstdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions Kernel/kprintf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions Kernel/kstdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

0 comments on commit 0240baa

Please sign in to comment.