Как использовать copy_from_user? - PullRequest
2 голосов
/ 28 мая 2011
ssize_t probchar_write(struct file *filp, 
    const char __user *data, size_t s, loff_t *off) {

    printk(KERN_DEBUG "Data> |%s|\n", data); // only for debug
    char chars[MAX_LENGHT];
    if(s > MAX_LENGHT)
        s = MAX_LENGHT;
    if (copy_from_user(chars, data, s)) {
        return -EFAULT;
    }
    printk(KERN_DEBUG "Chars> |%s|\n", chars);
    return s;
}

Это вывод dmesg

[66777.956582] Data> |45
[66777.956596] |
[66777.956634] Chars> |45
[66777.956636] �    Ҩ�H��   H�� |

Почему в конце скопированной цепочки больше символов?

Ответы [ 2 ]

2 голосов
/ 28 мая 2011

Кажется, что это функция записи из драйвера устройства.

Первый

printk(KERN_DEBUG "Data> |%s|\n", data);

Не делай этого! Никогда не обращайтесь к пользовательским данным напрямую!

Второй

char chars[s];

Сомневаюсь, что это допустимо C. Вам нужно либо указать размер во время компиляции, либо использовать kmalloc

Использование copy_from_user - это хорошо. Вы должны проверить на наличие ошибок и вернуть -EFAULT. Это нормально.

Так что просто попробуйте и распределите символы, и это должно сработать. Возможно, вы также захотите взглянуть на смещение, хотя для академических целей его можно изначально пропустить.

0 голосов
/ 22 сентября 2011

Предположим следующее: в конце указанной строки нет \0. Вы не добавляете или не заставляете его присутствовать. Затем вы печатаете строку после копирования «правильных» данных в выделенный стеком буфер, который содержит случайный мусор. Это позволяет печатать дополнительные символы.

Рекомендуемая проверка: выделите MAX_LENGTH + 1 символ и после того, как вы скопировали данные, выполните chars[s]=0. Возможно, вы захотите удалить тот символ \n, который также убивает форматирование вашего журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...