2011-03-21 21 views
0

假設如果(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

(1)你是什麼意思的「args包含一些怪異的字符」? 'args'與您作爲第四個參數傳遞給'websError'的字符串不同,它描述了剩餘的參數'websError'。 (2)你是否通過與'wp-> url'相同的字符串將'url'傳遞給'websError'?而且,如果是這樣,'bfreeSafe(B_L,wp-> url)'釋放它嗎?因爲如果是這樣的話,你在嘗試使用它之前就已經釋放了它。 – 2011-03-21 21:35:28

+0

是的,這是清除與bfreeSafe()如果你複製上述答案我可以接受它。非常感謝你。 – 2011-03-21 21:46:13

回答

1

(評論中已經說過,但拉出到一個實際的答案,因爲它似乎是這裏的問題:)

如果它發生了url被傳遞到websError是相同的字符串(意思是,相同內存條)爲wp->url,那麼在fmtValloc試圖使用它之前,撥打bfreeSafe將釋放它,在這種情況下,如果fmtValloc看到某些亂碼,這並不奇怪。

2

一旦您初始化argsva_start,您應該使用va_arg來檢索實際值。

+0

它在我看來就像'fmtValloc'是'vfprintf'相同的函數,它需要一個'va_list'並執行它自己的'va_arg'處理。 – 2011-03-22 00:43:16

相關問題