]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
usb: typec: fix potential array underflow in ucsi_ccg_sync_control()
authorDan Carpenter <dan.carpenter@linaro.org>
Mon, 11 Nov 2024 11:08:06 +0000 (14:08 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 4 Jun 2025 12:36:58 +0000 (14:36 +0200)
commit e56aac6e5a25630645607b6856d4b2a17b2311a5 upstream.

The "command" variable can be controlled by the user via debugfs.  The
worry is that if con_index is zero then "&uc->ucsi->connector[con_index
- 1]" would be an array underflow.

Fixes: 170a6726d0e2 ("usb: typec: ucsi: add support for separate DP altmode devices")
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/c69ef0b3-61b0-4dde-98dd-97b97f81d912@stanley.mountain
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
[ The function ucsi_ccg_sync_write() is renamed to ucsi_ccg_sync_control()
  in commit 13f2ec3115c8 ("usb: typec: ucsi:simplify command sending API").
  Apply this patch to ucsi_ccg_sync_write() in 6.1.y accordingly. ]
Signed-off-by: Bin Lan <bin.lan.cn@windriver.com>
Signed-off-by: He Zhe <zhe.he@windriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/ucsi/ucsi_ccg.c

index fb6211efb5d87164215a32f9769e2b2363590c79..3983bf21a5804fa13b6fcf2c8d5f6e6208b226b9 100644 (file)
@@ -573,6 +573,10 @@ static int ucsi_ccg_sync_write(struct ucsi *ucsi, unsigned int offset,
                    uc->has_multiple_dp) {
                        con_index = (uc->last_cmd_sent >> 16) &
                                    UCSI_CMD_CONNECTOR_MASK;
+                       if (con_index == 0) {
+                               ret = -EINVAL;
+                               goto unlock;
+                       }
                        con = &uc->ucsi->connector[con_index - 1];
                        ucsi_ccg_update_set_new_cam_cmd(uc, con, (u64 *)val);
                }
@@ -588,6 +592,7 @@ static int ucsi_ccg_sync_write(struct ucsi *ucsi, unsigned int offset,
 err_clear_bit:
        clear_bit(DEV_CMD_PENDING, &uc->flags);
        pm_runtime_put_sync(uc->dev);
+unlock:
        mutex_unlock(&uc->lock);
 
        return ret;