Skip to content

Commit

Permalink
ALSA: seq: obsolete change of address limit
Browse files Browse the repository at this point in the history
Former commits change existent functions so that they don't handle data in
kernel space. Copying from/to userspace is done outside of the functions,
thus no need to change address limit of running task.

This commit obsoletes get_fs()/set_fs() and applies corresponding changes.

Signed-off-by: Takashi Sakamoto <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
takaswie authored and tiwai committed Aug 22, 2016
1 parent 04a56dd commit e12ec25
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 78 deletions.
73 changes: 5 additions & 68 deletions sound/core/seq/seq_clientmgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,21 +85,6 @@ static int snd_seq_deliver_single_event(struct snd_seq_client *client,
struct snd_seq_event *event,
int filter, int atomic, int hop);

/*
*/

static inline mm_segment_t snd_enter_user(void)
{
mm_segment_t fs = get_fs();
set_fs(get_ds());
return fs;
}

static inline void snd_leave_user(mm_segment_t fs)
{
set_fs(fs);
}

/*
*/
static inline unsigned short snd_seq_file_flags(struct file *file)
Expand Down Expand Up @@ -2094,14 +2079,8 @@ static const struct ioctl_handler {
{ 0, NULL },
};

static struct seq_ioctl_table {
unsigned int cmd;
int (*func)(struct snd_seq_client *client, void __user * arg);
} ioctl_tables[] = {
{ 0, NULL },
};

static long seq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
static long snd_seq_ioctl(struct file *file, unsigned int cmd,
unsigned long arg)
{
struct snd_seq_client *client = file->private_data;
/* To use kernel stack for ioctl data. */
Expand Down Expand Up @@ -2158,45 +2137,6 @@ static long seq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
return err;
}

static int snd_seq_do_ioctl(struct snd_seq_client *client, unsigned int cmd,
void __user *arg)
{
struct seq_ioctl_table *p;

switch (cmd) {
case SNDRV_SEQ_IOCTL_PVERSION:
/* return sequencer version number */
return put_user(SNDRV_SEQ_VERSION, (int __user *)arg) ? -EFAULT : 0;
case SNDRV_SEQ_IOCTL_CLIENT_ID:
/* return the id of this client */
return put_user(client->number, (int __user *)arg) ? -EFAULT : 0;
}

if (! arg)
return -EFAULT;
for (p = ioctl_tables; p->cmd; p++) {
if (p->cmd == cmd)
return p->func(client, arg);
}
pr_debug("ALSA: seq unknown ioctl() 0x%x (type='%c', number=0x%02x)\n",
cmd, _IOC_TYPE(cmd), _IOC_NR(cmd));
return -ENOTTY;
}


static long snd_seq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
struct snd_seq_client *client = file->private_data;

if (seq_ioctl(file, cmd, arg) >= 0)
return 0;

if (snd_BUG_ON(!client))
return -ENXIO;

return snd_seq_do_ioctl(client, cmd, (void __user *) arg);
}

#ifdef CONFIG_COMPAT
#include "seq_compat.c"
#else
Expand Down Expand Up @@ -2396,8 +2336,6 @@ int snd_seq_kernel_client_ctl(int clientid, unsigned int cmd, void *arg)
{
const struct ioctl_handler *handler;
struct snd_seq_client *client;
mm_segment_t fs;
int result;

client = clientptr(clientid);
if (client == NULL)
Expand All @@ -2408,10 +2346,9 @@ int snd_seq_kernel_client_ctl(int clientid, unsigned int cmd, void *arg)
return handler->func(client, arg);
}

fs = snd_enter_user();
result = snd_seq_do_ioctl(client, cmd, (void __force __user *)arg);
snd_leave_user(fs);
return result;
pr_debug("ALSA: seq unknown ioctl() 0x%x (type='%c', number=0x%02x)\n",
cmd, _IOC_TYPE(cmd), _IOC_NR(cmd));
return -ENOTTY;
}

EXPORT_SYMBOL(snd_seq_kernel_client_ctl);
Expand Down
12 changes: 2 additions & 10 deletions sound/core/seq/seq_compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ static int snd_seq_call_port_info_ioctl(struct snd_seq_client *client, unsigned
{
int err = -EFAULT;
struct snd_seq_port_info *data;
mm_segment_t fs;

data = kmalloc(sizeof(*data), GFP_KERNEL);
if (!data)
Expand All @@ -59,12 +58,7 @@ static int snd_seq_call_port_info_ioctl(struct snd_seq_client *client, unsigned
goto error;
data->kernel = NULL;

if (snd_seq_kernel_client_ctl(client->number, cmd, &data) >= 0)
return 0;

fs = snd_enter_user();
err = snd_seq_do_ioctl(client, cmd, data);
snd_leave_user(fs);
err = snd_seq_kernel_client_ctl(client->number, cmd, &data);
if (err < 0)
goto error;

Expand Down Expand Up @@ -126,9 +120,7 @@ static long snd_seq_ioctl_compat(struct file *file, unsigned int cmd, unsigned l
case SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION:
case SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT:
case SNDRV_SEQ_IOCTL_RUNNING_MODE:
if (seq_ioctl(file, cmd, arg) >= 0)
return 0;
return snd_seq_do_ioctl(client, cmd, argp);
return snd_seq_ioctl(file, cmd, arg);
case SNDRV_SEQ_IOCTL_CREATE_PORT32:
return snd_seq_call_port_info_ioctl(client, SNDRV_SEQ_IOCTL_CREATE_PORT, argp);
case SNDRV_SEQ_IOCTL_DELETE_PORT32:
Expand Down

0 comments on commit e12ec25

Please sign in to comment.