Подробности

[В начало]

Проблема в реализации № L0019

Краткое описание

drivers/mtd/mtd_blkdevs.c: Небезопасный вызов функции module_put

Подробное описание

В драйвере drivers/mtd/mtd_blkdevs.c в функции blktrans_open:

  • 1. Если в строке 140 условие try_module_get(tr->owner) == 0 - выполняется, тогда мы идем на строку 152 (метка out_tr)
  • 2. В строке 152 (метка out_tr): вызываем module_put над выгруженным драйвером.
  • 131 static int blktrans_open(struct block_device *bdev, fmode_t mode)
    132 {
    133         struct mtd_blktrans_dev *dev = bdev->bd_disk->private_data;
    134         struct mtd_blktrans_ops *tr = dev->tr;
    135         int ret = -ENODEV;
    136
    137         if (!get_mtd_device(NULL, dev->mtd->index))
    138                 goto out;
    139
    140         if (!try_module_get(tr->owner))
    141                 goto out_tr;
    142
    143         /* FIXME: Locking. A hot pluggable device can go away
    144            (del_mtd_device can be called for it) without its module
    145            being unloaded. */
    146         dev->mtd->usecount++;
    147
    148         ret = 0;
    149         if (tr->open && (ret = tr->open(dev))) {
    150                 dev->mtd->usecount--;
    151                 put_mtd_device(dev->mtd);
    152         out_tr:
    153                 module_put(tr->owner);
    154         }
    155  out:
    156         return ret;
    157 }
    

    Способ воспроизведения

    заменить:

    141                 goto out_tr;
    
    на
    141                 goto out;
    

    Компонент

    linux-kernel 2.6.32.6

    Принято

    http://lkml.org/lkml/2010/1/12/246
    commit

    Статус

    Исправлено в ядре 2.6.35

    [В начало]