假設如果(websValidateUrl(WP,路徑)< 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嗎?
任何幫助表示讚賞。
(1)你是什麼意思的「args包含一些怪異的字符」? 'args'與您作爲第四個參數傳遞給'websError'的字符串不同,它描述了剩餘的參數'websError'。 (2)你是否通過與'wp-> url'相同的字符串將'url'傳遞給'websError'?而且,如果是這樣,'bfreeSafe(B_L,wp-> url)'釋放它嗎?因爲如果是這樣的話,你在嘗試使用它之前就已經釋放了它。 – 2011-03-21 21:35:28
是的,這是清除與bfreeSafe()如果你複製上述答案我可以接受它。非常感謝你。 – 2011-03-21 21:46:13