Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “strep”导致Linux内核冻结_Python_C_Linux Kernel_Kernel Module - Fatal编程技术网

Python “strep”导致Linux内核冻结

Python “strep”导致Linux内核冻结,python,c,linux-kernel,kernel-module,Python,C,Linux Kernel,Kernel Module,我在用户空间中有一个程序,可以写入内核模块中的sysfs文件。 我已经指出,崩溃的原因很可能是这个特定的函数,因为当我在达到这一点之前运行用户代码时,它不会崩溃,但是当我添加写代码时,它很可能崩溃。 我怀疑我解析字符串的方式会导致内存错误,但我不明白为什么 我正在开发内核版本3.2和python 2.7 崩溃是指整个系统冻结,我必须重新启动它或将VM恢复到以前的快照 用户编写代码Python: portFile = open(realDstPath, "w") portFile.write(st

我在用户空间中有一个程序,可以写入内核模块中的sysfs文件。 我已经指出,崩溃的原因很可能是这个特定的函数,因为当我在达到这一点之前运行用户代码时,它不会崩溃,但是当我添加写代码时,它很可能崩溃。 我怀疑我解析字符串的方式会导致内存错误,但我不明白为什么

我正在开发内核版本3.2和python 2.7

崩溃是指整个系统冻结,我必须重新启动它或将VM恢复到以前的快照

用户编写代码Python:

portFile = open(realDstPath, "w")
portFile.write(str(ipToint(srcIP)) + "|" + str(srcPort) + "|")
portFile.close()
内核代码:

ssize_t requestDstAddr( struct device *dev,
                         struct device_attribute *attr,
                         const char *buff,
                         size_t count)  
{
    char *token;
    char *localBuff = kmalloc(sizeof(char) * count, GFP_ATOMIC);
    long int temp;

    if(localBuff == NULL)
    {
        printk(KERN_ERR "ERROR: kmalloc failed\n");
        return -1;
    }
    memcpy(localBuff, buff, count);

    spin_lock(&conntabLock);

    //parse values passed from proxy
    token = strsep(&localBuff, "|"); 
    kstrtol(token, 10, &temp);
    requestedSrcIP = htonl(temp);

    token = strsep(&localBuff, "|");
    kstrtol(token, 10, &temp);
    requestedSrcPort = htons(temp);

    spin_unlock(&conntabLock);

    kfree(localBuff);
    return count;
}
仔细观察STREP。发件人:

在代码中,您可以执行以下操作:

char *localBuff = kmalloc(sizeof(char) * count, GFP_ATOMIC)
...
token = strsep(&localBuff, "|");
...
kfree(localBuff);
localBuff变量在strep调用后更新。因此,对kfree的调用不是使用同一个指针。这就允许了非常奇怪的行为。使用临时指针保存strep函数的状态。并检查它的返回值。

仔细查看strep。发件人:

在代码中,您可以执行以下操作:

char *localBuff = kmalloc(sizeof(char) * count, GFP_ATOMIC)
...
token = strsep(&localBuff, "|");
...
kfree(localBuff);

localBuff变量在strep调用后更新。因此,对kfree的调用不是使用同一个指针。这就允许了非常奇怪的行为。使用临时指针保存strep函数的状态。并检查它的返回值。

确保strsep不返回NULL?如果我调用它两次,并且写入的字符串中有两个管道分隔符,为什么会返回NULL?如果没有找到分隔符,则标记将被视为整个字符串*stringp,并且*stringp被设为NULL。在下一次strep调用中,如果字符串中没有|个字符,它将返回NULL。不管怎么说,这是内核,检查一切都很好。在这种情况下,您将调用KfreeFull….确保strsep不返回NULL?如果我调用它两次,并且在我编写的字符串中有两个管道分隔符,为什么会这样做?如果没有找到分隔符,标记将被视为整个字符串*stringp,并且*stringp被设为NULL。在下一次strep调用中,如果字符串中没有|个字符,它将返回NULL。不管怎么说,这是内核,检查一切都很好。在这种情况下,您将调用KfreeFull…我保存了一个localBuff副本并调用了kfree,它成功了。我保存了一个localBuff副本并调用了kfree,它成功了。