]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: cec: core: avoid recursive cec_claim_log_addrs
authorHans Verkuil <hverkuil-cisco@xs4all.nl>
Thu, 22 Feb 2024 16:17:33 +0000 (16:17 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 16 Jun 2024 11:39:45 +0000 (13:39 +0200)
[ Upstream commit 47c82aac10a6954d68f29f10d9758d016e8e5af1 ]

Keep track if cec_claim_log_addrs() is running, and return -EBUSY
if it is when calling CEC_ADAP_S_LOG_ADDRS.

This prevents a case where cec_claim_log_addrs() could be called
while it was still in progress.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Reported-by: Yang, Chenyuan <cy54@illinois.edu>
Closes: https://lore.kernel.org/linux-media/PH7PR11MB57688E64ADE4FE82E658D86DA09EA@PH7PR11MB5768.namprd11.prod.outlook.com/
Fixes: ca684386e6e2 ("[media] cec: add HDMI CEC framework (api)")
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/media/cec/core/cec-adap.c
drivers/media/cec/core/cec-api.c
include/media/cec.h

index 11e091255795e494d62609b2d4db771392bb0392..40fea5d3ffe50ba32e6244057f97fdfa360c98b0 100644 (file)
@@ -1528,9 +1528,12 @@ unconfigure:
  */
 static void cec_claim_log_addrs(struct cec_adapter *adap, bool block)
 {
-       if (WARN_ON(adap->is_configuring || adap->is_configured))
+       if (WARN_ON(adap->is_claiming_log_addrs ||
+                   adap->is_configuring || adap->is_configured))
                return;
 
+       adap->is_claiming_log_addrs = true;
+
        init_completion(&adap->config_completion);
 
        /* Ready to kick off the thread */
@@ -1545,6 +1548,7 @@ static void cec_claim_log_addrs(struct cec_adapter *adap, bool block)
                wait_for_completion(&adap->config_completion);
                mutex_lock(&adap->lock);
        }
+       adap->is_claiming_log_addrs = false;
 }
 
 /*
index a44cd1484a13ce8de70b19c196b0fe9737bbda95..7f260f2cbb1538676320f77ba690814e14b0829a 100644 (file)
@@ -178,7 +178,7 @@ static long cec_adap_s_log_addrs(struct cec_adapter *adap, struct cec_fh *fh,
                           CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU |
                           CEC_LOG_ADDRS_FL_CDC_ONLY;
        mutex_lock(&adap->lock);
-       if (!adap->is_configuring &&
+       if (!adap->is_claiming_log_addrs && !adap->is_configuring &&
            (!log_addrs.num_log_addrs || !adap->is_configured) &&
            !cec_is_busy(adap, fh)) {
                err = __cec_s_log_addrs(adap, &log_addrs, block);
index df3e8738d512bc87d41ab5547f245d4f19a58e2e..23202bf439b47ec135f0036a4f55b8216059d030 100644 (file)
@@ -239,6 +239,7 @@ struct cec_adapter {
        u16 phys_addr;
        bool needs_hpd;
        bool is_enabled;
+       bool is_claiming_log_addrs;
        bool is_configuring;
        bool is_configured;
        bool cec_pin_is_high;