ALSA: Add a reference counter to card instance
For more strict protection for wild disconnections, a refcount is introduced to the card instance, and let it up/down when an object is referred via snd_lookup_*() in the open ops. The free-after-last-close check is also changed to check this refcount instead of the empty list, too. Reported-by: Matthieu CASTET <matthieu.castet@parrot.com> Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
888ea7d5ac
commit
a0830dbd4e
11 changed files with 86 additions and 32 deletions
|
|
@ -132,6 +132,7 @@ struct snd_card {
|
|||
int shutdown; /* this card is going down */
|
||||
int free_on_last_close; /* free in context of file_release */
|
||||
wait_queue_head_t shutdown_sleep;
|
||||
atomic_t refcount; /* refcount for disconnection */
|
||||
struct device *dev; /* device assigned to this card */
|
||||
struct device *card_dev; /* cardX object for sysfs */
|
||||
|
||||
|
|
@ -189,6 +190,7 @@ struct snd_minor {
|
|||
const struct file_operations *f_ops; /* file operations */
|
||||
void *private_data; /* private data for f_ops->open */
|
||||
struct device *dev; /* device for sysfs */
|
||||
struct snd_card *card_ptr; /* assigned card instance */
|
||||
};
|
||||
|
||||
/* return a device pointer linked to each sound device as a parent */
|
||||
|
|
@ -295,6 +297,7 @@ int snd_card_info_done(void);
|
|||
int snd_component_add(struct snd_card *card, const char *component);
|
||||
int snd_card_file_add(struct snd_card *card, struct file *file);
|
||||
int snd_card_file_remove(struct snd_card *card, struct file *file);
|
||||
void snd_card_unref(struct snd_card *card);
|
||||
|
||||
#define snd_card_set_dev(card, devptr) ((card)->dev = (devptr))
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue