[PATCH v2] usb: typec: ucsi: displayport: Fix OOB altmode array index

Jameson Thies posted 1 patch 3 weeks ago
drivers/usb/typec/ucsi/displayport.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
[PATCH v2] usb: typec: ucsi: displayport: Fix OOB altmode array index
Posted by Jameson Thies 3 weeks ago
The UCSI displayport driver indexes the connector's port altmode array
with the GET_CURRENT_CAM response after checking it is not 0xff. The
port altmode array is UCSI_MAX_ALTMODES elements long. If the PPM
returns an invalid GET_CURRENT_CAM response above UCSI_MAX_ALTMODES and
not equal to 0xff, the kernel may crash with an array index OOB error.

Update the UCSI displayport driver to verify the current cam is less
than UCSI_MAX_ALTMODES before accessing the port altmode array.

Fixes: af8622f6a585 ("usb: typec: ucsi: Support for DisplayPort alt mode")
Cc: stable@vger.kernel.org
Signed-off-by: Jameson Thies <jthies@google.com>
---
Changes in v2:
 - removed 0xff alt mode assignement when GET_CURRENT_CAM returns an error.
 - return -EINVAL when alt mode index above UCSI_MAX_ALTMODES is returned.

 drivers/usb/typec/ucsi/displayport.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/typec/ucsi/displayport.c b/drivers/usb/typec/ucsi/displayport.c
index 7067f2561b84..572da7bbd29c 100644
--- a/drivers/usb/typec/ucsi/displayport.c
+++ b/drivers/usb/typec/ucsi/displayport.c
@@ -71,11 +71,14 @@ static int ucsi_displayport_enter(struct typec_altmode *alt, u32 *vdo)
 	if (ret < 0) {
 		if (ucsi->version > 0x0100)
 			goto err_unlock;
-		cur = 0xff;
 	}
 
 	if (cur != 0xff) {
-		ret = dp->con->port_altmode[cur] == alt ? 0 : -EBUSY;
+		if (cur < UCSI_MAX_ALTMODES)
+			ret = dp->con->port_altmode[cur] == alt ? 0 : -EBUSY;
+		else
+			ret = -EINVAL;
+
 		goto err_unlock;
 	}
 

base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
-- 
2.55.0.979.g7e5102b832-goog
Re: [PATCH v2] usb: typec: ucsi: displayport: Fix OOB altmode array index
Posted by Greg KH 2 weeks, 1 day ago
On Fri, Sep 04, 2026 at 11:44:01PM +0000, Jameson Thies wrote:
> The UCSI displayport driver indexes the connector's port altmode array
> with the GET_CURRENT_CAM response after checking it is not 0xff. The
> port altmode array is UCSI_MAX_ALTMODES elements long. If the PPM
> returns an invalid GET_CURRENT_CAM response above UCSI_MAX_ALTMODES and
> not equal to 0xff, the kernel may crash with an array index OOB error.
> 
> Update the UCSI displayport driver to verify the current cam is less
> than UCSI_MAX_ALTMODES before accessing the port altmode array.
> 
> Fixes: af8622f6a585 ("usb: typec: ucsi: Support for DisplayPort alt mode")
> Cc: stable@vger.kernel.org
> Signed-off-by: Jameson Thies <jthies@google.com>
> ---
> Changes in v2:
>  - removed 0xff alt mode assignement when GET_CURRENT_CAM returns an error.
>  - return -EINVAL when alt mode index above UCSI_MAX_ALTMODES is returned.

