假设 if(websValidateUrl(wp,path)< 0)在下面的函数中为真:
int websDefaultHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg,
char_t *url, char_t *path, char_t *query)
{
websStatType sbuf;
char_t *lpath, *tmp, *date;
int bytes, flags, nchars;
a_assert(websValid(wp));
a_assert(url && *url);
a_assert(path);
a_assert(query);
/*
* Validate the URL and ensure that ".."s don't give access to unwanted files
*/
flags = websGetRequestFlags(wp);
if (websValidateUrl(wp, path) < 0)
{
websError(wp, 500, T("Invalid URL %s"), url); //points to valid string "/index.html"
return 1;
}
}
然后将 url
传递到此处,其中fmt使用va_start()进行迭代:
void websError(webs_t wp, int code, char_t *fmt, ...)
{
va_list args;
char_t *msg, *userMsg, *buf;
char_t* safeUrl = NULL;
char_t* safeMsg = NULL;
#ifdef qRichErrorPage
static int reEntry = 0;
int errorOk;
#endif
a_assert(websValid(wp));
a_assert(fmt);
websStats.errors++;
/* remove any dangerous characters in the url, and replace the string in the
* wp structure. The webs_t cleanup code will free this memory for us.
*/
safeUrl = websSafeUrl(wp->url);
bfreeSafe(B_L, wp->url);
wp->url = safeUrl;
va_start(args, fmt); //AT this point args is a bad pointer??
userMsg = NULL;
fmtValloc(&userMsg, WEBS_BUFSIZE, fmt, args);
va_end(args);
.
.
.
当我们到达va_start(args, fmt);
时,args包含一些奇怪的字符,而不是我期待的“/index.html”。
这个指针的分配级别高于第一个函数但不应该仍然存在,因为它在websDefaultHandler中有效吗?
一般来说,做这样的事情的最佳做法是什么?在将它传递给websError()之前,我是否需要在websDefaultHandler中再次为它分配memoery?
感谢任何帮助。
答案 0 :(得分:2)
使用args
初始化va_start
后,您应该使用va_arg
来检索实际值。
答案 1 :(得分:1)
(已经在评论中说过了,但是由于这似乎是问题所在,因此我会提出一个实际答案:)
如果发送到url
的{{1}}与websError
是相同的字符串(即同一块内存),则调用wp->url
在bfreeSafe
尝试使用它之前释放它,在这种情况下,如果fmtValloc
看到一些乱码就不足为奇了。