aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire/fw-cdev.c
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2008-02-20 15:10:06 -0500
committerStefan Richter <stefanr@s5r6.in-berlin.de>2008-02-21 13:05:56 -0500
commitfae603121428ba83b7343c88e68a7144525ab3eb (patch)
tree41283a905b089cee26103187e54935abffb88207 /drivers/firewire/fw-cdev.c
parent09d7328e62e3b4cefe4bf3eeeeacb54f62a7ae5c (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.c9
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);