diff --git a/headers/private/kernel/debug.h b/headers/private/kernel/debug.h index 50bc105ac4..0d0f4d855d 100644 --- a/headers/private/kernel/debug.h +++ b/headers/private/kernel/debug.h @@ -131,6 +131,7 @@ extern bool debug_is_kernel_memory_accessible(addr_t address, size_t size, extern int debug_call_with_fault_handler(jmp_buf jumpBuffer, void (*function)(void*), void* parameter); extern status_t debug_memcpy(void* to, const void* from, size_t size); +extern ssize_t debug_strlcpy(char* to, const char* from, size_t size); extern char kgetc(void); extern void kputs(const char *string); diff --git a/src/system/kernel/debug/debug.cpp b/src/system/kernel/debug/debug.cpp index 3a15476097..70679f056d 100644 --- a/src/system/kernel/debug/debug.cpp +++ b/src/system/kernel/debug/debug.cpp @@ -55,6 +55,13 @@ struct debug_memcpy_parameters { size_t size; }; +struct debug_strlcpy_parameters { + char* to; + const char* from; + size_t size; + size_t result; +}; + static const char* const kKDLPrompt = "kdebug> "; @@ -1180,6 +1187,16 @@ debug_memcpy_trampoline(void* _parameters) } +static void +debug_strlcpy_trampoline(void* _parameters) +{ + debug_strlcpy_parameters* parameters + = (debug_strlcpy_parameters*)_parameters; + parameters->result = strlcpy(parameters->to, parameters->from, + parameters->size); +} + + void call_modules_hook(bool enter) { @@ -1522,6 +1539,22 @@ debug_memcpy(void* to, const void* from, size_t size) } +/*! Similar to user_strlcpy(), but can only be invoked from within the kernel + debugger (and must not be used outside). +*/ +ssize_t +debug_strlcpy(char* to, const char* from, size_t size) +{ + debug_strlcpy_parameters parameters = {to, from, size}; + + if (debug_call_with_fault_handler(gCPU[sDebuggerOnCPU].fault_jump_buffer, + &debug_strlcpy_trampoline, ¶meters) != 0) { + return B_BAD_ADDRESS; + } + return parameters.result; +} + + // #pragma mark - public API