From 3ef78bb6207602007687943d5795cb6891ff19a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E7=BB=B4=E6=A0=8B?= Date: Tue, 9 Apr 2024 02:43:30 +0000 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3hilog=5Fcover=5Fold=5Flog?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AD=98=E5=9C=A8=E6=AD=BB=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 曾维栋 --- drivers/staging/hilog/hilog.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/drivers/staging/hilog/hilog.c b/drivers/staging/hilog/hilog.c index af490cdaa291..0198b5847470 100644 --- a/drivers/staging/hilog/hilog.c +++ b/drivers/staging/hilog/hilog.c @@ -85,24 +85,28 @@ static inline unsigned char *hilog_buffer_head(void) return hilog_dev.buffer + hilog_dev.hdr_off; } -static void hilog_buffer_inc(size_t sz) +static int hilog_buffer_inc(size_t sz) { if (hilog_dev.size + sz <= HILOG_BUFFER) { hilog_dev.size += sz; hilog_dev.wr_off += sz; hilog_dev.wr_off %= HILOG_BUFFER; hilog_dev.count++; + return 0; } + return -1; } -static void hilog_buffer_dec(size_t sz) +static int hilog_buffer_dec(size_t sz) { if (hilog_dev.size >= sz) { hilog_dev.size -= sz; hilog_dev.hdr_off += sz; hilog_dev.hdr_off %= HILOG_BUFFER; hilog_dev.count--; + return 0; } + return -1; } static int hilog_read_ring_buff(unsigned char __user *buffer, size_t buf_len) @@ -166,7 +170,11 @@ static ssize_t hilog_read(struct file *file, goto out; } - hilog_buffer_dec(sizeof(header)); + if (hilog_buffer_dec(sizeof(header))) { + retval = -EINVAL; + goto out; + } + retval = copy_to_user((unsigned char *)user_buf, (unsigned char *)&header, min(count, sizeof(header))); @@ -184,7 +192,11 @@ static ssize_t hilog_read(struct file *file, goto out; } - hilog_buffer_dec(header.len); + if (hilog_buffer_dec(header.len)) { + retval = -EINVAL; + goto out; + } + retval = header.len + sizeof(header); out: if (retval == -ENOMEM) { @@ -282,7 +294,8 @@ static void hilog_cover_old_log(size_t buf_len) drop_log_lines++; is_this_time_full = true; is_last_time_full = true; - hilog_buffer_dec(sizeof(header) + header.len); + if (hilog_buffer_dec(sizeof(header) + header.len)) + return; } if (is_last_time_full && !is_this_time_full) { /* so we can only print one log if hilog ring buffer is full in a short time */ @@ -309,7 +322,11 @@ int hilog_write_internal(const char __user *buffer, size_t buf_len) retval = -ENODATA; goto out; } - hilog_buffer_inc(sizeof(header)); + + if (hilog_buffer_inc(sizeof(header))) { + retval = -EINVAL; + goto out; + } retval = hilog_write_ring_buffer((unsigned char *)(buffer), header.len); if (retval) { @@ -317,7 +334,10 @@ int hilog_write_internal(const char __user *buffer, size_t buf_len) goto out; } - hilog_buffer_inc(header.len); + if (hilog_buffer_inc(header.len)) { + retval = -EINVAL; + goto out; + } retval = header.len; -- Gitee