kern_path (): не удалось вернуть родительский путь в новой версии 4.4. * Ядра Linux

linux amazon-web-services linux-kernel

487 просмотра

2 ответа

6 Репутация автора

Я пытаюсь получить родительский путь от kern_path()функции, она возвращает ошибку -2в новых машинах с ядром Amazon Linux 4.4. *.

Как получить родительский путь в 4.4. * Ядре Linux?

/tmp/TestFVT/files/fileXX-12345678989 ===> /tmp/TestFVT/files

Похоже на этот вопрос .

Ниже показан исходный код и вывод.

Привет

#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" для несуществующих файлов, который отлично работал в предыдущих версиях.

Автор: Varaprasad Источник Размещён: 18.07.2016 12:41

Ответы (2)


0 плюса

6 Репутация автора

====> Модифицированный код

#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.
}

=====> Реализован нижеприведенный код, но память процесса повреждается и падает. Не в состоянии понять, почему он терпит крах? Пожалуйста, дайте мне знать, что является проблемами в коде ниже или 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;
}
Автор: Varaprasad Размещён: 03.08.2016 11:00

0 плюса

1 Репутация автора

используйте эту функцию -> kallsyms_lookup_name ("filename_parentat"), чтобы получить указатель на функцию, чем yo

Автор: kevin_fxf Размещён: 21.07.2017 02:04
Вопросы из категории :
32x32