linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org,
	Dave Stevenson <dave.stevenson@raspberrypi.org>,
	Sakari Ailus <sakari.ailus@linux.intel.com>,
	Hans Verkuil <hans.verkuil@cisco.com>,
	Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Subject: [PATCH 4.14 50/62] media: v4l: event: Add subscription to list before calling "add" operation
Date: Mon, 26 Nov 2018 11:51:31 +0100	[thread overview]
Message-ID: <20181126105054.498319013@linuxfoundation.org> (raw)
In-Reply-To: <20181126105050.592727680@linuxfoundation.org>

4.14-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Sakari Ailus <sakari.ailus@linux.intel.com>

commit 92539d3eda2c090b382699bbb896d4b54e9bdece upstream.

Patch ad608fbcf166 changed how events were subscribed to address an issue
elsewhere. As a side effect of that change, the "add" callback was called
before the event subscription was added to the list of subscribed events,
causing the first event queued by the add callback (and possibly other
events arriving soon afterwards) to be lost.

Fix this by adding the subscription to the list before calling the "add"
callback, and clean up afterwards if that fails.

Fixes: ad608fbcf166 ("media: v4l: event: Prevent freeing event subscriptions while accessed")

Reported-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Tested-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
Reviewed-by: Hans Verkuil <hans.verkuil@cisco.com>
Tested-by: Hans Verkuil <hans.verkuil@cisco.com>
Cc: stable@vger.kernel.org (for 4.14 and up)
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 drivers/media/v4l2-core/v4l2-event.c |   43 +++++++++++++++++++----------------
 1 file changed, 24 insertions(+), 19 deletions(-)

--- a/drivers/media/v4l2-core/v4l2-event.c
+++ b/drivers/media/v4l2-core/v4l2-event.c
@@ -193,6 +193,22 @@ int v4l2_event_pending(struct v4l2_fh *f
 }
 EXPORT_SYMBOL_GPL(v4l2_event_pending);
 
+static void __v4l2_event_unsubscribe(struct v4l2_subscribed_event *sev)
+{
+	struct v4l2_fh *fh = sev->fh;
+	unsigned int i;
+
+	lockdep_assert_held(&fh->subscribe_lock);
+	assert_spin_locked(&fh->vdev->fh_lock);
+
+	/* Remove any pending events for this subscription */
+	for (i = 0; i < sev->in_use; i++) {
+		list_del(&sev->events[sev_pos(sev, i)].list);
+		fh->navailable--;
+	}
+	list_del(&sev->list);
+}
+
 int v4l2_event_subscribe(struct v4l2_fh *fh,
 			 const struct v4l2_event_subscription *sub, unsigned elems,
 			 const struct v4l2_subscribed_event_ops *ops)
@@ -225,27 +241,23 @@ int v4l2_event_subscribe(struct v4l2_fh
 
 	spin_lock_irqsave(&fh->vdev->fh_lock, flags);
 	found_ev = v4l2_event_subscribed(fh, sub->type, sub->id);
+	if (!found_ev)
+		list_add(&sev->list, &fh->subscribed);
 	spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
 
 	if (found_ev) {
 		/* Already listening */
 		kvfree(sev);
-		goto out_unlock;
-	}
-
-	if (sev->ops && sev->ops->add) {
+	} else if (sev->ops && sev->ops->add) {
 		ret = sev->ops->add(sev, elems);
 		if (ret) {
+			spin_lock_irqsave(&fh->vdev->fh_lock, flags);
+			__v4l2_event_unsubscribe(sev);
+			spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
 			kvfree(sev);
-			goto out_unlock;
 		}
 	}
 
-	spin_lock_irqsave(&fh->vdev->fh_lock, flags);
-	list_add(&sev->list, &fh->subscribed);
-	spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
-
-out_unlock:
 	mutex_unlock(&fh->subscribe_lock);
 
 	return ret;
@@ -280,7 +292,6 @@ int v4l2_event_unsubscribe(struct v4l2_f
 {
 	struct v4l2_subscribed_event *sev;
 	unsigned long flags;
-	int i;
 
 	if (sub->type == V4L2_EVENT_ALL) {
 		v4l2_event_unsubscribe_all(fh);
@@ -292,14 +303,8 @@ int v4l2_event_unsubscribe(struct v4l2_f
 	spin_lock_irqsave(&fh->vdev->fh_lock, flags);
 
 	sev = v4l2_event_subscribed(fh, sub->type, sub->id);
-	if (sev != NULL) {
-		/* Remove any pending events for this subscription */
-		for (i = 0; i < sev->in_use; i++) {
-			list_del(&sev->events[sev_pos(sev, i)].list);
-			fh->navailable--;
-		}
-		list_del(&sev->list);
-	}
+	if (sev != NULL)
+		__v4l2_event_unsubscribe(sev);
 
 	spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
 



  parent reply	other threads:[~2018-11-26 11:00 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-26 10:50 [PATCH 4.14 00/62] 4.14.84-stable review Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 01/62] cifs: dont dereference smb_file_target before null check Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 02/62] cifs: fix return value for cifs_listxattr Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 03/62] arm64: kprobe: make page to RO mode when allocate it Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 04/62] nvme-pci: fix conflicting p2p resource adds Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 05/62] ixgbe: fix MAC anti-spoofing filter after VFLR Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 06/62] reiserfs: propagate errors from fill_with_dentries() properly Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 07/62] hfs: prevent btree data loss on root split Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 08/62] hfsplus: " Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 09/62] um: Give start_idle_thread() a return code Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 10/62] drm/edid: Add 6 bpc quirk for BOE panel Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 11/62] platform/x86: intel_telemetry: report debugfs failure Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 12/62] clk: fixed-rate: fix of_node_get-put imbalance Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 13/62] perf symbols: Set PLT entry/header sizes properly on Sparc Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 14/62] fs/exofs: fix potential memory leak in mount option parsing Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 15/62] clk: samsung: exynos5420: Enable PERIS clocks for suspend Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 16/62] apparmor: Fix uninitialized value in aa_split_fqname Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 17/62] x86/earlyprintk: Add a force option for pciserial device Greg Kroah-Hartman
