堆栈溢出(关于“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) 关于粉碎堆栈的秘密