]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
kfifo: fix ternary sign extension bugs
authorDan Carpenter <dan.carpenter@oracle.com>
Fri, 30 Apr 2021 05:54:15 +0000 (22:54 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 May 2021 07:44:32 +0000 (09:44 +0200)
[ Upstream commit 926ee00ea24320052b46745ef4b00d91c05bd03d ]

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: 5bf2b19320ec ("kfifo: add example files to the kernel sample directory")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Cc: Stefani Seibold <stefani@seibold.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
samples/kfifo/bytestream-example.c
samples/kfifo/inttype-example.c
samples/kfifo/record-example.c

index 9ca3e4400c98f3a799f0cd112fb3e8ad5fb78833..ecae2139274f818d65ada3a620984f3ce76bd9d5 100644 (file)
@@ -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 file_operations fifo_fops = {
index 6cdeb72f83f171714f89d6548465700cdfb2b73b..7b4489e7a9a542f0ae4b02ca49e3a7ad2186941b 100644 (file)
@@ -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 file_operations fifo_fops = {
index 79ae8bb04120d56da146b8325bdd95978653788d..eafe0838997d4c3e5a8742373b822bd257d86c5b 100644 (file)
@@ -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 file_operations fifo_fops = {