]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ALSA: seq: oss: Relax __free() variable declarations
authorTakashi Iwai <tiwai@suse.de>
Tue, 16 Dec 2025 14:06:27 +0000 (15:06 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 17 Dec 2025 09:08:30 +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 (or
directly assign the allocated result) instead of NULL initializations.

Fixes: 80ccbe91adab ("ALSA: seq: oss/synth: Clean up with guard and auto cleanup")
Fixes: 895a46e034f9 ("ALSA: seq: oss/midi: Cleanup with guard and auto-cleanup")
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20251216140634.171890-6-tiwai@suse.de
sound/core/seq/oss/seq_oss_init.c
sound/core/seq/oss/seq_oss_midi.c
sound/core/seq/oss/seq_oss_synth.c

index 973f057eb731f4cc15759bdad0a6aa47bf5ccb02..e0c368bd09cb66da8dd4f0434a4b905af102cfce 100644 (file)
@@ -63,10 +63,10 @@ int __init
 snd_seq_oss_create_client(void)
 {
        int rc;
-       struct snd_seq_port_info *port __free(kfree) = NULL;
        struct snd_seq_port_callback port_callback;
+       struct snd_seq_port_info *port __free(kfree) =
+               kzalloc(sizeof(*port), GFP_KERNEL);
 
-       port = kzalloc(sizeof(*port), GFP_KERNEL);
        if (!port)
                return -ENOMEM;
 
index 023e5d0a4351daea294fdcf3e677c91a4605f795..2d48c25ff4df2f9947459ee4d650a7e7883acf94 100644 (file)
@@ -65,11 +65,11 @@ static int send_midi_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev,
 int
 snd_seq_oss_midi_lookup_ports(int client)
 {
-       struct snd_seq_client_info *clinfo __free(kfree) = NULL;
-       struct snd_seq_port_info *pinfo __free(kfree) = NULL;
+       struct snd_seq_client_info *clinfo __free(kfree) =
+               kzalloc(sizeof(*clinfo), GFP_KERNEL);
+       struct snd_seq_port_info *pinfo __free(kfree) =
+               kzalloc(sizeof(*pinfo), GFP_KERNEL);
 
-       clinfo = kzalloc(sizeof(*clinfo), GFP_KERNEL);
-       pinfo = kzalloc(sizeof(*pinfo), GFP_KERNEL);
        if (!clinfo || !pinfo)
                return -ENOMEM;
        clinfo->client = -1;
@@ -305,10 +305,10 @@ int
 snd_seq_oss_midi_open(struct seq_oss_devinfo *dp, int dev, int fmode)
 {
        int perm;
-       struct seq_oss_midi *mdev __free(seq_oss_midi) = NULL;
        struct snd_seq_port_subscribe subs;
+       struct seq_oss_midi *mdev __free(seq_oss_midi) =
+               get_mididev(dp, dev);
 
-       mdev = get_mididev(dp, dev);
        if (!mdev)
                return -ENODEV;
 
@@ -364,10 +364,10 @@ snd_seq_oss_midi_open(struct seq_oss_devinfo *dp, int dev, int fmode)
 int
 snd_seq_oss_midi_close(struct seq_oss_devinfo *dp, int dev)
 {
-       struct seq_oss_midi *mdev __free(seq_oss_midi) = NULL;
        struct snd_seq_port_subscribe subs;
+       struct seq_oss_midi *mdev __free(seq_oss_midi) =
+               get_mididev(dp, dev);
 
-       mdev = get_mididev(dp, dev);
        if (!mdev)
                return -ENODEV;
        guard(mutex)(&mdev->open_mutex);
@@ -399,10 +399,10 @@ snd_seq_oss_midi_close(struct seq_oss_devinfo *dp, int dev)
 int
 snd_seq_oss_midi_filemode(struct seq_oss_devinfo *dp, int dev)
 {
-       struct seq_oss_midi *mdev __free(seq_oss_midi) = NULL;
        int mode;
+       struct seq_oss_midi *mdev __free(seq_oss_midi) =
+               get_mididev(dp, dev);
 
-       mdev = get_mididev(dp, dev);
        if (!mdev)
                return 0;
 
@@ -422,9 +422,9 @@ snd_seq_oss_midi_filemode(struct seq_oss_devinfo *dp, int dev)
 void
 snd_seq_oss_midi_reset(struct seq_oss_devinfo *dp, int dev)
 {
-       struct seq_oss_midi *mdev __free(seq_oss_midi) = NULL;
+       struct seq_oss_midi *mdev __free(seq_oss_midi) =
+               get_mididev(dp, dev);
 
-       mdev = get_mididev(dp, dev);
        if (!mdev)
                return;
        if (!mdev->opened)
@@ -468,9 +468,9 @@ snd_seq_oss_midi_reset(struct seq_oss_devinfo *dp, int dev)
 void
 snd_seq_oss_midi_get_addr(struct seq_oss_devinfo *dp, int dev, struct snd_seq_addr *addr)
 {
-       struct seq_oss_midi *mdev __free(seq_oss_midi) = NULL;
+       struct seq_oss_midi *mdev __free(seq_oss_midi) =
+               get_mididev(dp, dev);
 
-       mdev = get_mididev(dp, dev);
        if (!mdev)
                return;
        addr->client = mdev->client;
@@ -485,11 +485,11 @@ int
 snd_seq_oss_midi_input(struct snd_seq_event *ev, int direct, void *private_data)
 {
        struct seq_oss_devinfo *dp = (struct seq_oss_devinfo *)private_data;
-       struct seq_oss_midi *mdev __free(seq_oss_midi) = NULL;
 
        if (dp->readq == NULL)
                return 0;
-       mdev = find_slot(ev->source.client, ev->source.port);
+       struct seq_oss_midi *mdev __free(seq_oss_midi) =
+               find_slot(ev->source.client, ev->source.port);
        if (!mdev)
                return 0;
        if (!(mdev->opened & PERM_READ))
@@ -595,9 +595,9 @@ send_midi_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, struct seq
 int
 snd_seq_oss_midi_putc(struct seq_oss_devinfo *dp, int dev, unsigned char c, struct snd_seq_event *ev)
 {
-       struct seq_oss_midi *mdev __free(seq_oss_midi) = NULL;
+       struct seq_oss_midi *mdev __free(seq_oss_midi) =
+               get_mididev(dp, dev);
 
-       mdev = get_mididev(dp, dev);
        if (!mdev)
                return -ENODEV;
        if (snd_midi_event_encode_byte(mdev->coder, c, ev)) {
@@ -613,9 +613,9 @@ snd_seq_oss_midi_putc(struct seq_oss_devinfo *dp, int dev, unsigned char c, stru
 int
 snd_seq_oss_midi_make_info(struct seq_oss_devinfo *dp, int dev, struct midi_info *inf)
 {
-       struct seq_oss_midi *mdev __free(seq_oss_midi) = NULL;
+       struct seq_oss_midi *mdev __free(seq_oss_midi) =
+               get_mididev(dp, dev);
 
-       mdev = get_mididev(dp, dev);
        if (!mdev)
                return -ENXIO;
        inf->device = dev;
@@ -651,10 +651,9 @@ snd_seq_oss_midi_info_read(struct snd_info_buffer *buf)
 
        snd_iprintf(buf, "\nNumber of MIDI devices: %d\n", max_midi_devs);
        for (i = 0; i < max_midi_devs; i++) {
-               struct seq_oss_midi *mdev __free(seq_oss_midi) = NULL;
-
                snd_iprintf(buf, "\nmidi %d: ", i);
-               mdev = get_mdev(i);
+               struct seq_oss_midi *mdev __free(seq_oss_midi) =
+                       get_mdev(i);
                if (mdev == NULL) {
                        snd_iprintf(buf, "*empty*\n");
                        continue;
index 68bc6d4eed53b855fc14ed5cd0d4126b23bfc712..c7f81f2053a74c80868da69986e6a86217dca1a7 100644 (file)
@@ -364,7 +364,6 @@ reset_channels(struct seq_oss_synthinfo *info)
 void
 snd_seq_oss_synth_reset(struct seq_oss_devinfo *dp, int dev)
 {
-       struct seq_oss_synth *rec __free(seq_oss_synth) = NULL;
        struct seq_oss_synthinfo *info;
 
        info = get_synthinfo_nospec(dp, dev);
@@ -387,7 +386,8 @@ snd_seq_oss_synth_reset(struct seq_oss_devinfo *dp, int dev)
                return;
        }
 
-       rec = get_sdev(dev);
+       struct seq_oss_synth *rec __free(seq_oss_synth) =
+               get_sdev(dev);
        if (rec == NULL)
                return;
        if (rec->oper.reset) {
@@ -411,7 +411,6 @@ int
 snd_seq_oss_synth_load_patch(struct seq_oss_devinfo *dp, int dev, int fmt,
                            const char __user *buf, int p, int c)
 {
-       struct seq_oss_synth *rec __free(seq_oss_synth) = NULL;
        struct seq_oss_synthinfo *info;
 
        info = get_synthinfo_nospec(dp, dev);
@@ -420,7 +419,9 @@ snd_seq_oss_synth_load_patch(struct seq_oss_devinfo *dp, int dev, int fmt,
 
        if (info->is_midi)
                return 0;
-       rec = get_synthdev(dp, dev);
+
+       struct seq_oss_synth *rec __free(seq_oss_synth) =
+               get_synthdev(dp, dev);
        if (!rec)
                return -ENXIO;
 
@@ -436,9 +437,9 @@ snd_seq_oss_synth_load_patch(struct seq_oss_devinfo *dp, int dev, int fmt,
 struct seq_oss_synthinfo *
 snd_seq_oss_synth_info(struct seq_oss_devinfo *dp, int dev)
 {
-       struct seq_oss_synth *rec __free(seq_oss_synth) = NULL;
+       struct seq_oss_synth *rec __free(seq_oss_synth) =
+               get_synthdev(dp, dev);
 
-       rec = get_synthdev(dp, dev);
        if (rec)
                return get_synthinfo_nospec(dp, dev);
        return NULL;
@@ -491,13 +492,14 @@ snd_seq_oss_synth_addr(struct seq_oss_devinfo *dp, int dev, struct snd_seq_event
 int
 snd_seq_oss_synth_ioctl(struct seq_oss_devinfo *dp, int dev, unsigned int cmd, unsigned long addr)
 {
-       struct seq_oss_synth *rec __free(seq_oss_synth) = NULL;
        struct seq_oss_synthinfo *info;
 
        info = get_synthinfo_nospec(dp, dev);
        if (!info || info->is_midi)
                return -ENXIO;
-       rec = get_synthdev(dp, dev);
+
+       struct seq_oss_synth *rec __free(seq_oss_synth) =
+               get_synthdev(dp, dev);
        if (!rec)
                return -ENXIO;
        if (rec->oper.ioctl == NULL)
@@ -571,10 +573,9 @@ snd_seq_oss_synth_info_read(struct snd_info_buffer *buf)
 
        snd_iprintf(buf, "\nNumber of synth devices: %d\n", max_synth_devs);
        for (i = 0; i < max_synth_devs; i++) {
-               struct seq_oss_synth *rec __free(seq_oss_synth) = NULL;
-
                snd_iprintf(buf, "\nsynth %d: ", i);
-               rec = get_sdev(i);
+               struct seq_oss_synth *rec __free(seq_oss_synth) =
+                       get_sdev(i);
                if (rec == NULL) {
                        snd_iprintf(buf, "*empty*\n");
                        continue;