首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >环境变量替换方案中的缓冲区溢出问题

环境变量替换方案中的缓冲区溢出问题
EN

Stack Overflow用户
提问于 2013-10-14 08:56:48
回答 1查看 75关注 0票数 1

在这个方法中,每当环境变量的值大于它的键时,我就会得到一个缓冲区溢出。Target是用于标记的动态分配的二维数组的一部分。每当我用比它更长的值替换环境变量的令牌时,它就会进入下一个令牌。我试着添加一个realloc来尝试修复它,但是它不工作或者导致了一个段错误。

如果任何人有任何建议,或者可以给我指出我忽略的地方,我将非常感激,因为我有一种感觉,当我发现它时,我会踢自己。

方法是:

代码语言:javascript
运行
复制
void envReplace(ENV *evlist, char *Target)
{

    if (Target[0] == '@')
    {
        memmove(Target, Target+1, strlen(Target));
        for(q = 0; q<16; q++)
        {
            if(evlist[q].envVariable!=NULL)
            {
                if(strcmp(Target, evlist[q].envVariable)==0)
                {
                    //this is where I'd add the realloc as realloc(Target, strlen(evlist[q].Value))
                    strcpy(Target, evlist[q].Value);
                    return;
                }
            }
        }
                printf("Variable not found\n");
    }
    else
    {
        printf("A value that didn't start with @ was an argument\n");
        return;
    }
}

数据结构ENV为:

代码语言:javascript
运行
复制
typedef struct envStorage
{
    char *envVariable;
    char *Value;
}ENV;
EN

回答 1

Stack Overflow用户

发布于 2013-10-14 09:07:06

您可以将指针传递给指针,如下所示,然后可以在函数内部调用realloc(),修改原始指针。

代码语言:javascript
运行
复制
void func (char **to_change) {
    // Changes the char *target in main()
    *to_change = (char *) realloc(*to_change, 20);
    sprintf (*to_change, "Blablablablabla\n");
}

int main (int argc, char **argv) {
    char *target = (char *) malloc (10);
    func(&target);
    printf(target);
    free(target);
}

在本例中,func()写入main()函数中的原始指针char *target

在你的代码中发生的事情是,你realloc()并赋值给指针的一个副本。当您调用envReplace()时,将复制指针。当此函数返回时,原始指针包含旧的内存地址,该地址不再是有效的已分配内存(已由realloc()释放)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19352058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档