This is an automatic generated email to let you know that the following patch 
were queued:

Subject: media: cec: silence shift wrapping warning in __cec_s_log_addrs()
Author:  Dan Carpenter <dan.carpen...@oracle.com>
Date:    Tue May 5 10:25:56 2020 +0200

The log_addrs->log_addr_type[i] value is a u8 which is controlled by
the user and comes from the ioctl.  If it's over 31 then that results in
undefined behavior (shift wrapping) and that leads to a Smatch static
checker warning.  We already cap the value later so we can silence the
warning just by re-ordering the existing checks.

I think the UBSan checker will also catch this bug at runtime and
generate a warning.  But otherwise the bug is harmless.

Fixes: 9881fe0ca187 ("[media] cec: add HDMI CEC framework (adapter)")
Signed-off-by: Dan Carpenter <dan.carpen...@oracle.com>
Signed-off-by: Hans Verkuil <hverkuil-ci...@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+hua...@kernel.org>

 drivers/media/cec/core/cec-adap.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

---

diff --git a/drivers/media/cec/core/cec-adap.c 
b/drivers/media/cec/core/cec-adap.c
index 6c95dc471d4c..6a04d19a96b2 100644
--- a/drivers/media/cec/core/cec-adap.c
+++ b/drivers/media/cec/core/cec-adap.c
@@ -1734,6 +1734,10 @@ int __cec_s_log_addrs(struct cec_adapter *adap,
                unsigned j;
 
                log_addrs->log_addr[i] = CEC_LOG_ADDR_INVALID;
+               if (log_addrs->log_addr_type[i] > 
CEC_LOG_ADDR_TYPE_UNREGISTERED) {
+                       dprintk(1, "unknown logical address type\n");
+                       return -EINVAL;
+               }
                if (type_mask & (1 << log_addrs->log_addr_type[i])) {
                        dprintk(1, "duplicate logical address type\n");
                        return -EINVAL;
@@ -1754,10 +1758,6 @@ int __cec_s_log_addrs(struct cec_adapter *adap,
                        dprintk(1, "invalid primary device type\n");
                        return -EINVAL;
                }
-               if (log_addrs->log_addr_type[i] > 
CEC_LOG_ADDR_TYPE_UNREGISTERED) {
-                       dprintk(1, "unknown logical address type\n");
-                       return -EINVAL;
-               }
                for (j = 0; j < feature_sz; j++) {
                        if ((features[j] & 0x80) == 0) {
                                if (op_is_dev_features)

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to