堆栈溢出(关于“evhttp_uri_parse”)

时间:2015-02-11 06:27:56

标签: c libevent

代码实现读取文件(包含大量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);

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如果您的网址因任何原因超过2048个字符大小,那么fgets将无法完全返回您想要的网址,并在2048位置返回一部分字符(带有2047字符)和空字符仅

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

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

仅当您的网址由换行符分隔时才适用。