Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-or-later 2 : : /* 3 : : * 32bit -> 64bit ioctl wrapper for hwdep API 4 : : * Copyright (c) by Takashi Iwai <tiwai@suse.de> 5 : : */ 6 : : 7 : : /* This file is included from hwdep.c */ 8 : : 9 : : #include <linux/compat.h> 10 : : 11 : : struct snd_hwdep_dsp_image32 { 12 : : u32 index; 13 : : unsigned char name[64]; 14 : : u32 image; /* pointer */ 15 : : u32 length; 16 : : u32 driver_data; 17 : : } /* don't set packed attribute here */; 18 : : 19 : 0 : static int snd_hwdep_dsp_load_compat(struct snd_hwdep *hw, 20 : : struct snd_hwdep_dsp_image32 __user *src) 21 : : { 22 : 0 : struct snd_hwdep_dsp_image __user *dst; 23 : 0 : compat_caddr_t ptr; 24 : 0 : u32 val; 25 : : 26 : 0 : dst = compat_alloc_user_space(sizeof(*dst)); 27 : : 28 : : /* index and name */ 29 [ # # # # ]: 0 : if (copy_in_user(dst, src, 4 + 64)) 30 : 0 : return -EFAULT; 31 [ # # ]: 0 : if (get_user(ptr, &src->image) || 32 [ # # ]: 0 : put_user(compat_ptr(ptr), &dst->image)) 33 : : return -EFAULT; 34 [ # # ]: 0 : if (get_user(val, &src->length) || 35 [ # # ]: 0 : put_user(val, &dst->length)) 36 : : return -EFAULT; 37 [ # # ]: 0 : if (get_user(val, &src->driver_data) || 38 [ # # ]: 0 : put_user(val, &dst->driver_data)) 39 : : return -EFAULT; 40 : : 41 : 0 : return snd_hwdep_dsp_load(hw, dst); 42 : : } 43 : : 44 : : enum { 45 : : SNDRV_HWDEP_IOCTL_DSP_LOAD32 = _IOW('H', 0x03, struct snd_hwdep_dsp_image32) 46 : : }; 47 : : 48 : 0 : static long snd_hwdep_ioctl_compat(struct file * file, unsigned int cmd, 49 : : unsigned long arg) 50 : : { 51 : 0 : struct snd_hwdep *hw = file->private_data; 52 [ # # # ]: 0 : void __user *argp = compat_ptr(arg); 53 [ # # # ]: 0 : switch (cmd) { 54 : 0 : case SNDRV_HWDEP_IOCTL_PVERSION: 55 : : case SNDRV_HWDEP_IOCTL_INFO: 56 : : case SNDRV_HWDEP_IOCTL_DSP_STATUS: 57 : 0 : return snd_hwdep_ioctl(file, cmd, (unsigned long)argp); 58 : 0 : case SNDRV_HWDEP_IOCTL_DSP_LOAD32: 59 : 0 : return snd_hwdep_dsp_load_compat(hw, argp); 60 : : } 61 [ # # ]: 0 : if (hw->ops.ioctl_compat) 62 : 0 : return hw->ops.ioctl_compat(hw, file, cmd, arg); 63 : : return -ENOIOCTLCMD; 64 : : }