kernel: printk: fix log buffer overflow
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
#include <kernel/printk.h>
|
||||
#include <kernel/locks.h>
|
||||
#include <kernel/console.h>
|
||||
#include <kernel/libc/stdio.h>
|
||||
#include <kernel/locks.h>
|
||||
#include <kernel/printk.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#define LOG_BUFFER_SIZE 0x40000
|
||||
@@ -23,16 +23,21 @@ static void flush_log_buffer(void)
|
||||
{
|
||||
/*
|
||||
if (!early_console) {
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
console_write(early_console, log_buffer + log_buffer_readp, log_buffer_writep - log_buffer_readp);
|
||||
console_write(early_console, log_buffer + log_buffer_readp,
|
||||
log_buffer_writep - log_buffer_readp);
|
||||
*/
|
||||
|
||||
unsigned long flags;
|
||||
struct queue *consoles = get_consoles(&flags);
|
||||
queue_foreach(struct console, con, consoles, c_list) {
|
||||
console_write(con, log_buffer + log_buffer_readp, log_buffer_writep - log_buffer_readp);
|
||||
queue_foreach(struct console, con, consoles, c_list)
|
||||
{
|
||||
console_write(
|
||||
con,
|
||||
log_buffer + log_buffer_readp,
|
||||
log_buffer_writep - log_buffer_readp);
|
||||
}
|
||||
|
||||
put_consoles(consoles, flags);
|
||||
@@ -61,20 +66,33 @@ void early_printk_init(struct console *con)
|
||||
early_console = con;
|
||||
}
|
||||
|
||||
static void print_msg_direct(const char *s, size_t len)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct queue *consoles = get_consoles(&flags);
|
||||
queue_foreach(struct console, con, consoles, c_list)
|
||||
{
|
||||
console_write(con, s, len);
|
||||
}
|
||||
|
||||
put_consoles(consoles, flags);
|
||||
}
|
||||
|
||||
int printk(const char *format, ...)
|
||||
{
|
||||
char msg[LOG_MSG_SIZE];
|
||||
|
||||
va_list arg;
|
||||
va_start(arg, format);
|
||||
int len = vsnprintf(msg, sizeof msg - 1, format, arg);
|
||||
int len = vsnprintf(msg, sizeof msg - 1, format, arg);
|
||||
va_end(arg);
|
||||
|
||||
msg[len] = '\n';
|
||||
msg[len + 1] = '\0';
|
||||
|
||||
if (log_buffer_writep == LOG_BUFFER_SIZE - 1) {
|
||||
console_write(early_console, msg, len + 1);
|
||||
print_msg_direct(msg, len + 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned long flags;
|
||||
@@ -84,5 +102,5 @@ int printk(const char *format, ...)
|
||||
|
||||
flush_log_buffer();
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user