control: use reference-counted pid
Instead of storing the PID number, take a reference to the task's pid structure. This protects against duplicates due to PID overflows, and using pid_vnr() ensures that the PID returned by snd_ctl_elem_info() is correct as seen from the current namespace. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
committed by
Takashi Iwai
parent
31cef7076e
commit
25d27eded1
@@ -75,7 +75,7 @@ static int snd_ctl_open(struct inode *inode, struct file *file)
|
||||
ctl->card = card;
|
||||
ctl->prefer_pcm_subdevice = -1;
|
||||
ctl->prefer_rawmidi_subdevice = -1;
|
||||
ctl->pid = current->pid;
|
||||
ctl->pid = get_pid(task_pid(current));
|
||||
file->private_data = ctl;
|
||||
write_lock_irqsave(&card->ctl_files_rwlock, flags);
|
||||
list_add_tail(&ctl->list, &card->ctl_files);
|
||||
@@ -125,6 +125,7 @@ static int snd_ctl_release(struct inode *inode, struct file *file)
|
||||
control->vd[idx].owner = NULL;
|
||||
up_write(&card->controls_rwsem);
|
||||
snd_ctl_empty_read_queue(ctl);
|
||||
put_pid(ctl->pid);
|
||||
kfree(ctl);
|
||||
module_put(card->module);
|
||||
snd_card_file_remove(card, file);
|
||||
@@ -672,7 +673,7 @@ static int snd_ctl_elem_info(struct snd_ctl_file *ctl,
|
||||
info->access |= SNDRV_CTL_ELEM_ACCESS_LOCK;
|
||||
if (vd->owner == ctl)
|
||||
info->access |= SNDRV_CTL_ELEM_ACCESS_OWNER;
|
||||
info->owner = vd->owner->pid;
|
||||
info->owner = pid_vnr(vd->owner->pid);
|
||||
} else {
|
||||
info->owner = -1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user