efivarfs: Fix return value of efivarfs_file_write()
authorMatt Fleming <matt.fleming@intel.com>
Fri, 26 Oct 2012 11:18:53 +0000 (12:18 +0100)
committerMatt Fleming <matt.fleming@intel.com>
Tue, 30 Oct 2012 10:39:28 +0000 (10:39 +0000)
We're stuffing a variable of type size_t (unsigned) into a ssize_t
(signed) which, even though both types should be the same number of
bits, it's just asking for sign issues to be introduced.

Cc: Jeremy Kerr <jeremy.kerr@canonical.com>
Reported-by: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
drivers/firmware/efivars.c

index 58cec62..9ac9340 100644 (file)
@@ -694,6 +694,7 @@ static ssize_t efivarfs_file_write(struct file *file,
        struct inode *inode = file->f_mapping->host;
        unsigned long datasize = count - sizeof(attributes);
        unsigned long newdatasize;
+       ssize_t bytes = 0;
 
        if (count < sizeof(attributes))
                return -EINVAL;
@@ -706,22 +707,22 @@ static ssize_t efivarfs_file_write(struct file *file,
        efivars = var->efivars;
 
        if (copy_from_user(&attributes, userbuf, sizeof(attributes))) {
-               count = -EFAULT;
+               bytes = -EFAULT;
                goto out;
        }
 
        if (attributes & ~(EFI_VARIABLE_MASK)) {
-               count = -EINVAL;
+               bytes = -EINVAL;
                goto out;
        }
 
        if (copy_from_user(data, userbuf + sizeof(attributes), datasize)) {
-               count = -EFAULT;
+               bytes = -EFAULT;
                goto out;
        }
 
        if (validate_var(&var->var, data, datasize) == false) {
-               count = -EINVAL;
+               bytes = -EINVAL;
                goto out;
        }
 
@@ -744,6 +745,8 @@ static ssize_t efivarfs_file_write(struct file *file,
                return efi_status_to_err(status);
        }
 
+       bytes = count;
+
        /*
         * Writing to the variable may have caused a change in size (which
         * could either be an append or an overwrite), or the variable to be
@@ -778,7 +781,7 @@ static ssize_t efivarfs_file_write(struct file *file,
 out:
        kfree(data);
 
-       return count;
+       return bytes;
 }
 
 static ssize_t efivarfs_file_read(struct file *file, char __user *userbuf,