Does not apply against 7.3-rc2 :(
Re: [PATCH v2] usb: typec: ucsi: displayport: Fix OOB altmode array index
Posted by Jameson Thies 2 weeks, 1 day ago
Hi Greg.

> Does not apply against 7.3-rc2 :(

7.3-rc2 and usb-next include the v1 version of this patch which fixes
the OOB issue but doesn't incorporate Heikki's or Andrei's feedback.
I'll send a quick series to revert the existing change and followup
with the v2 version.

- Jameson
Re: [PATCH v2] usb: typec: ucsi: displayport: Fix OOB altmode array index
Posted by Greg KH 2 weeks ago
On Thu, Sep 10, 2026 at 12:52:34PM -0700, Jameson Thies wrote:
> Hi Greg.
> 
> > Does not apply against 7.3-rc2 :(
> 
> 7.3-rc2 and usb-next include the v1 version of this patch which fixes
> the OOB issue but doesn't incorporate Heikki's or Andrei's feedback.
> I'll send a quick series to revert the existing change and followup
> with the v2 version.

Why not just a fixup patch instead?
Re: [PATCH v2] usb: typec: ucsi: displayport: Fix OOB altmode array index
Posted by Jameson Thies 2 weeks ago
On Thu, Sep 10, 2026 at 10:56 PM Greg KH <gregkh@linuxfoundation.org> wrote:

> Why not just a fixup patch instead?

Sorry, wasn't aware this was an option. I'll send a fixup patch to address this.
Re: [PATCH v2] usb: typec: ucsi: displayport: Fix OOB altmode array index
Posted by Heikki Krogerus 2 weeks, 4 days ago
On Fri, Sep 04, 2026 at 11:44:01PM +0000, Jameson Thies wrote:
> The UCSI displayport driver indexes the connector's port altmode array
> with the GET_CURRENT_CAM response after checking it is not 0xff. The
> port altmode array is UCSI_MAX_ALTMODES elements long. If the PPM
> returns an invalid GET_CURRENT_CAM response above UCSI_MAX_ALTMODES and
> not equal to 0xff, the kernel may crash with an array index OOB error.
> 
> Update the UCSI displayport driver to verify the current cam is less
> than UCSI_MAX_ALTMODES before accessing the port altmode array.
> 
> Fixes: af8622f6a585 ("usb: typec: ucsi: Support for DisplayPort alt mode")
> Cc: stable@vger.kernel.org
> Signed-off-by: Jameson Thies <jthies@google.com>

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
> Changes in v2:
>  - removed 0xff alt mode assignement when GET_CURRENT_CAM returns an error.
>  - return -EINVAL when alt mode index above UCSI_MAX_ALTMODES is returned.
> 
>  drivers/usb/typec/ucsi/displayport.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/typec/ucsi/displayport.c b/drivers/usb/typec/ucsi/displayport.c
> index 7067f2561b84..572da7bbd29c 100644
> --- a/drivers/usb/typec/ucsi/displayport.c
> +++ b/drivers/usb/typec/ucsi/displayport.c
> @@ -71,11 +71,14 @@ static int ucsi_displayport_enter(struct typec_altmode *alt, u32 *vdo)
>  	if (ret < 0) {
>  		if (ucsi->version > 0x0100)
>  			goto err_unlock;
> -		cur = 0xff;
>  	}
>  
>  	if (cur != 0xff) {
> -		ret = dp->con->port_altmode[cur] == alt ? 0 : -EBUSY;
> +		if (cur < UCSI_MAX_ALTMODES)
> +			ret = dp->con->port_altmode[cur] == alt ? 0 : -EBUSY;
> +		else
> +			ret = -EINVAL;
> +
>  		goto err_unlock;
>  	}
>  
> 
> base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
> -- 
> 2.55.0.979.g7e5102b832-goog

-- 
heikki
Re: [PATCH v2] usb: typec: ucsi: displayport: Fix OOB altmode array index
Posted by Andrei Kuchynski 2 weeks, 4 days ago
On Sat, Sep 5, 2026 at 1:44 AM Jameson Thies <jthies@google.com> wrote:
>
> The UCSI displayport driver indexes the connector's port altmode array
> with the GET_CURRENT_CAM response after checking it is not 0xff. The
> port altmode array is UCSI_MAX_ALTMODES elements long. If the PPM
> returns an invalid GET_CURRENT_CAM response above UCSI_MAX_ALTMODES and
> not equal to 0xff, the kernel may crash with an array index OOB error.
>
> Update the UCSI displayport driver to verify the current cam is less
> than UCSI_MAX_ALTMODES before accessing the port altmode array.
>
> Fixes: af8622f6a585 ("usb: typec: ucsi: Support for DisplayPort alt mode")
> Cc: stable@vger.kernel.org
> Signed-off-by: Jameson Thies <jthies@google.com>

Reviewed-by: Andrei Kuchynski <akuchynski@chromium.org>

> ---
> Changes in v2:
>  - removed 0xff alt mode assignement when GET_CURRENT_CAM returns an error.
>  - return -EINVAL when alt mode index above UCSI_MAX_ALTMODES is returned.
>
>  drivers/usb/typec/ucsi/displayport.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/usb/typec/ucsi/displayport.c b/drivers/usb/typec/ucsi/displayport.c
> index 7067f2561b84..572da7bbd29c 100644
> --- a/drivers/usb/typec/ucsi/displayport.c
> +++ b/drivers/usb/typec/ucsi/displayport.c
> @@ -71,11 +71,14 @@ static int ucsi_displayport_enter(struct typec_altmode *alt, u32 *vdo)
>         if (ret < 0) {
>                 if (ucsi->version > 0x0100)
>                         goto err_unlock;
> -               cur = 0xff;
>         }
>
>         if (cur != 0xff) {
> -               ret = dp->con->port_altmode[cur] == alt ? 0 : -EBUSY;
> +               if (cur < UCSI_MAX_ALTMODES)
> +                       ret = dp->con->port_altmode[cur] == alt ? 0 : -EBUSY;
> +               else
> +                       ret = -EINVAL;
> +
>                 goto err_unlock;
>         }
>
>
> base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
> --
> 2.55.0.979.g7e5102b832-goog
>
Re: [PATCH v2] usb: typec: ucsi: displayport: Fix OOB altmode array index
Posted by Benson Leung 3 weeks ago
On Fri, Sep 04, 2026 at 11:44:01PM +0000, Jameson Thies wrote:
> The UCSI displayport driver indexes the connector's port altmode array
> with the GET_CURRENT_CAM response after checking it is not 0xff. The
> port altmode array is UCSI_MAX_ALTMODES elements long. If the PPM
> returns an invalid GET_CURRENT_CAM response above UCSI_MAX_ALTMODES and
> not equal to 0xff, the kernel may crash with an array index OOB error.
> 
> Update the UCSI displayport driver to verify the current cam is less
> than UCSI_MAX_ALTMODES before accessing the port altmode array.
> 
> Fixes: af8622f6a585 ("usb: typec: ucsi: Support for DisplayPort alt mode")
> Cc: stable@vger.kernel.org
> Signed-off-by: Jameson Thies <jthies@google.com>

Reviewed-by: Benson Leung <bleung@chromium.org>


> ---
> Changes in v2:
>  - removed 0xff alt mode assignement when GET_CURRENT_CAM returns an error.
>  - return -EINVAL when alt mode index above UCSI_MAX_ALTMODES is returned.
> 
>  drivers/usb/typec/ucsi/displayport.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/typec/ucsi/displayport.c b/drivers/usb/typec/ucsi/displayport.c
> index 7067f2561b84..572da7bbd29c 100644
> --- a/drivers/usb/typec/ucsi/displayport.c
> +++ b/drivers/usb/typec/ucsi/displayport.c
> @@ -71,11 +71,14 @@ static int ucsi_displayport_enter(struct typec_altmode *alt, u32 *vdo)
>  	if (ret < 0) {
>  		if (ucsi->version > 0x0100)
>  			goto err_unlock;
> -		cur = 0xff;
>  	}
>  
>  	if (cur != 0xff) {
> -		ret = dp->con->port_altmode[cur] == alt ? 0 : -EBUSY;
> +		if (cur < UCSI_MAX_ALTMODES)
> +			ret = dp->con->port_altmode[cur] == alt ? 0 : -EBUSY;
> +		else
> +			ret = -EINVAL;
> +
>  		goto err_unlock;
>  	}
>  
> 
> base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
> -- 
> 2.55.0.979.g7e5102b832-goog
>