Просто в дополнение к ответу Марко.
Если что-то идет не так, вы всегда можете посмотреть, как это уже реализовано. К счастью, источники открыты, и любой может получить к ним доступ.
В частности, здесь вы хотите использовать некоторую «строку» (указатель на char) в обработчике syscall, который поступает из пользовательского режима. Таким образом, вы можете взглянуть на то, как обрабатываются такие строки в реальных системных вызовах. Например, do_execve()
для execve
системного вызова:
SYSCALL_DEFINE3(execve,
const char __user *, filename,
const char __user *const __user *, argv,
const char __user *const __user *, envp)
{
return do_execve(getname(filename), argv, envp);
}
принимает filename
, возвращенное функцией getname()
, которая в конечном итоге вызывает strncpy_from_user()
:
struct filename *
getname_flags(const char __user *filename, int flags, int *empty)
{
//...
len = strncpy_from_user(kname, filename, EMBEDDED_NAME_MAX);
if (unlikely(len < 0)) {
__putname(result);
return ERR_PTR(len);
}
//...