FAILED: patch "[PATCH] ALSA: usb-audio: Fix a DMA to stack memory bug" failed to apply to 5.10-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.10.y
git checkout FETCH_HEAD
git cherry-pick -x f7d306b47a24367302bd4fe846854e07752ffcd9
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024121041-unread-utilize-cae6@gregkh' --subject-prefix 'PATCH 5.10.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From f7d306b47a24367302bd4fe846854e07752ffcd9 Mon Sep 17 00:00:00 2001
From: Dan Carpenter <[email protected]>
Date: Mon, 2 Dec 2024 15:57:54 +0300
Subject: [PATCH] ALSA: usb-audio: Fix a DMA to stack memory bug
The usb_get_descriptor() function does DMA so we're not allowed to use a stack buffer for that. Doing DMA to the stack is not portable all architectures. Move the "new_device_descriptor" from being stored on the stack and allocate it with kmalloc() instead.
sound/usb/quirks.c +27 -15
@@ -555,7 +555,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,static int snd_usb_extigy_boot_quirk (struct usb_device *dev,struct usb_interface *intf) {struct usb_host_config *config = dev->actconfig; -struct usb_device_descriptor new_device_descriptor; + struct usb_device_descriptor *new_device_descriptor __free(kfree) = NULL;int err; if (le16_to_cpu(get_cfg_desc(config)->wTotalLength) == EXTIGY_FIRMWARE_SIZE_OLD ||
@@ -566,15 +566,19 @@ static int snd_usb_extigy_boot_quirk(struct usb_device *dev, struct usb_interfac 0x10, 0x43, 0x0001, 0x000a, NULL, 0);if (err <0 )dev_dbg (&dev->dev,"error sending boot message: %d\n" , err); + + new_device_descriptor =kmalloc (sizeof (*new_device_descriptor),GFP_KERNEL ); +if (!new_device_descriptor) +return -ENOMEM ; err =usb_get_descriptor (dev,USB_DT_DEVICE ,0 , - &new_device_descriptor,sizeof (new_device_descriptor)); + new_device_descriptor,sizeof (*new_device_descriptor));if (err <0 )dev_dbg (&dev->dev,"error usb_get_descriptor: %d\n" , err); -if (new_device_descriptor.bNumConfigurations > dev->descriptor.bNumConfigurations) +if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)dev_dbg (&dev->dev,"error too large bNumConfigurations: %d\n" , - new_device_descriptor.bNumConfigurations); + new_device_descriptor->bNumConfigurations);else -memcpy (&dev->descriptor, &new_device_descriptor,sizeof (dev->descriptor)); +memcpy (&dev->descriptor, new_device_descriptor,sizeof (dev->descriptor)); err =usb_reset_configuration (dev);if (err <0 )dev_dbg (&dev->dev,"error usb_reset_configuration: %d\n" , err);
@@ -906,7 +910,7 @@ static void mbox2_setup_48_24_magic(struct usb_device *dev)static int snd_usb_mbox2_boot_quirk (struct usb_device *dev) {struct usb_host_config *config = dev->actconfig; -struct usb_device_descriptor new_device_descriptor; + struct usb_device_descriptor *new_device_descriptor __free(kfree) = NULL;int err;u8 bootresponse[0x12 ];int fwsize;
@@ -941,15 +945,19 @@ static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)dev_dbg (&dev->dev,"device initialised!\n" ); + new_device_descriptor =kmalloc (sizeof (*new_device_descriptor),GFP_KERNEL ); +if (!new_device_descriptor) +return -ENOMEM ; + err =usb_get_descriptor (dev,USB_DT_DEVICE ,0 , - &new_device_descriptor,sizeof (new_device_descriptor)); + new_device_descriptor,sizeof (*new_device_descriptor));if (err <0 )dev_dbg (&dev->dev,"error usb_get_descriptor: %d\n" , err); -if (new_device_descriptor.bNumConfigurations > dev->descriptor.bNumConfigurations) +if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)dev_dbg (&dev->dev,"error too large bNumConfigurations: %d\n" , - new_device_descriptor.bNumConfigurations); + new_device_descriptor->bNumConfigurations);else -memcpy (&dev->descriptor, &new_device_descriptor,sizeof (dev->descriptor)); +memcpy (&dev->descriptor, new_device_descriptor,sizeof (dev->descriptor)); err =usb_reset_configuration (dev);if (err <0 )
@@ -1259,7 +1267,7 @@ static void mbox3_setup_defaults(struct usb_device *dev)static int snd_usb_mbox3_boot_quirk (struct usb_device *dev) {struct usb_host_config *config = dev->actconfig; -struct usb_device_descriptor new_device_descriptor; + struct usb_device_descriptor *new_device_descriptor __free(kfree) = NULL;int err;int descriptor_size;
@@ -1272,15 +1280,19 @@ static int snd_usb_mbox3_boot_quirk(struct usb_device *dev)dev_dbg (&dev->dev,"MBOX3: device initialised!\n" ); + new_device_descriptor =kmalloc (sizeof (*new_device_descriptor),GFP_KERNEL ); +if (!new_device_descriptor) +return -ENOMEM ; + err =usb_get_descriptor (dev,USB_DT_DEVICE ,0 , - &new_device_descriptor,sizeof (new_device_descriptor)); + new_device_descriptor,sizeof (*new_device_descriptor));if (err <0 )dev_dbg (&dev->dev,"MBOX3: error usb_get_descriptor: %d\n" , err); -if (new_device_descriptor.bNumConfigurations > dev->descriptor.bNumConfigurations) +if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)dev_dbg (&dev->dev,"MBOX3: error too large bNumConfigurations: %d\n" , - new_device_descriptor.bNumConfigurations); + new_device_descriptor->bNumConfigurations);else -memcpy (&dev->descriptor, &new_device_descriptor,sizeof (dev->descriptor)); +memcpy (&dev->descriptor, new_device_descriptor,sizeof (dev->descriptor)); err =usb_reset_configuration (dev);if (err <0 )
PATCH 1/1 ALSA: usb-audio: Fix a DMA to stack memory bug
From: Dan Carpenter <[email protected]>
The usb_get_descriptor() function does DMA so we're not allowed to use a stack buffer for that. Doing DMA to the stack is not portable all architectures. Move the "new_device_descriptor" from being stored on the stack and allocate it with kmalloc() instead.
--- sound/usb/quirks.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-)
sound/usb/quirks.c +21 -10
@@ -595,7 +595,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,static int snd_usb_extigy_boot_quirk (struct usb_device *dev,struct usb_interface *intf) {struct usb_host_config *config = dev->actconfig; -struct usb_device_descriptor new_device_descriptor; +struct usb_device_descriptor *new_device_descriptor =NULL ;int err; if (le16_to_cpu(get_cfg_desc(config)->wTotalLength) == EXTIGY_FIRMWARE_SIZE_OLD ||
@@ -606,15 +606,20 @@ static int snd_usb_extigy_boot_quirk(struct usb_device *dev, struct usb_interfac 0x10, 0x43, 0x0001, 0x000a, NULL, 0);if (err <0 )dev_dbg (&dev->dev,"error sending boot message: %d\n" , err); + + new_device_descriptor =kmalloc (sizeof (*new_device_descriptor),GFP_KERNEL ); +if (!new_device_descriptor) +return -ENOMEM ; err =usb_get_descriptor (dev,USB_DT_DEVICE ,0 , - &new_device_descriptor,sizeof (new_device_descriptor)); + new_device_descriptor,sizeof (*new_device_descriptor));if (err <0 )dev_dbg (&dev->dev,"error usb_get_descriptor: %d\n" , err); -if (new_device_descriptor.bNumConfigurations > dev->descriptor.bNumConfigurations) +if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)dev_dbg (&dev->dev,"error too large bNumConfigurations: %d\n" , - new_device_descriptor.bNumConfigurations); + new_device_descriptor->bNumConfigurations);else -memcpy (&dev->descriptor, &new_device_descriptor,sizeof (dev->descriptor)); +memcpy (&dev->descriptor, new_device_descriptor,sizeof (dev->descriptor)); +kfree (new_device_descriptor); err =usb_reset_configuration (dev);if (err <0 )dev_dbg (&dev->dev,"error usb_reset_configuration: %d\n" , err);
@@ -946,7 +951,7 @@ static void mbox2_setup_48_24_magic(struct usb_device *dev)static int snd_usb_mbox2_boot_quirk (struct usb_device *dev) {struct usb_host_config *config = dev->actconfig; -struct usb_device_descriptor new_device_descriptor; +struct usb_device_descriptor *new_device_descriptor =NULL ;int err;u8 bootresponse[0x12 ];int fwsize;
@@ -981,15 +986,21 @@ static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)dev_dbg (&dev->dev,"device initialised!\n" ); + new_device_descriptor =kmalloc (sizeof (*new_device_descriptor),GFP_KERNEL ); +if (!new_device_descriptor) +return -ENOMEM ; + err =usb_get_descriptor (dev,USB_DT_DEVICE ,0 , - &new_device_descriptor,sizeof (new_device_descriptor)); + new_device_descriptor,sizeof (*new_device_descriptor));if (err <0 )dev_dbg (&dev->dev,"error usb_get_descriptor: %d\n" , err); -if (new_device_descriptor.bNumConfigurations > dev->descriptor.bNumConfigurations) +if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)dev_dbg (&dev->dev,"error too large bNumConfigurations: %d\n" , - new_device_descriptor.bNumConfigurations); + new_device_descriptor->bNumConfigurations);else -memcpy (&dev->descriptor, &new_device_descriptor,sizeof (dev->descriptor)); +memcpy (&dev->descriptor, new_device_descriptor,sizeof (dev->descriptor)); + +kfree (new_device_descriptor); err =usb_reset_configuration (dev);if (err <0 )
Signature · 1 line
2.47.1.613.gc27f4b7a9f-goog
Sasha Levin
maintainerRe: [PATCH 5.10.y] ALSA: usb-audio: Fix a DMA to stack memory bug
[ Sasha's backport helper bot ]
Hi,
Found matching upstream commit: f7d306b47a24367302bd4fe846854e07752ffcd9
WARNING: Author mismatch between patch and found commit:
Backport author: "=?UTF-8?q?Beno=C3=AEt=20Sevens?=" <[email protected]> Commit author: Dan Carpenter <[email protected]>
Status in newer kernel trees:
6.12.y | Present (different SHA1: 7f1292f8d4d6)
6.6.y | Not found
6.1.y | Not found
5.15.y | Not found
5.10.y | Not found
Note: The patch differs from the upstream commit:
---
1: f7d306b47a24 ! 1: 15ebdf03bbee ALSA: usb-audio: Fix a DMA to stack memory bug
@@ Commit message
Signed-off-by: Dan Carpenter <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Takashi Iwai <[email protected]>
+ (cherry picked from commit f7d306b47a24367302bd4fe846854e07752ffcd9)
+ [Benoît: there is no mbox3 suppport and no __free macro in 5.15]
+ Signed-off-by: Benoît Sevens <[email protected]>
## sound/usb/quirks.c ##
@@ sound/usb/quirks.c: int snd_usb_create_quirk(struct snd_usb_audio *chip,
@@ sound/usb/quirks.c: int snd_usb_create_quirk(struct snd_usb_audio *chip,
{
struct usb_host_config *config = dev->actconfig;
- struct usb_device_descriptor new_device_descriptor;
-+ struct usb_device_descriptor *new_device_descriptor __free(kfree) = NULL;
++ struct usb_device_descriptor *new_device_descriptor = NULL;
int err;
if (le16_to_cpu(get_cfg_desc(config)->wTotalLength) == EXTIGY_FIRMWARE_SIZE_OLD ||
@@ sound/usb/quirks.c: static int snd_usb_extigy_boot_quirk(struct usb_device *dev,
else
- memcpy(&dev->descriptor, &new_device_descriptor, sizeof(dev->descriptor));
+ memcpy(&dev->descriptor, new_device_descriptor, sizeof(dev->descriptor));
++ kfree(new_device_descriptor);
err = usb_reset_configuration(dev);
if (err < 0)
dev_dbg(&dev->dev, "error usb_reset_configuration: %d\n", err);
@@ sound/usb/quirks.c: static void mbox2_setup_48_24_magic(struct usb_device *dev)
{
struct usb_host_config *config = dev->actconfig;
- struct usb_device_descriptor new_device_descriptor;
-+ struct usb_device_descriptor *new_device_descriptor __free(kfree) = NULL;
++ struct usb_device_descriptor *new_device_descriptor = NULL;
int err;
u8 bootresponse[0x12];
int fwsize;
@@ sound/usb/quirks.c: static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
else
- memcpy(&dev->descriptor, &new_device_descriptor, sizeof(dev->descriptor));
+ memcpy(&dev->descriptor, new_device_descriptor, sizeof(dev->descriptor));
-
- err = usb_reset_configuration(dev);
- if (err < 0)
-@@ sound/usb/quirks.c: static void mbox3_setup_defaults(struct usb_device *dev)
- static int snd_usb_mbox3_boot_quirk(struct usb_device *dev)
- {
- struct usb_host_config *config = dev->actconfig;
-- struct usb_device_descriptor new_device_descriptor;
-+ struct usb_device_descriptor *new_device_descriptor __free(kfree) = NULL;
- int err;
- int descriptor_size;
-
-@@ sound/usb/quirks.c: static int snd_usb_mbox3_boot_quirk(struct usb_device *dev)
-
- dev_dbg(&dev->dev, "MBOX3: device initialised!\n");
-
-+ new_device_descriptor = kmalloc(sizeof(*new_device_descriptor), GFP_KERNEL);
-+ if (!new_device_descriptor)
-+ return -ENOMEM;
+
- err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
-- &new_device_descriptor, sizeof(new_device_descriptor));
-+ new_device_descriptor, sizeof(*new_device_descriptor));
- if (err < 0)
- dev_dbg(&dev->dev, "MBOX3: error usb_get_descriptor: %d\n", err);
-- if (new_device_descriptor.bNumConfigurations > dev->descriptor.bNumConfigurations)
-+ if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)
- dev_dbg(&dev->dev, "MBOX3: error too large bNumConfigurations: %d\n",
-- new_device_descriptor.bNumConfigurations);
-+ new_device_descriptor->bNumConfigurations);
- else
-- memcpy(&dev->descriptor, &new_device_descriptor, sizeof(dev->descriptor));
-+ memcpy(&dev->descriptor, new_device_descriptor, sizeof(dev->descriptor));
++ kfree(new_device_descriptor);
err = usb_reset_configuration(dev);
if (err < 0)---
Results of testing on various branches:
| Branch | Patch Apply | Build Test | |---------------------------|-------------|------------| | stable/linux-5.10.y | Success | Success |