]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ALSA: compress_offload: Relax __free() variable declarations
authorTakashi Iwai <tiwai@suse.de>
Tue, 16 Dec 2025 14:06:23 +0000 (15:06 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 17 Dec 2025 09:08:29 +0000 (10:08 +0100)
We used to have a variable declaration with __free() initialized with
NULL.  This was to keep the old coding style rule, but recently it's
relaxed and rather recommends to follow the new rule to declare in
place of use for __free() -- which avoids potential deadlocks or UAFs
with nested cleanups.

Although the current code has no bug, per se, let's follow the new
standard and move the declaration to the place of assignment.

Fixes: 9b02221422a5 ("ALSA: compress_offload: Use automatic cleanup of kfree()")
Fixes: 04177158cf98 ("ALSA: compress_offload: introduce accel operation mode")
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20251216140634.171890-2-tiwai@suse.de
sound/core/compress_offload.c

index da514fef45bca0164ae811bfdadb56548a463b04..ed2eeb914c6dbf857b9dc92e02f318705a1de9b4 100644 (file)
@@ -514,12 +514,12 @@ static int
 snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg)
 {
        int retval;
-       struct snd_compr_codec_caps *caps __free(kfree) = NULL;
 
        if (!stream->ops->get_codec_caps)
                return -ENXIO;
 
-       caps = kzalloc(sizeof(*caps), GFP_KERNEL);
+       struct snd_compr_codec_caps *caps __free(kfree) =
+               kzalloc(sizeof(*caps), GFP_KERNEL);
        if (!caps)
                return -ENOMEM;
 
@@ -647,7 +647,6 @@ snd_compress_check_input(struct snd_compr_stream *stream, struct snd_compr_param
 static int
 snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg)
 {
-       struct snd_compr_params *params __free(kfree) = NULL;
        int retval;
 
        if (stream->runtime->state == SNDRV_PCM_STATE_OPEN || stream->next_track) {
@@ -655,7 +654,9 @@ snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg)
                 * we should allow parameter change only when stream has been
                 * opened not in other cases
                 */
-               params = memdup_user((void __user *)arg, sizeof(*params));
+               struct snd_compr_params *params __free(kfree) =
+                       memdup_user((void __user *)arg, sizeof(*params));
+
                if (IS_ERR(params))
                        return PTR_ERR(params);
 
@@ -687,13 +688,13 @@ snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg)
 static int
 snd_compr_get_params(struct snd_compr_stream *stream, unsigned long arg)
 {
-       struct snd_codec *params __free(kfree) = NULL;
        int retval;
 
        if (!stream->ops->get_params)
                return -EBADFD;
 
-       params = kzalloc(sizeof(*params), GFP_KERNEL);
+       struct snd_codec *params __free(kfree) =
+               kzalloc(sizeof(*params), GFP_KERNEL);
        if (!params)
                return -ENOMEM;
        retval = stream->ops->get_params(stream, params);
@@ -1104,12 +1105,13 @@ cleanup:
 
 static int snd_compr_task_create(struct snd_compr_stream *stream, unsigned long arg)
 {
-       struct snd_compr_task *task __free(kfree) = NULL;
        int retval;
 
        if (stream->runtime->state != SNDRV_PCM_STATE_SETUP)
                return -EPERM;
-       task = memdup_user((void __user *)arg, sizeof(*task));
+
+       struct snd_compr_task *task __free(kfree) =
+               memdup_user((void __user *)arg, sizeof(*task));
        if (IS_ERR(task))
                return PTR_ERR(task);
        retval = snd_compr_task_new(stream, task);
@@ -1165,12 +1167,13 @@ static int snd_compr_task_start(struct snd_compr_stream *stream, struct snd_comp
 
 static int snd_compr_task_start_ioctl(struct snd_compr_stream *stream, unsigned long arg)
 {
-       struct snd_compr_task *task __free(kfree) = NULL;
        int retval;
 
        if (stream->runtime->state != SNDRV_PCM_STATE_SETUP)
                return -EPERM;
-       task = memdup_user((void __user *)arg, sizeof(*task));
+
+       struct snd_compr_task *task __free(kfree) =
+               memdup_user((void __user *)arg, sizeof(*task));
        if (IS_ERR(task))
                return PTR_ERR(task);
        retval = snd_compr_task_start(stream, task);
@@ -1256,12 +1259,13 @@ static int snd_compr_task_status(struct snd_compr_stream *stream,
 
 static int snd_compr_task_status_ioctl(struct snd_compr_stream *stream, unsigned long arg)
 {
-       struct snd_compr_task_status *status __free(kfree) = NULL;
        int retval;
 
        if (stream->runtime->state != SNDRV_PCM_STATE_SETUP)
                return -EPERM;
-       status = memdup_user((void __user *)arg, sizeof(*status));
+
+       struct snd_compr_task_status *status __free(kfree) =
+               memdup_user((void __user *)arg, sizeof(*status));
        if (IS_ERR(status))
                return PTR_ERR(status);
        retval = snd_compr_task_status(stream, status);