Skip to content

Commit

Permalink
ixgbe: eliminate Smatch warnings in ixgbe_debugfs.c
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
joshua.a.hay@intel.com authored and Jeff Kirsher committed Dec 1, 2012
1 parent 1b4c44e commit 3288d73
Showing 1 changed file with 46 additions and 37 deletions.
83 changes: 46 additions & 37 deletions drivers/net/ethernet/intel/ixgbe/ixgbe_debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -79,22 +83,23 @@ 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)
return 0;
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;
Expand Down Expand Up @@ -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;
}

Expand All @@ -179,23 +188,23 @@ 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)
return 0;
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);
Expand Down

0 comments on commit 3288d73

Please sign in to comment.