| From 4421fb9d995dc1d14849181fa0d4a0f1f49a4a4d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 23 Apr 2021 09:39:19 +0930 |
| Subject: soc: aspeed: fix a ternary sign expansion bug |
| |
| From: Dan Carpenter <dan.carpenter@oracle.com> |
| |
| [ Upstream commit 5ffa828534036348fa90fb3079ccc0972d202c4a ] |
| |
| The intent here was to return negative error codes but it actually |
| returns positive values. The problem is that type promotion with |
| ternary operations is quite complicated. |
| |
| "ret" is an int. "copied" is a u32. And the snoop_file_read() function |
| returns long. What happens is that "ret" is cast to u32 and becomes |
| positive then it's cast to long and it's still positive. |
| |
| Fix this by removing the ternary so that "ret" is type promoted directly |
| to long. |
| |
| Fixes: 3772e5da4454 ("drivers/misc: Aspeed LPC snoop output using misc chardev") |
| Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Signed-off-by: Joel Stanley <joel@jms.id.au> |
| Reviewed-by: Patrick Venture <venture@google.com> |
| Link: https://lore.kernel.org/r/YIE90PSXsMTa2Y8n@mwanda |
| Link: https://lore.kernel.org/r/20210423000919.1249474-1-joel@jms.id.au' |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/soc/aspeed/aspeed-lpc-snoop.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/aspeed-lpc-snoop.c |
| index 20acac6342ef..5828f94b8a7d 100644 |
| --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c |
| +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c |
| @@ -95,8 +95,10 @@ static ssize_t snoop_file_read(struct file *file, char __user *buffer, |
| return -EINTR; |
| } |
| ret = kfifo_to_user(&chan->fifo, buffer, count, &copied); |
| + if (ret) |
| + return ret; |
| |
| - return ret ? ret : copied; |
| + return copied; |
| } |
| |
| static __poll_t snoop_file_poll(struct file *file, |
| -- |
| 2.30.2 |
| |