]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ixgbe: eliminate Smatch warnings in ixgbe_debugfs.c
authorjoshua.a.hay@intel.com <joshua.a.hay@intel.com>
Wed, 28 Nov 2012 05:49:20 +0000 (05:49 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 1 Dec 2012 10:29:19 +0000 (02:29 -0800)
This patch replaces calls to copy_to_user, copy_from_user, and the associated
logic, with calls to simple_read_from_buffer and simple_write_to_buffer
respectively.  This was done to eliminate warnings generated by the Smatch
static analysis tool.

v2- Fix return values based community feedback

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
CC: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Josh Hay <joshua.a.hay@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_debugfs.c

index efaf9a73cc79a534edd877dd724bace80ba3cf5b..50aa546b8c7a589100be6bd88eac590adf314d98 100644 (file)
@@ -47,23 +47,27 @@ static ssize_t ixgbe_dbg_reg_ops_read(struct file *filp, char __user *buffer,
                                    size_t count, loff_t *ppos)
 {
        struct ixgbe_adapter *adapter = filp->private_data;
-       char buf[256];
-       int bytes_not_copied;
+       char *buf;
        int len;
 
        /* don't allow partial reads */
        if (*ppos != 0)
                return 0;
 
-       len = snprintf(buf, sizeof(buf), "%s: %s\n",
-                      adapter->netdev->name, ixgbe_dbg_reg_ops_buf);
-       if (count < len)
+       buf = kasprintf(GFP_KERNEL, "%s: %s\n",
+                       adapter->netdev->name,
+                       ixgbe_dbg_reg_ops_buf);
+       if (!buf)
+               return -ENOMEM;
+
+       if (count < strlen(buf)) {
+               kfree(buf);
                return -ENOSPC;
-       bytes_not_copied = copy_to_user(buffer, buf, len);
-       if (bytes_not_copied < 0)
-               return bytes_not_copied;
+       }
+
+       len = simple_read_from_buffer(buffer, count, ppos, buf, strlen(buf));
 
-       *ppos = len;
+       kfree(buf);
        return len;
 }
 
@@ -79,7 +83,7 @@ static ssize_t ixgbe_dbg_reg_ops_write(struct file *filp,
                                     size_t count, loff_t *ppos)
 {
        struct ixgbe_adapter *adapter = filp->private_data;
-       int bytes_not_copied;
+       int len;
 
        /* don't allow partial writes */
        if (*ppos != 0)
@@ -87,14 +91,15 @@ static ssize_t ixgbe_dbg_reg_ops_write(struct file *filp,
        if (count >= sizeof(ixgbe_dbg_reg_ops_buf))
                return -ENOSPC;
 
-       bytes_not_copied = copy_from_user(ixgbe_dbg_reg_ops_buf, buffer, count);
-       if (bytes_not_copied < 0)
-               return bytes_not_copied;
-       else if (bytes_not_copied < count)
-               count -= bytes_not_copied;
-       else
-               return -ENOSPC;
-       ixgbe_dbg_reg_ops_buf[count] = '\0';
+       len = simple_write_to_buffer(ixgbe_dbg_reg_ops_buf,
+                                    sizeof(ixgbe_dbg_reg_ops_buf)-1,
+                                    ppos,
+                                    buffer,
+                                    count);
+       if (len < 0)
+               return len;
+
+       ixgbe_dbg_reg_ops_buf[len] = '\0';
 
        if (strncmp(ixgbe_dbg_reg_ops_buf, "write", 5) == 0) {
                u32 reg, value;
@@ -147,23 +152,27 @@ static ssize_t ixgbe_dbg_netdev_ops_read(struct file *filp,
                                         size_t count, loff_t *ppos)
 {
        struct ixgbe_adapter *adapter = filp->private_data;
-       char buf[256];
-       int bytes_not_copied;
+       char *buf;
        int len;
 
        /* don't allow partial reads */
        if (*ppos != 0)
                return 0;
 
-       len = snprintf(buf, sizeof(buf), "%s: %s\n",
-                      adapter->netdev->name, ixgbe_dbg_netdev_ops_buf);
-       if (count < len)
+       buf = kasprintf(GFP_KERNEL, "%s: %s\n",
+                       adapter->netdev->name,
+                       ixgbe_dbg_netdev_ops_buf);
+       if (!buf)
+               return -ENOMEM;
+
+       if (count < strlen(buf)) {
+               kfree(buf);
                return -ENOSPC;
-       bytes_not_copied = copy_to_user(buffer, buf, len);
-       if (bytes_not_copied < 0)
-               return bytes_not_copied;
+       }
+
+       len = simple_read_from_buffer(buffer, count, ppos, buf, strlen(buf));
 
-       *ppos = len;
+       kfree(buf);
        return len;
 }
 
@@ -179,7 +188,7 @@ static ssize_t ixgbe_dbg_netdev_ops_write(struct file *filp,
                                          size_t count, loff_t *ppos)
 {
        struct ixgbe_adapter *adapter = filp->private_data;
-       int bytes_not_copied;
+       int len;
 
        /* don't allow partial writes */
        if (*ppos != 0)
@@ -187,15 +196,15 @@ static ssize_t ixgbe_dbg_netdev_ops_write(struct file *filp,
        if (count >= sizeof(ixgbe_dbg_netdev_ops_buf))
                return -ENOSPC;
 
-       bytes_not_copied = copy_from_user(ixgbe_dbg_netdev_ops_buf,
-                                         buffer, count);
-       if (bytes_not_copied < 0)
-               return bytes_not_copied;
-       else if (bytes_not_copied < count)
-               count -= bytes_not_copied;
-       else
-               return -ENOSPC;
-       ixgbe_dbg_netdev_ops_buf[count] = '\0';
+       len = simple_write_to_buffer(ixgbe_dbg_netdev_ops_buf,
+                                    sizeof(ixgbe_dbg_netdev_ops_buf)-1,
+                                    ppos,
+                                    buffer,
+                                    count);
+       if (len < 0)
+               return len;
+
+       ixgbe_dbg_netdev_ops_buf[len] = '\0';
 
        if (strncmp(ixgbe_dbg_netdev_ops_buf, "tx_timeout", 10) == 0) {
                adapter->netdev->netdev_ops->ndo_tx_timeout(adapter->netdev);