2018-11-26 10:50 ` [PATCH 4.14 18/62] platform/x86: acerhdf: Add BIOS entry for Gateway LT31 v1.3307 Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 19/62] arm64: percpu: Initialize ret in the default case Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 20/62] s390/vdso: add missing FORCE to build targets Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 21/62] netfilter: ipset: list:set: Decrease refcount synchronously on deletion and replace Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 22/62] netfilter: ipset: actually allow allowable CIDR 0 in hash:net,port,net Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 23/62] s390/mm: Fix ERROR: "__node_distance" undefined! Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 24/62] netfilter: ipset: Correct rcu_dereference() call in ip_set_put_comment() Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 25/62] netfilter: xt_IDLETIMER: add sysfs filename checking routine Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 26/62] s390/qeth: fix HiperSockets sniffer Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 27/62] hwmon: (ibmpowernv) Remove bogus __init annotations Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 28/62] Revert "drm/exynos/decon5433: implement frame counter" Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 29/62] clk: fixed-factor: fix of_node_get-put imbalance Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 30/62] lib/raid6: Fix arm64 test build Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 31/62] s390/perf: Change CPUM_CF return code in event init function Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 32/62] i2c: omap: Enable for ARCH_K3 Greg Kroah-Hartman
2018-11-26 13:24   ` Vignesh R
2018-11-26 15:01     ` Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 33/62] sched/core: Take the hotplug lock in sched_init_smp() Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 34/62] perf tools: Fix undefined symbol scnprintf in libperf-jvmti.so Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 35/62] i40e: restore NETIF_F_GSO_IPXIP[46] to netdev features Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 36/62] qed: Fix memory/entry leak in qed_init_sp_request() Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 37/62] qed: Fix blocking/unlimited SPQ entries leak Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 38/62] qed: Fix potential memory corruption Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 39/62] net: stmmac: Fix RX packet size > 8191 Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 40/62] zram: close udev startup race condition as default groups Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 41/62] SUNRPC: drop pointless static qualifier in xdr_get_next_encode_buffer() Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 42/62] ACPI / watchdog: Prefer iTCO_wdt always when WDAT table uses RTC SRAM Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 43/62] perf machine: Add machine__is() to identify machine arch Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 44/62] perf tools: Fix kernel_start for PTI on x86 Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 45/62] perf machine: Add nr_cpus_avail() Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 46/62] perf machine: Workaround missing maps for x86 PTI entry trampolines Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 47/62] perf test code-reading: Fix perf_env setup for " Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 48/62] x86/mm: Move LDT remap out of KASLR region on 5-level paging Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 49/62] x86/ldt: Unmap PTEs for the slot before freeing LDT pages Greg Kroah-Hartman
2018-11-26 10:51 ` Greg Kroah-Hartman [this message]
2018-11-26 10:51 ` [PATCH 4.14 51/62] MIPS: OCTEON: cavium_octeon_defconfig: re-enable OCTEON USB driver Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 52/62] uio: Fix an Oops on load Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 53/62] usb: cdc-acm: add entry for Hiro (Conexant) modem Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 54/62] USB: quirks: Add no-lpm quirk for Raydium touchscreens Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 55/62] usb: quirks: Add delay-init quirk for Corsair K70 LUX RGB Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 56/62] misc: atmel-ssc: Fix section annotation on atmel_ssc_get_driver_data Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 57/62] USB: misc: appledisplay: add 20" Apple Cinema Display Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 58/62] mtd: rawnand: atmel: fix OF child-node lookup Greg Kroah-Hartman
2018-11-26 14:16   ` Naresh Kamboju
2018-11-26 14:59     ` Greg Kroah-Hartman
2018-11-26 15:08     ` Boris Brezillon
2018-11-26 15:14       ` Greg Kroah-Hartman
2018-11-26 15:48         ` Johan Hovold
2018-11-29  8:08           ` Greg Kroah-Hartman
2018-11-26 15:16       ` Sasha Levin
2018-11-26 16:39         ` Matt Hart
2018-11-26 17:18           ` Sasha Levin
2018-11-26 10:51 ` [PATCH 4.14 59/62] drivers/misc/sgi-gru: fix Spectre v1 vulnerability Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 60/62] ACPI / platform: Add SMB0001 HID to forbidden_id_list Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 61/62] HID: uhid: forbid UHID_CREATE under KERNEL_DS or elevated privileges Greg Kroah-Hartman
2018-11-26 10:51 ` [PATCH 4.14 62/62] libceph: fall back to sendmsg for slab pages Greg Kroah-Hartman
2018-11-26 17:11 ` [PATCH 4.14 00/62] 4.14.84-stable review kernelci.org bot
2018-11-26 23:50 ` Guenter Roeck
2018-11-27  0:04 ` shuah
2018-11-27  9:14 ` Jon Hunter
2018-11-27 14:38   ` Greg Kroah-Hartman
2018-11-27 13:01 ` Naresh Kamboju

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181126105054.498319013@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=dave.stevenson@raspberrypi.org \
    --cc=hans.verkuil@cisco.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mchehab+samsung@kernel.org \
    --cc=sakari.ailus@linux.intel.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).