我正在编写一个内核模块,它劫持了几个系统调用。其中几个系统调用将路径作为参数。出于我的目的,我需要使用完整路径,但由于这些参数是作为字符串传递的,因此可以是"documents"、"/home/main/../bob"或"../lib"等任何内容。我需要获得这些引用的真实的路径,但我不知道使用哪个函数或需要哪些信息(例如,当前工作目录等)。显然,内核有某种方法可以使路径标准化,以便它可以执行SELinux、IMA和许多其他操作所必需的操作。
"documents"
"/home/main/../bob"
"../lib"
jhdbpxl91#
char *get_full_path(int dfd, const char *__user fname) { struct path tmp_path; unsigned int lookup_flags = LOOKUP_EMPTY; #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0) int error = user_path_at(dfd, fname, lookup_flags, &tmp_path); #else int empty = 0; int error = user_path_at_empty(dfd, fname, lookup_flags, &tmp_path, &empty); #endif if (0 == error) { char tpath[512] = { 0 }; char *p_full_path = d_path(&tmp_path, tpath, 512); return p_full_path; } return ""; }
1条答案
按热度按时间jhdbpxl91#