VYPR
Unrated severityNVD Advisory· Published May 28, 2026

CVE-2026-46236

CVE-2026-46236

Description

In the Linux kernel, the following vulnerability has been resolved:

media: rc: xbox_remote: heed DMA restrictions

The buffer for IO must not be part of the device structure because that violates the DMA coherency rules.

Affected products

2

Patches

10
0cc9251833bf

media: rc: xbox_remote: heed DMA restrictions

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitOliver NeukumFeb 11, 2026Fixed in 6.6.140via kernel-cna
2 files changed · +16 4
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index a1572381d0971a..0c9c855ced729c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index a1572381d0971a..0c9c855ced729c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
e280d1e5e3f2

media: rc: xbox_remote: heed DMA restrictions

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitOliver NeukumFeb 11, 2026Fixed in 7.1-rc1via kernel-cna
2 files changed · +16 4
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index c64123e9d16a5e..d2cb88b8f1ca8c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -287,6 +293,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_free_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index c64123e9d16a5e..d2cb88b8f1ca8c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -287,6 +293,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_free_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
48a668c22e8f

media: rc: xbox_remote: heed DMA restrictions

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitOliver NeukumFeb 11, 2026Fixed in 6.12.90via kernel-cna
2 files changed · +16 4
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index a1572381d0971a..0c9c855ced729c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index a1572381d0971a..0c9c855ced729c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
63a960b39de9

media: rc: xbox_remote: heed DMA restrictions

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitOliver NeukumFeb 11, 2026Fixed in 6.18.32via kernel-cna
2 files changed · +16 4
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index a1572381d0971a..0c9c855ced729c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index a1572381d0971a..0c9c855ced729c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
0bd8ac88ec5f

media: rc: xbox_remote: heed DMA restrictions

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitOliver NeukumFeb 11, 2026Fixed in 7.0.9via kernel-cna
2 files changed · +16 4
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index 3e3da70cf8da05..e2ed2e2c2723e0 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index 3e3da70cf8da05..e2ed2e2c2723e0 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
e280d1e5e3f2

media: rc: xbox_remote: heed DMA restrictions

2 files changed · +16 4
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index c64123e9d16a5e..d2cb88b8f1ca8c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -287,6 +293,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_free_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index c64123e9d16a5e..d2cb88b8f1ca8c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -287,6 +293,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_free_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
63a960b39de9

media: rc: xbox_remote: heed DMA restrictions

2 files changed · +16 4
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index a1572381d0971a..0c9c855ced729c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index a1572381d0971a..0c9c855ced729c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
0bd8ac88ec5f

media: rc: xbox_remote: heed DMA restrictions

2 files changed · +16 4
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index 3e3da70cf8da05..e2ed2e2c2723e0 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index 3e3da70cf8da05..e2ed2e2c2723e0 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
48a668c22e8f

media: rc: xbox_remote: heed DMA restrictions

2 files changed · +16 4
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index a1572381d0971a..0c9c855ced729c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index a1572381d0971a..0c9c855ced729c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
0cc9251833bf

media: rc: xbox_remote: heed DMA restrictions

2 files changed · +16 4
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index a1572381d0971a..0c9c855ced729c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/media/rc/xbox_remote.c+8 2 modified
    diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
    index a1572381d0971a..0c9c855ced729c 100644
    --- a/drivers/media/rc/xbox_remote.c
    +++ b/drivers/media/rc/xbox_remote.c
    @@ -55,7 +55,7 @@ struct xbox_remote {
     	struct usb_interface *interface;
     
     	struct urb *irq_urb;
    -	unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
    +	u8 *inbuf;
     
     	char rc_name[NAME_BUFSIZE];
     	char rc_phys[NAME_BUFSIZE];
    @@ -218,6 +218,10 @@ static int xbox_remote_probe(struct usb_interface *interface,
     	if (!xbox_remote || !rc_dev)
     		goto exit_free_dev_rdev;
     
    +	xbox_remote->inbuf = kzalloc(DATA_BUFSIZE, GFP_KERNEL);
    +	if (!xbox_remote->inbuf)
    +		goto exit_free_inbuf;
    +
     	/* Allocate URB buffer */
     	xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
     	if (!xbox_remote->irq_urb)
    @@ -262,6 +266,8 @@ exit_kill_urbs:
     	usb_kill_urb(xbox_remote->irq_urb);
     exit_free_buffers:
     	usb_free_urb(xbox_remote->irq_urb);
    +exit_free_inbuf:
    +	kfree(xbox_remote->inbuf);
     exit_free_dev_rdev:
     	rc_free_device(rc_dev);
     	kfree(xbox_remote);
    @@ -286,6 +292,7 @@ static void xbox_remote_disconnect(struct usb_interface *interface)
     	usb_kill_urb(xbox_remote->irq_urb);
     	rc_unregister_device(xbox_remote->rdev);
     	usb_free_urb(xbox_remote->irq_urb);
    +	kfree(xbox_remote->inbuf);
     	kfree(xbox_remote);
     }
     
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"I/O buffer embedded in device structure violates DMA coherency rules."

Attack vector

An attacker with physical access to the USB bus can trigger DMA operations that target the `inbuf` buffer. Because the buffer was embedded in the device structure (a non-DMA-coherent allocation), the CPU and the USB controller may see different cached copies of the data, leading to data corruption or information disclosure. No special authentication or network access is required — the bug is triggered during normal USB interrupt URB transfers to the Xbox DVD Movie Playback Kit remote receiver.

Affected code

The vulnerability is in `drivers/media/rc/xbox_remote.c` in the `struct xbox_remote` definition. The I/O buffer `inbuf` was declared as a fixed-size array (`unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16))`) embedded directly inside the device structure, which violates DMA coherency rules [patch_id=2897517].

What the fix does

The patch changes `inbuf` from a fixed-size array embedded in `struct xbox_remote` to a dynamically allocated pointer (`u8 *inbuf`) allocated via `kzalloc()` in the probe function [patch_id=2897517]. This ensures the I/O buffer resides in memory that is properly handled by the DMA API, rather than being part of the device structure which may not satisfy DMA coherency requirements. The patch also adds the corresponding `kfree(xbox_remote->inbuf)` calls in the error path and disconnect function to prevent memory leaks.

Preconditions

  • inputPhysical access to the USB bus to connect the Xbox DVD Movie Playback Kit remote receiver
  • configThe xbox_remote driver must be loaded and bound to the device

Generated on May 28, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.