сделать свой собственный / dev / random, буфер не работает, c - PullRequest
1 голос
/ 01 апреля 2012

Мне нужно создать драйвер устройства, который возвращает случайное число от 1 до 50, и я не совсем понимаю, как работает буфер для моего драйвера устройства и как заставить его вести себя как /dev/random.

.

Я сделал тестовую программу, чтобы увидеть, как работает / dev / random:

int test_read = open("/dev/random", O_RDONLY);
int get_random_num(void) {

  unsigned int random_num;
  read(test_read, &random_num, sizeof(random_num));
  return (random_num % 50) + 1;
}

и затем это функция чтения моего драйвера устройства (сжатая версия):

my_random_read(struct file* file, char* buf,
                      size_t count, loff_t* ppos)
{
    unsigned int random_num; 
    get_random_bytes(&random_num, 1);
    int my_num = 1 + (random_num % 50)

    int* my_num_pointer = &my_num;

    copy_to_user(buf, my_num_pointer, count);
}

когда я запускаю свой тестер в QEMU, я получаю -1074311964: /

как мне сделать так, чтобы все, что мне нужно было сделать, это заменить / dev / random на / dev / my_random ??

вот как я читаю из / dev / my_random:

    read(test_read, &random_number, sizeof(random_number), 0);

1 Ответ

2 голосов
/ 01 апреля 2012
unsigned int random_num; 
get_random_bytes(&random_num, 1);

Вы используете get_random_bytes() неправильно.Второй параметр - это количество байтов, а не слов:

void get_random_bytes(void *buf, int nbytes)

Далее вы возвращаете личную память ядра в пространство пользователя:

my_random_read(struct file* file, char* buf,
                      size_t count, loff_t* ppos)
{
    /* ... */
    int* my_num_pointer = &my_num;
    copy_to_user(buf, my_num_pointer, count);
}

Вывыполнено нет проверок count - здесь у вас есть только один, может быть, два байта фактических случайных данных.Остальные данные - это данные стека мусора, и вы просочились сюда.Это недостаток безопасности - ядро ​​не должно пропускать неинициализированные данные в пространство пользователя.(Можно полагаться на это самостоятельно, но злоумышленник, который запрашивает десять страниц данных из /dev/random, не должен получать сырую память ядра.)

...