Предполагается, что if (websValidateUrl (wp, path) <0) </strong> истинно в приведенной ниже функции:
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);
, аргументы содержат несколько странных символов, а не "/index.html", который я ожидал.
Этот указатель был размещен на уровне выше, чем первая функция, но разве он не должен быть там, как он действителен в websDefaultHandler?
В общем, как лучше всего делать что-то вродеэтот?Нужно ли снова выделять памятку для нее в websDefaultHandler, прежде чем передавать ее в websError ()?
Любая помощь приветствуется.