我试图从kern_path()
函数获取父路径,它在新的Amazon Linux内核4.4。*机器中返回错误-2
。
如何在4.4。* Linux内核中获取父路径?
/tmp/TestFVT/files/fileXX-12345678989 ===> /tmp/TestFVT/files
与this issue类似。
以下是显示的源代码和输出。
的hello.c
#include <linux/module.h> // included for all kernel modules
#include <linux/kernel.h> // included for KERN_INFO
#include <linux/init.h> // included for __init and __exit macros
#include <linux/mount.h>
#include <linux/path.h>
#include <linux/namei.h>
#include <linux/fs.h>
#include <linux/string.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A Simple Hello World module");
char *path_name1 = "/tmp/TestFVT/files/fileXX-1234567898"; //Existing FIle
char *path_name3 = "/tmp/TestFVT/files/fileXX-12345678989"; //NON Existing FILE
static int __init hello_init(void)
{
struct path path1, path3;
int err = kern_path(path_name1, LOOKUP_PARENT, &path1);
printk("Path name1 : %s, err: %d\n", path_name1, err);
err = kern_path(path_name3, LOOKUP_DIRECTORY, &path3);
printk("Path name3-1 : %s, err: %d\n", path_name3, err);
err = kern_path(path_name3, LOOKUP_PARENT, &path3);
printk("Path name3-2 : %s, err: %d\n", path_name3, err);
return 0; // Non-zero return means that the module couldn't be loaded.
}
static void __exit hello_cleanup(void)
{
printk(KERN_INFO "Cleaning up module.\n");
}
module_init(hello_init);
module_exit(hello_cleanup);
输出:
[ 120.167328] Path name1 : /tmp/TestFVT/files/fileXX-1234567898, err: 0
[ 120.184955] Path name3-1 : /tmp/TestFVT/files/fileXX-12345678989, err: -2
[ 120.189614] Path name3-2 : /tmp/TestFVT/files/fileXX-12345678989, err: -2
预期输出:
"/tmp/TestFVT/files"
表示非现有文件,在以前的版本中运行良好。
答案 0 :(得分:0)
====&GT;修改后的代码
#include <linux/fs_struct.h>
static int __init hello_init(void){
struct path path1, path3;
int err = kern_path(path_name1, LOOKUP_PARENT, &path1);
printk("Path name1 : %s, err: %d\n", path_name1, err);
if(err == -2)
err = checkParentPathExist(path_name1, &path1);
printk("Path name1 : %s, err: %d\n", path_name1, err);
return 0; // Non-zero return means that the module couldn't be loaded.
}
=====&GT; 在代码下面实现,但进程内存损坏并崩溃。无法理解为什么会崩溃?请告诉我,以下代码或kern_path()中的问题是什么?
static int checkParentPathExist(char *tmpPath, struct path* path){
char *tmpPath4 = NULL;
int err, flag = 0;
switch(tmpPath[0]){
case '/':
case '.':
break;
default:{
char *fname = (char *) __get_free_page(GFP_KERNEL);
if (!fname){
return -1;
}
memset(fname, 0, PAGE_SIZE);
struct path pwd = current->fs->pwd;
path_get(&pwd);
tmpPath4 = d_path(&pwd, fname, PAGE_SIZE);
path_put(&pwd);
strcat(tmpPath4,"/");
strcat(tmpPath4,tmpPath);
free_page(((unsigned long) fname));
}
}
if(tmpPath4 == NULL){
flag = 1;
tmpPath4 = (char *) kmalloc(strlen(tmpPath)+1, GFP_KERNEL);
if (!tmpPath4)
return -1;
memset(tmpPath4, 0, strlen(tmpPath)+1);
strcpy(tmpPath4, tmpPath);
}
int indx=0, setIndx=0;
for(;tmpPath4[indx];indx++)
if(tmpPath4[indx] == '/')
setIndx = indx;
tmpPath4[setIndx] = 0;
/*================ Getting Issue ================
Below line issue is (err = kern_path(tmpPath4, LOOKUP_DIRECTORY, path);)
1. Working fine, and returning success with parent path.
2. Problem is other process memory is getting corrupted.
3. Getting continues crashes with bellow message
i. BUG: Bad page state in process
ii. BUG: Bad page map in process
Message from syslogd@ip-172-31-30-235 at Aug 3 07:20:44 ...
kernel:[ 24.017598] page:ffffea0000eb8380 count:-1 mapcount:0 mapping: (null) index:0x0
4. No crashes if below line is commented
*/
err = kern_path(tmpPath4, LOOKUP_DIRECTORY, path);
if(flag) {
kfree(tmpPath4);
}
return err;
}
答案 1 :(得分:0)
使用此功能 - &gt; kallsyms_lookup_name(“filename_parentat”)获取func指针,而不是yo