From 8e4aa13350725d60da0f46b7d9e2b0538e470ce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 26 May 2018 15:52:37 +0200 Subject: [PATCH] console: use user_memcpy to read the user buffer. --- src/add-ons/kernel/drivers/common/console.cpp | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/add-ons/kernel/drivers/common/console.cpp b/src/add-ons/kernel/drivers/common/console.cpp index 804230b484..5a7cde1fe9 100644 --- a/src/add-ons/kernel/drivers/common/console.cpp +++ b/src/add-ons/kernel/drivers/common/console.cpp @@ -701,7 +701,8 @@ static status_t console_write(void *cookie, off_t pos, const void *buffer, size_t *_length) { struct console_desc *console = (struct console_desc *)cookie; - ssize_t written; + ssize_t written = 0; + status_t status = B_OK; #if 0 { @@ -720,16 +721,27 @@ console_write(void *cookie, off_t pos, const void *buffer, size_t *_length) mutex_lock(&console->lock); update_cursor(console, -1, -1); // hide it - written = _console_write(console, buffer, *_length); + + size_t bytesLeft = *_length; + const char *str = (const char*)buffer; + while (bytesLeft > 0) { + char localBuffer[512]; + size_t chunkSize = min_c(sizeof(localBuffer), bytesLeft); + if (user_memcpy(localBuffer, str, chunkSize) < B_OK) { + status = B_BAD_ADDRESS; + break; + } + written += _console_write(console, localBuffer, chunkSize); + str += chunkSize; + bytesLeft -= chunkSize; + } update_cursor(console, console->x, console->y); mutex_unlock(&console->lock); - if (written >= 0) { + if (status == B_OK) *_length = written; - return B_OK; - } - return written; + return status; }