Prev: [PATCH 6/8] firewire: expose extended tcode of incoming lock requests to (userspace) drivers
Next: [PATCH 4/8] firewire: cdev: count references of cards during inbound transactions
From: Stefan Richter on 20 Jun 2010 17:00 Date: Mon, 14 Jun 2010 11:46:25 +0200 From: Clemens Ladisch <clemens(a)ladisch.de> Protect the client's iso context pointer against a race that can happen when more than one creation call is executed at the same time. Signed-off-by: Clemens Ladisch <clemens(a)ladisch.de> Signed-off-by: Stefan Richter <stefanr(a)s5r6.in-berlin.de> --- drivers/firewire/core-cdev.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) Index: b/drivers/firewire/core-cdev.c =================================================================== --- a/drivers/firewire/core-cdev.c +++ b/drivers/firewire/core-cdev.c @@ -865,10 +865,6 @@ static int ioctl_create_iso_context(stru struct fw_cdev_create_iso_context *a = &arg->create_iso_context; struct fw_iso_context *context; - /* We only support one context at this time. */ - if (client->iso_context != NULL) - return -EBUSY; - if (a->channel > 63) return -EINVAL; @@ -893,10 +889,17 @@ static int ioctl_create_iso_context(stru if (IS_ERR(context)) return PTR_ERR(context); + /* We only support one context at this time. */ + spin_lock_irq(&client->lock); + if (client->iso_context != NULL) { + spin_unlock_irq(&client->lock); + fw_iso_context_destroy(context); + return -EBUSY; + } client->iso_closure = a->closure; client->iso_context = context; + spin_unlock_irq(&client->lock); - /* We only support one context at this time. */ a->handle = 0; return 0; -- Stefan Richter -=====-==-=- -==- =-=-- http://arcgraph.de/sr/ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |