Безопасно ли вызывать copy_from_user с адресом пространства ядра после set_fs(KERNEL_DS)?Linux

Ответить
Anonymous
 Безопасно ли вызывать copy_from_user с адресом пространства ядра после set_fs(KERNEL_DS)?

Сообщение Anonymous »

Я разрабатываю модуль ядра Linux в ядре-4.9.168, по какой-то причине я хочу вызвать файловые операции другого модуля (vfio). Модуль vfio предоставляет некоторые операции с файлами, такие как запись, в основном это выглядит следующим образом:

Код: Выделить всё

static ssize_t do_io_rw(struct vfio_pci_device *vdev, bool test_mem,
void __iomem *io, char __user *buf,
loff_t off, size_t count, size_t x_start,
size_t x_end, bool iswrite)
{
ssize_t done = 0;
int ret;

while (count) {
size_t fillable, filled;

if (off < x_start)
fillable = min(count, (size_t)(x_start - off));
else if (off >= x_end)
fillable = count;
else
fillable = 0;

if (fillable >= 4 && !(off % 4)) {
u32 val;

if (iswrite) {
if (copy_from_user(&val, buf, 4))
return -EFAULT;

ret = vfio_pci_iowrite32(vdev, test_mem,
val, io + off);
if (ret)
return ret;
}
Я знаю, что copy_from_user проверит, является ли адрес пользовательским пространством, сравнивая addr_limit с аргументом buf, поэтому в моем собственном модуле я использую kernel_write для обхода проверки пользовательского пространства следующим образом:

Код: Выделить всё

static int my_module_code(struct file *file, struct vhost_virtqueue *vvq)
{
loff_t pos = yyy;
unsigned int *idx = &vvq->idx;

return __kernel_write(file, (char *)idx, 2, &pos);
}
kernel_write установит_fs(KERNEL_DS) перед вызовом file->ops->write, это работает нормально, но мне некомфортно работать с моим кодом, ведь copy_from_user назван пользователем.
Так безопасен ли мой код? или есть лучший способ справиться с этим?

Подробнее здесь: https://stackoverflow.com/questions/792 ... t-fskernel
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»