CUSE - сбой, если размер переданного указателя в IOCTL> 128k - PullRequest
0 голосов
/ 08 июля 2019

Я использую драйвер CUSE для одного из моих проектов, где я создал свои собственные IOCTL. После передачи указателя на структуру из пространства процесса я успешно могу извлечь ее в пространстве CUSE, используя:

in_iov[0].iov_base = arg;
in_iov[0].iov_len = sizeof(struct my_struct);
if (!in_bufsz) {
        fuse_reply_ioctl_retry(req, in_iov, 1, NULL, 0);
    return;
}
my_struct *ptr = in_buf;

in_buf += sizeof(struct my_struct);
in_bufsz -= sizeof(struct my_struct);

Проблема возникает в следующем месте, указатель на только что найденную структуру указывает на указатель данных, размер которого может быть от 0 до 2 ^ 28

in_iov[1].iov_base = ptr->data_buf_ptr;
in_iov[1].iov_len = ptr->data_buf_size;
if (!in_bufsz) {
    fuse_reply_ioctl_retry(req, in_iov, 2, NULL, 0);
    return;
}

, который должен работать, как ожидается, с возвращением полезного указателя в in_buf. Тем не менее, при наблюдении, похоже, что если ptr-> data_buf_size> 127,000, драйвер падает. Мне не удалось найти ссылку, которая бы объясняла такую ​​ограниченность размера передачи данных, Кроме того, использование нескольких fuse_reply_ioctl_retry с меньшими размерами буфера ниже 127000 на нескольких итерациях также не работает

...