【问题标题】:unable to handle kernel null pointer dereference无法处理内核空指针取消引用
【发布时间】:2012-12-27 04:37:30
【问题描述】:

我在使用内核模块时遇到无法处理内核空指针取消引用错误。 这是我正在尝试做的事情

inputfile = filp_open(kernel_args->infile, O_RDONLY, 0); //Open a file

if(inputfile == NULL) //Check if the file exists
{
    printk("\nInput file not found on drive\n");
    error = -ENOENT;
    goto quit;
}

但内核在检查 null 时给了我一个“哎呀”。我不知道如何避免它,因为我正在检查 null 并做我应该做的事情。

【问题讨论】:

  • 这就是inputfile的全部内容?
  • 您是否检查了kernel_args->infile 以确保它不为NULL?
  • 在 about 代码之前,唯一一次使用 inputfile,用于声明 'struct file *inputfile = NULL;' kernel_args->infile 不是 NULL
  • @haunteddevil619:调用filp_open之后对inputfile的引用呢?
  • @K-ballo 在翻转打开后没有引用。代码和我发布的一样

标签: c oop linux-kernel kernel-module kernel


【解决方案1】:

看来您怀疑是错误的指针,唯一可能在您的代码中产生此类 oops 的指针是 kernel_args。

更多提示: - 内核是受信任的代码,你不应该检查 NULL 指针(除非你正在编写内核模块测试等) - 您的 printk 使用错误,您缺少 printk 日志级别,例如:printk(KERN_ALERT "Hello world\n");

【讨论】:

    【解决方案2】:

    检查内核空间参数的有效性。

    喜欢:

    if (!kargs)
        if(kargs->infile == NULL)
    

    【讨论】:

      【解决方案3】:

      由于 filp_open 在出错时不会返回 NULL,因此您应该使用 IS_ERR 来检查错误发生情况。

      喜欢:

      if(IS_ERR(inputfile))
          goto quit;
      

      【讨论】:

        猜你喜欢
        • 2010-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 2015-12-31
        • 2016-05-16
        相关资源
        最近更新 更多