summaryrefslogtreecommitdiffstats
path: root/net/nfc/core.c
diff options
context:
space:
mode:
authorEric Lapuyade <eric.lapuyade@intel.com>2012-05-03 16:21:58 +0200
committerJohn W. Linville <linville@tuxdriver.com>2012-07-09 16:42:09 -0400
commit8668fdd6efb3a75e0d58a3287a47fa7e60a68a73 (patch)
tree27b4846b8243014391833f62937e4a2c20718a18 /net/nfc/core.c
parenta070c8591a503ec65e2c84ebaf3454e5cd76e3fe (diff)
downloadlinux-8668fdd6efb3a75e0d58a3287a47fa7e60a68a73.tar.bz2
NFC: Core must test the device polling state inside the device lock
There can ever be only one call to nfc_targets_found() after polling has been engaged. This could be from a target discovered event from the driver, or from an error handler to notify poll will never complete. Signed-off-by: Eric Lapuyade <eric.lapuyade@intel.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'net/nfc/core.c')
-rw-r--r--net/nfc/core.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/net/nfc/core.c b/net/nfc/core.c
index 32f28326b623..94ccf07374a5 100644
--- a/net/nfc/core.c
+++ b/net/nfc/core.c
@@ -571,13 +571,18 @@ int nfc_targets_found(struct nfc_dev *dev,
pr_debug("dev_name=%s n_targets=%d\n", dev_name(&dev->dev), n_targets);
- dev->polling = false;
-
for (i = 0; i < n_targets; i++)
targets[i].idx = dev->target_next_idx++;
device_lock(&dev->dev);
+ if (dev->polling == false) {
+ device_unlock(&dev->dev);
+ return 0;
+ }
+
+ dev->polling = false;
+
dev->targets_generation++;
kfree(dev->targets);