envp в системном вызове execve не содержит ничего, кроме строки "LS_ C" - PullRequest
0 голосов
/ 17 февраля 2020

Я запугивал простой монитор, который печатает путь к исполняемому файлу, поэтому я подключил системный вызов execve, но проблема заключалась в том, что параметр имени файла содержал только имя файла, а не весь путь. В любом случае, я скопировал параметр envp и напечатал каждую строку в нем, но результат был просто LS_ C, поэтому мне интересно, где системный вызов execve получает путь от этого - мой код:

static asmlinkage long our_execl(const char __user * filename,
            const char __user * const __user * argv,
            const char __user * const __user * envp) {
copy_from_user(mid,envp,sizeof(envp));
 printk("okdotk:%d\n",sizeof(envp));
for(i=0;i<sizeof(envp);i++)
{
strncpy_from_user(env, mid[i], sizeof(mid[i]));
env[255]='\0';
printk("%s\n",env);

reset_envp(sizeof(env));
}

вернуть original_call (имя файла, argv, envp)}

1 Ответ

2 голосов
/ 17 февраля 2020

sizeof(envp) - это указатель sizeof, который в вашей системе равен 4. Это не длина массива.

Следовательно, ваш код просто показывает первые 4 буквы LS_C одной переменной среды LS_COLOR=..

Вместо этого вы должны выполнять итерацию до тех пор, пока envp[i] не станет NULL, сигнализируя об окончании среды , Для каждой переменной среды вы должны копировать, пока не увидите \0, и снова не останавливаться после первых 4 байтов.

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