When a driver module is unloaded and the last still open file is a raw MIDI device, the card and its devices will be actually freed in the snd_card_file_remove() call when that file is closed. Afterwards, rmidi and rmidi->card point into freed memory, so the module pointer is likely to be garbage. (This was introduced by commit 9a1b64caac82aa02cb74587ffc798e6f42c6170a.)
Unified · Split
| @@ -535,13 +535,15 @@ static int snd_rawmidi_release(struct inode *inode, struct file *file) · 534 unmodified lines | |||
| 535 | { | 535 | { |
| 536 | struct snd_rawmidi_file *rfile; | 536 | struct snd_rawmidi_file *rfile; |
| 537 | struct snd_rawmidi *rmidi; | 537 | struct snd_rawmidi *rmidi; |
| 538 | struct module *module; | ||
| 538 | 539 | ||
| 539 | rfile = file->private_data; | 540 | rfile = file->private_data; |
| 540 | rmidi = rfile->rmidi; | 541 | rmidi = rfile->rmidi; |
| 541 | rawmidi_release_priv(rfile); | 542 | rawmidi_release_priv(rfile); |
| 542 | kfree(rfile); | 543 | kfree(rfile); |
| 544 | module = rmidi->card->module; | ||
| 543 | snd_card_file_remove(rmidi->card, file); | 545 | snd_card_file_remove(rmidi->card, file); |
| 544 | module_put(rmidi->card->module); | 546 | module_put(module); |
| 545 | return 0; | 547 | return 0; |
| 546 | } | 548 | } |
| 547 | 549 | ||