堆栈溢出(关于“evhttp_uri_parse”)

Posted

技术标签:

【中文标题】堆栈溢出(关于“evhttp_uri_parse”)【英文标题】:a stack overflow (about "evhttp_uri_parse") 【发布时间】:2015-02-11 06:27:55 【问题描述】:

代码实现读取文件(包含大量url)的功能,每个url都通过“evhttp_uri_parse”获取主机和路径。但是evhttp_uri_parse解析失败,返回NULL。可能原因是堆栈溢出。

FILE *fp=fopen(argv[1],"rb");
if(NULL==fp)

    printf("open url_file is error %d::%s\n",errno,strerror(errno));
    return 0;

char url_buf[2048];
memset(url_buf,'\0',sizeof(url_buf));

fgets(url_buf,sizeof(url_buf),fp);
while(!feof(fp))

    if(strlen(url_buf)>1)
    
        printf("url_buf::%s",url_buf);
        #if 1 
        struct evhttp_uri *ev_uri=NULL;
        ev_uri=evhttp_uri_parse(url_buf);
        if(ev_uri==NULL)
        
            printf("parse uri  error::%d,%s\n",errno,strerror(errno));
        
        const char *host=evhttp_uri_get_host(ev_uri);
        const char *path=evhttp_uri_get_path(ev_uri);
        printf("query host::%s,path::%s\n",host,path);
        evhttp_uri_free(ev_uri);
        #endif
    
    memset(url_buf,'\0',sizeof(url_buf));
    fgets(url_buf,sizeof(url_buf),fp);

fclose(fp);

【问题讨论】:

您是否有触发错误的特定 URL? 没有。一切都是一般的。 printf()if (fp == NULL)后面的引号放错了;您想要换行符后的右引号 (\n)。错误消息通常应该打印到标准错误,而不是标准输出。 @Jonathan Leffler OK. 您可以发布您遇到的错误。 【参考方案1】:

    fgets(url_buf,sizeof(url_buf)+1,fp) 应改为fgets(url_buf,sizeof(url_buf),fp)

    fgets 在字符串末尾添加 '\n'。尝试删除它,看看是否有帮助。

【讨论】:

@sanwuhai: user4419802 指出了一个真正的问题。这可能不是您的主要问题,但它是一个应该解决的真正问题。 @Jonathan Leffler。谢谢你的建议。【参考方案2】:

如果您的 url 出于任何原因大于 2048 个字符大小,那么fgets 将不会完全返回您想要的 url 并返回它的一部分(带有 2047 个字符),仅在第 2048 个位置有一个空字符。

这就是为什么输入sizeof(url_buf)+1 是个坏主意。这将导致未定义的行为,因为您将访问一个超出url_buf 数组范围的位置。

所以检查你是否得到一个带有换行符的字符串并将其更改为空字符,如果你没有在字符串中得到一个换行符,那么你可能想要阅读,直到你得到一个换行符来获取完整的 url。

这仅适用于您的网址由换行符分隔的情况。

【讨论】:

感谢您的建议,但主要原因不是元素。 @sanwuhai 你应该发布错误和你得到的输出,这样我们就可以知道你面临什么问题,我们发布解决方案假设函数evhttp_uri_parse(url_buf) 工作正常,唯一可能出错的原因是输入错误。

以上是关于堆栈溢出(关于“evhttp_uri_parse”)的主要内容,如果未能解决你的问题,请参考以下文章

Phrack安全杂志:详细分析堆栈溢出Smashing The Stack For Fun And Profit(Aleph One) 关于粉碎堆栈的秘密

关于电脑!啥是“缓冲区溢出”?

递归函数导致堆栈溢出

堆栈和堆溢出利用是啥意思

堆栈溢出格式如何工作? [关闭]

缓冲区溢出是与程序堆栈相关的唯一可能的错误吗?