| From 76be98c2d9dd4297a9dbc9b92c0320724992b6b5 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 16 Dec 2025 15:06:27 +0100 |
| Subject: ALSA: seq: oss: Relax __free() variable declarations |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| [ Upstream commit df27c92753474cc8540e46a476119857ced7ae21 ] |
| |
| 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 |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/core/seq/oss/seq_oss_init.c | 4 +-- |
| sound/core/seq/oss/seq_oss_midi.c | 45 +++++++++++++++--------------- |
| sound/core/seq/oss/seq_oss_synth.c | 23 +++++++-------- |
| 3 files changed, 36 insertions(+), 36 deletions(-) |
| |
| diff --git a/sound/core/seq/oss/seq_oss_init.c b/sound/core/seq/oss/seq_oss_init.c |
| index 973f057eb731f..e0c368bd09cb6 100644 |
| --- a/sound/core/seq/oss/seq_oss_init.c |
| +++ b/sound/core/seq/oss/seq_oss_init.c |
| @@ -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; |
| |
| diff --git a/sound/core/seq/oss/seq_oss_midi.c b/sound/core/seq/oss/seq_oss_midi.c |
| index 023e5d0a4351d..2d48c25ff4df2 100644 |
| --- a/sound/core/seq/oss/seq_oss_midi.c |
| +++ b/sound/core/seq/oss/seq_oss_midi.c |
| @@ -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; |
| diff --git a/sound/core/seq/oss/seq_oss_synth.c b/sound/core/seq/oss/seq_oss_synth.c |
| index 8c4e5913c7e69..beea37ed942cb 100644 |
| --- a/sound/core/seq/oss/seq_oss_synth.c |
| +++ b/sound/core/seq/oss/seq_oss_synth.c |
| @@ -368,7 +368,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); |
| @@ -391,7 +390,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) { |
| @@ -415,7 +415,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); |
| @@ -424,7 +423,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; |
| |
| @@ -440,9 +441,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; |
| @@ -495,13 +496,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) |
| @@ -575,10 +577,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; |
| -- |
| 2.51.0 |
| |