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 | 536 | struct snd_rawmidi_file *rfile; |
| 537 | 537 | struct snd_rawmidi *rmidi; |
| 538 | + struct module *module; | |
| 538 | 539 | |
| 539 | 540 | rfile = file->private_data; |
| 540 | 541 | rmidi = rfile->rmidi; |
| 541 | 542 | rawmidi_release_priv(rfile); |
| 542 | 543 | kfree(rfile); |
| 544 | + module = rmidi->card->module; | |
| 543 | 545 | snd_card_file_remove(rmidi->card, file); |
| 544 | − module_put(rmidi->card->module); | |
| 546 | + module_put(module); | |
| 545 | 547 | return 0; |
| 546 | 548 | } |
| 547 | 549 | |