mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 10:00:03 -04:00
media: cec: Serialize exclusive follower delivery
cec_receive_notify() reads the exclusive follower pointer without the
adapter lock. Serialize the no-follower check and message delivery
against mode changes and release.
Fixes: 9881fe0ca1 ("[media] cec: add HDMI CEC framework (adapter)")
Cc: stable@vger.kernel.org
Signed-off-by: Ruoyu Wang <ruoyuw560@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
This commit is contained in:
@@ -2219,9 +2219,13 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
|
||||
* Unprocessed messages are aborted if userspace isn't doing
|
||||
* any processing either.
|
||||
*/
|
||||
mutex_lock(&adap->lock);
|
||||
if (!is_broadcast && !is_reply && !adap->follower_cnt &&
|
||||
!adap->cec_follower && msg->msg[1] != CEC_MSG_FEATURE_ABORT)
|
||||
!adap->cec_follower && msg->msg[1] != CEC_MSG_FEATURE_ABORT) {
|
||||
mutex_unlock(&adap->lock);
|
||||
return cec_feature_abort(adap, msg);
|
||||
}
|
||||
mutex_unlock(&adap->lock);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2234,10 +2238,12 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
|
||||
* Send to the exclusive follower if there is one, otherwise send
|
||||
* to all followers.
|
||||
*/
|
||||
mutex_lock(&adap->lock);
|
||||
if (adap->cec_follower)
|
||||
cec_queue_msg_fh(adap->cec_follower, msg);
|
||||
else
|
||||
cec_queue_msg_followers(adap, msg);
|
||||
mutex_unlock(&adap->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user