Как вызвать исходную функцию в живом патче? ⇐ Linux
-
Anonymous
Как вызвать исходную функцию в живом патче?
Я хочу изменить параметры, передаваемые в функцию ядра, с помощью живых патчей, но без изменения логики функции. Ссылаясь на пример Livepatch, предположим, что исходная функция — это func_old(int a), а новая функция — func_new(int a).
Если я вызываю старую функцию непосредственно в новой функции, например:
void func_new(int a){ интервал б = а+1; func_old (б); } Будут ли происходить бесконечные рекурсивные вызовы? Как следует избегать такой ситуации?
func_old не виден патчу и вызовет ошибку «неявного объявления функции». Как этого можно было избежать?
Я попробовал использовать следующий метод, но система зависла после вызова cat /proc/cmdline.
#include static int (*real_cmdline_proc_show)(struct seq_file *m, void *v); static int fh_cmdline_proc_show (struct seq_file *m, void *v) { интервал врет; seq_printf(m, "%s\n", "это было перехвачено ftrace"); ret = real_cmdline_proc_show(m, v); pr_debug("cmdline_proc_show() возвращает: %ld\n", ret); вернуть возврат; } статическая структура klp_func funcs[] = { { .old_name = "cmdline_proc_show", .new_func = fh_cmdline_proc_show, }, { } }; статическая структура klp_object objs[] = { { /* имя NULL означает vmlinux */ .funcs = функции, }, { } }; статическая структура klp_patch patch = { .mod = ЭТОТ_МОДУЛЬ, .objs = объекты, }; статический int livepatch_init (недействительный) { int result = klp_enable_patch(&patch); int (*real_cmdline_proc_show)(struct seq_file *m, void *v) = funcs[0].old_func; вернуть результат } статическая пустота livepatch_exit(void) { } Module_init (livepatch_init); модуль_exit (livepatch_exit); MODULE_LICENSE("GPL"); MODULE_INFO(живое обновление, "Y");
Я хочу изменить параметры, передаваемые в функцию ядра, с помощью живых патчей, но без изменения логики функции. Ссылаясь на пример Livepatch, предположим, что исходная функция — это func_old(int a), а новая функция — func_new(int a).
Если я вызываю старую функцию непосредственно в новой функции, например:
void func_new(int a){ интервал б = а+1; func_old (б); } Будут ли происходить бесконечные рекурсивные вызовы? Как следует избегать такой ситуации?
func_old не виден патчу и вызовет ошибку «неявного объявления функции». Как этого можно было избежать?
Я попробовал использовать следующий метод, но система зависла после вызова cat /proc/cmdline.
#include static int (*real_cmdline_proc_show)(struct seq_file *m, void *v); static int fh_cmdline_proc_show (struct seq_file *m, void *v) { интервал врет; seq_printf(m, "%s\n", "это было перехвачено ftrace"); ret = real_cmdline_proc_show(m, v); pr_debug("cmdline_proc_show() возвращает: %ld\n", ret); вернуть возврат; } статическая структура klp_func funcs[] = { { .old_name = "cmdline_proc_show", .new_func = fh_cmdline_proc_show, }, { } }; статическая структура klp_object objs[] = { { /* имя NULL означает vmlinux */ .funcs = функции, }, { } }; статическая структура klp_patch patch = { .mod = ЭТОТ_МОДУЛЬ, .objs = объекты, }; статический int livepatch_init (недействительный) { int result = klp_enable_patch(&patch); int (*real_cmdline_proc_show)(struct seq_file *m, void *v) = funcs[0].old_func; вернуть результат } статическая пустота livepatch_exit(void) { } Module_init (livepatch_init); модуль_exit (livepatch_exit); MODULE_LICENSE("GPL"); MODULE_INFO(живое обновление, "Y");
Мобильная версия