Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ALSA: pcm: Revert bufs move in snd_pcm_xfern_frames_ioctl()

When building with clang older than 17 targeting architectures that use
asm goto for their get_user() and put_user(), such as arm64, after
commit f3d233daf011 ("ALSA: pcm: Relax __free() variable declarations"),
there are bogus errors around skipping over a variable declared with the
cleanup attribute:

sound/core/pcm_native.c:3308:6: error: cannot jump from this asm goto statement to one of its possible targets
if (put_user(result, &_xfern->result))
^
...
arch/arm64/include/asm/uaccess.h:298:2: note: expanded from macro '__put_mem_asm'
asm goto(
^
sound/core/pcm_native.c:3295:6: note: possible target of asm goto statement
if (put_user(0, &_xfern->result))
^
...
sound/core/pcm_native.c:3300:8: note: jump exits scope of variable with __attribute__((cleanup))
void *bufs __free(kfree) =
^

clang-17 fixed a bug in clang's jump scope checker [1] where all labels
in a function were checked as valid targets for all asm goto instances
in a function, regardless of whether they were actual targets in a
paricular asm goto's provided list of labels.

To workaround this, revert the change done to
snd_pcm_xfern_frames_ioctl() by commit f3d233daf011 ("ALSA: pcm: Relax
__free() variable declarations") to avoid a variable declared with
cleanup from existing between multiple uses of asm goto. There are no
other uses of cleanup in this function so there should be low risk from
moving this variable back to the top of the function.

Link: https://github.com/ClangBuiltLinux/linux/issues/1886 [1]
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202512190802.i4Jzbcsl-lkp@intel.com/
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
Link: https://patch.msgid.link/20260106-pcm_native-revert-var-move-free-for-old-clang-v1-1-06a03693423d@kernel.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>

authored by

Nathan Chancellor and committed by
Takashi Iwai
0585c53b 94968fc3

+2 -2
+2 -2
sound/core/pcm_native.c
··· 3286 3286 { 3287 3287 struct snd_xfern xfern; 3288 3288 struct snd_pcm_runtime *runtime = substream->runtime; 3289 + void *bufs __free(kfree) = NULL; 3289 3290 snd_pcm_sframes_t result; 3290 3291 3291 3292 if (runtime->state == SNDRV_PCM_STATE_OPEN) ··· 3298 3297 if (copy_from_user(&xfern, _xfern, sizeof(xfern))) 3299 3298 return -EFAULT; 3300 3299 3301 - void *bufs __free(kfree) = 3302 - memdup_array_user(xfern.bufs, runtime->channels, sizeof(void *)); 3300 + bufs = memdup_array_user(xfern.bufs, runtime->channels, sizeof(void *)); 3303 3301 if (IS_ERR(bufs)) 3304 3302 return PTR_ERR(bufs); 3305 3303 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)