Skip to content

Commit

Permalink
firewire: prevent userspace from accessing shut down devices
Browse files Browse the repository at this point in the history
If userspace ignores the POLLERR bit from poll(), and only attempts to
read() the device when POLLIN is set, it can still make ioctl() calls on
a device that has been removed from the system.  The node_id and
generation returned by GET_INFO will be outdated, but INITIATE_BUS_RESET
would still cause a bus reset, and GET_CYCLE_TIMER will return data.
And if you guess the correct generation to use, you can send requests to
a different device on the bus, and get responses back.

This patch prevents open, ioctl, compat_ioctl, and mmap against shutdown
devices.

Signed-off-by: Jay Fenlason <fenlason@redhat.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
  • Loading branch information
Jay Fenlason authored and Stefan Richter committed May 20, 2008
1 parent 93c596f commit 551f4cb
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions drivers/firewire/fw-cdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,11 @@ static int fw_device_op_open(struct inode *inode, struct file *file)
if (device == NULL)
return -ENODEV;

if (fw_device_is_shutdown(device)) {
fw_device_put(device);
return -ENODEV;
}

client = kzalloc(sizeof(*client), GFP_KERNEL);
if (client == NULL) {
fw_device_put(device);
Expand Down Expand Up @@ -901,6 +906,9 @@ fw_device_op_ioctl(struct file *file,
{
struct client *client = file->private_data;

if (fw_device_is_shutdown(client->device))
return -ENODEV;

return dispatch_ioctl(client, cmd, (void __user *) arg);
}

Expand All @@ -911,6 +919,9 @@ fw_device_op_compat_ioctl(struct file *file,
{
struct client *client = file->private_data;

if (fw_device_is_shutdown(client->device))
return -ENODEV;

return dispatch_ioctl(client, cmd, compat_ptr(arg));
}
#endif
Expand All @@ -922,6 +933,9 @@ static int fw_device_op_mmap(struct file *file, struct vm_area_struct *vma)
unsigned long size;
int page_count, retval;

if (fw_device_is_shutdown(client->device))
return -ENODEV;

/* FIXME: We could support multiple buffers, but we don't. */
if (client->buffer.pages != NULL)
return -EBUSY;
Expand Down

0 comments on commit 551f4cb

Please sign in to comment.