提交 926ee00e 编写于 作者: D Dan Carpenter 提交者: Linus Torvalds

kfifo: fix ternary sign extension bugs

The intent with this code was to return negative error codes but instead
it returns positives.

The problem is how type promotion works with ternary operations.  These
functions return long, "ret" is an int and "copied" is a u32.  The
negative error code is first cast to u32 so it becomes a high positive and
then cast to long where it's still a positive.

We could fix this by declaring "ret" as a ssize_t but let's just get rid
of the ternaries instead.

Link: https://lkml.kernel.org/r/YIE+/cK1tBzSuQPU@mwanda
Fixes: 5bf2b193 ("kfifo: add example files to the kernel sample directory")
Signed-off-by: NDan Carpenter <dan.carpenter@oracle.com>
Cc: Stefani Seibold <stefani@seibold.net>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 ccf33ec4
......@@ -122,8 +122,10 @@ static ssize_t fifo_write(struct file *file, const char __user *buf,
ret = kfifo_from_user(&test, buf, count, &copied);
mutex_unlock(&write_lock);
if (ret)
return ret;
return ret ? ret : copied;
return copied;
}
static ssize_t fifo_read(struct file *file, char __user *buf,
......@@ -138,8 +140,10 @@ static ssize_t fifo_read(struct file *file, char __user *buf,
ret = kfifo_to_user(&test, buf, count, &copied);
mutex_unlock(&read_lock);
if (ret)
return ret;
return ret ? ret : copied;
return copied;
}
static const struct proc_ops fifo_proc_ops = {
......
......@@ -115,8 +115,10 @@ static ssize_t fifo_write(struct file *file, const char __user *buf,
ret = kfifo_from_user(&test, buf, count, &copied);
mutex_unlock(&write_lock);
if (ret)
return ret;
return ret ? ret : copied;
return copied;
}
static ssize_t fifo_read(struct file *file, char __user *buf,
......@@ -131,8 +133,10 @@ static ssize_t fifo_read(struct file *file, char __user *buf,
ret = kfifo_to_user(&test, buf, count, &copied);
mutex_unlock(&read_lock);
if (ret)
return ret;
return ret ? ret : copied;
return copied;
}
static const struct proc_ops fifo_proc_ops = {
......
......@@ -129,8 +129,10 @@ static ssize_t fifo_write(struct file *file, const char __user *buf,
ret = kfifo_from_user(&test, buf, count, &copied);
mutex_unlock(&write_lock);
if (ret)
return ret;
return ret ? ret : copied;
return copied;
}
static ssize_t fifo_read(struct file *file, char __user *buf,
......@@ -145,8 +147,10 @@ static ssize_t fifo_read(struct file *file, char __user *buf,
ret = kfifo_to_user(&test, buf, count, &copied);
mutex_unlock(&read_lock);
if (ret)
return ret;
return ret ? ret : copied;
return copied;
}
static const struct proc_ops fifo_proc_ops = {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册