mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 04:04:43 +01:00
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 commitf3d233daf0("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 commitf3d233daf0("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>
This commit is contained in:
parent
94968fc300
commit
0585c53b21
1 changed files with 2 additions and 2 deletions
|
|
@ -3286,6 +3286,7 @@ static int snd_pcm_xfern_frames_ioctl(struct snd_pcm_substream *substream,
|
|||
{
|
||||
struct snd_xfern xfern;
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
void *bufs __free(kfree) = NULL;
|
||||
snd_pcm_sframes_t result;
|
||||
|
||||
if (runtime->state == SNDRV_PCM_STATE_OPEN)
|
||||
|
|
@ -3297,8 +3298,7 @@ static int snd_pcm_xfern_frames_ioctl(struct snd_pcm_substream *substream,
|
|||
if (copy_from_user(&xfern, _xfern, sizeof(xfern)))
|
||||
return -EFAULT;
|
||||
|
||||
void *bufs __free(kfree) =
|
||||
memdup_array_user(xfern.bufs, runtime->channels, sizeof(void *));
|
||||
bufs = memdup_array_user(xfern.bufs, runtime->channels, sizeof(void *));
|
||||
if (IS_ERR(bufs))
|
||||
return PTR_ERR(bufs);
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue