-2

一段时间以来,我的代码中有一个我无法弄清楚的错误。也许我只是瞎了眼,但是这个错误没有多大意义,因为据我所知,这段代码是完美无缺的。我推测其他地方可能存在损坏,但我想我会在这里粘贴我的问题代码以防万一。

我知道存在堆损坏,因为我收到标准错误消息,然后是 free() 无效的下一个大小消息。我已经包含了我认为相关的内容。堆损坏发生在第二个空闲(FileBuf)上;

while ((DirPtr = readdir(ProcDir)))
{
    if (AllNumeric(DirPtr->d_name) && atoi(DirPtr->d_name) >= InObj->ObjectPID &&
        atoi(DirPtr->d_name) <= InObj->ObjectPID + 10) /*Search 10 PIDs forward.*/
    {
        char TChar;

        snprintf(FileName, sizeof FileName, "/proc/%s/cmdline", DirPtr->d_name);

        if (!(Descriptor = fopen(FileName, "r")))
        {
            closedir(ProcDir);
            return 0;
        }

        FileBuf = malloc(MAX_LINE_SIZE);
        /*Scroll further down to find the free()s.*/
        for (Inc = 0; (TChar = getc(Descriptor)) != EOF && Inc < MAX_LINE_SIZE - 1; ++Inc)
        {
            FileBuf[Inc] = TChar;
        }
        FileBuf[Inc] = '\0';

        fclose(Descriptor);

        for (Inc = 0, Inc2 = NumSpaces; Inc2 != 0; ++Inc)
        { /*We need to replace the NUL characters with spaces.*/
            if (FileBuf[Inc] == '\0')
            {
                --Inc2;
                FileBuf[Inc] = ' ';
            }
        }

        if (!strcmp(FileBuf, InObj->ObjectStartCommand))
        {
            unsigned long RealPID;

            free(FileBuf);
            FileBuf = NULL;
            snprintf(FileName, sizeof FileName, "%s", DirPtr->d_name);
            closedir(ProcDir);

            RealPID = atoi(FileName);

            if (UpdatePID)
            {
                InObj->ObjectPID = RealPID;
            }

            return RealPID;

        }
        /*And here is the problem.*/
        free(FileBuf);
    }
}
closedir(ProcDir);

return 0;
4

1 回答 1

-1

成立!AdvancedPIDFind() 的工作原理是计算启动命令中的空格数,以从它的 NUL 分隔重新组合 /proc/PID/cmdline,但如果添加多个由 & 号分隔的命令或添加额外的空格,则不包含在 /过程/命令行。当我们飞离分配内存的末尾时,这会导致内存损坏错误。我现在正在编写修复程序。谢谢你忍受我。似乎我总是在点击“发布”后立即找到答案。

于 2013-11-12T02:11:34.823 回答