Как далеко я могу использовать этот указатель? - PullRequest
0 голосов
/ 22 марта 2011

Предполагается, что 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 ()?

Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 22 марта 2011

Как только вы инициализируете args с помощью va_start, вы должны использовать va_arg для получения фактических значений.

1 голос
/ 22 марта 2011

(Уже сказано в комментариях, но вытащить в фактический ответ, так как это, кажется, проблема здесь:)

Если случится так, что url, передаваемый в websError, является той же самой строкой(то есть тот же кусок памяти), что и wp->url, то этот вызов bfreeSafe освобождает его до того, как fmtValloc пытается его использовать, и в этом случае неудивительно, если fmtValloc видит что-то искаженное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...