diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2008-02-20 15:10:06 -0500 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2008-02-21 13:05:56 -0500 |
commit | fae603121428ba83b7343c88e68a7144525ab3eb (patch) | |
tree | 41283a905b089cee26103187e54935abffb88207 /drivers/firewire/fw-cdev.c | |
parent | 09d7328e62e3b4cefe4bf3eeeeacb54f62a7ae5c (diff) |
firewire: fix NULL pointer deref. and resource leak
By supplying ioctl()s in the wrong order, a userspace client was able to
trigger NULL pointer dereferences. Furthermore, by calling
ioctl_create_iso_context more than once, new contexts could be created
without ever freeing the previously created contexts.
Thanks to Anders Blomdell for the report.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire/fw-cdev.c')
-rw-r--r-- | drivers/firewire/fw-cdev.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/firewire/fw-cdev.c b/drivers/firewire/fw-cdev.c index 44ccee26c368..46bc197a047f 100644 --- a/drivers/firewire/fw-cdev.c +++ b/drivers/firewire/fw-cdev.c | |||
@@ -646,6 +646,10 @@ static int ioctl_create_iso_context(struct client *client, void *buffer) | |||
646 | struct fw_cdev_create_iso_context *request = buffer; | 646 | struct fw_cdev_create_iso_context *request = buffer; |
647 | struct fw_iso_context *context; | 647 | struct fw_iso_context *context; |
648 | 648 | ||
649 | /* We only support one context at this time. */ | ||
650 | if (client->iso_context != NULL) | ||
651 | return -EBUSY; | ||
652 | |||
649 | if (request->channel > 63) | 653 | if (request->channel > 63) |
650 | return -EINVAL; | 654 | return -EINVAL; |
651 | 655 | ||
@@ -792,8 +796,9 @@ static int ioctl_start_iso(struct client *client, void *buffer) | |||
792 | { | 796 | { |
793 | struct fw_cdev_start_iso *request = buffer; | 797 | struct fw_cdev_start_iso *request = buffer; |
794 | 798 | ||
795 | if (request->handle != 0) | 799 | if (client->iso_context == NULL || request->handle != 0) |
796 | return -EINVAL; | 800 | return -EINVAL; |
801 | |||
797 | if (client->iso_context->type == FW_ISO_CONTEXT_RECEIVE) { | 802 | if (client->iso_context->type == FW_ISO_CONTEXT_RECEIVE) { |
798 | if (request->tags == 0 || request->tags > 15) | 803 | if (request->tags == 0 || request->tags > 15) |
799 | return -EINVAL; | 804 | return -EINVAL; |
@@ -810,7 +815,7 @@ static int ioctl_stop_iso(struct client *client, void *buffer) | |||
810 | { | 815 | { |
811 | struct fw_cdev_stop_iso *request = buffer; | 816 | struct fw_cdev_stop_iso *request = buffer; |
812 | 817 | ||
813 | if (request->handle != 0) | 818 | if (client->iso_context == NULL || request->handle != 0) |
814 | return -EINVAL; | 819 | return -EINVAL; |
815 | 820 | ||
816 | return fw_iso_context_stop(client->iso_context); | 821 | return fw_iso_context_stop(client->iso_context); |