- if (! data->indirect) {
- switch (type) {
- case SNDRV_CTL_ELEM_TYPE_BOOLEAN:
- case SNDRV_CTL_ELEM_TYPE_INTEGER:
- for (i = 0; i < 128; i++)
- data->value.integer.value[i] = data32->value.integer.value[i];
- break;
- case SNDRV_CTL_ELEM_TYPE_INTEGER64:
- for (i = 0; i < 64; i++)
- data->value.integer64.value[i] = data32->value.integer64.value[i];
- break;
- case SNDRV_CTL_ELEM_TYPE_ENUMERATED:
- for (i = 0; i < 128; i++)
- data->value.enumerated.item[i] = data32->value.enumerated.item[i];
- break;
- case SNDRV_CTL_ELEM_TYPE_BYTES:
- memcpy(data->value.bytes.data, data32->value.bytes.data,
- sizeof(data->value.bytes.data));
- break;
- case SNDRV_CTL_ELEM_TYPE_IEC958:
- data->value.iec958 = data32->value.iec958;
- break;
- default:
- printk("unknown type %d\n", type);
- break;
+
+ switch (type) {
+ case SNDRV_CTL_ELEM_TYPE_BOOLEAN:
+ case SNDRV_CTL_ELEM_TYPE_INTEGER:
+ for (i = 0; i < 128; i++) {
+ int val;
+ if (__get_user(val, &data32->value.integer[i])) {
+ err = -EFAULT;
+ goto __end;
+ }
+ data->value.integer.value[i] = val;
+ }
+ break;
+ case SNDRV_CTL_ELEM_TYPE_INTEGER64:
+ case SNDRV_CTL_ELEM_TYPE_ENUMERATED:
+ case SNDRV_CTL_ELEM_TYPE_BYTES:
+ case SNDRV_CTL_ELEM_TYPE_IEC958:
+ if (__copy_from_user(data->value.bytes.data,
+ data32->value.data,
+ sizeof(data32->value.data))) {
+ err = -EFAULT;
+ goto __end;