[OpenSIPS-Users] Bug in XCAP_Client

Romanov Vladimir VRomanov at yota.ru
Thu Mar 5 14:36:01 CET 2009


Hi All!
I found bug in \modules\ xcap_client\ xcap_functions.c
Function write_function not work with large content. If you download large content this callback function will call several times. On every call this ficnction create NEW buffer in memory and lost old.
As result you have

1)      Memory leaks

2)      Corrupted content in buffer.

This is my variant of this function

int str_append(str* buff, char* s, int len)
{
    /* reallocate memory and copy */
    char* newData;
    if (-1==len) {
                len=strlen(s);
    }
    if (0==len) {
                return buff->len;
    }
    newData= (char*)pkg_realloc(buff->s, buff->len + len + 1);
    if(newData== NULL) {
                ERR_MEM(PKG_MEM_STR);
    }
    memcpy(newData+buff->len, s , len);
    buff->s = newData;
    buff->len += len;
    buff->s[buff->len] = 0;
    return buff->len;
error:
    return -1;
}

size_t write_function( void *ptr, size_t size, size_t nmemb, str *buff)
{
    if (str_append(buff,(char*)ptr,(int)(size*nmemb))>=0) {
        return size* nmemb;
    } else {
                LM_ERR("Can't append to string");
                return CURLE_WRITE_ERROR;
    }
}

int send_http_get(char* uri, str* buff)
{
    CURLcode ret_code;
    CURL* curl_handle= NULL;
    int http_ret_code=-1;

    LM_INFO("Send request %s",uri);

    curl_handle = curl_easy_init();

    curl_easy_setopt(curl_handle, CURLOPT_URL, uri);

    curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1);

    curl_easy_setopt(curl_handle, CURLOPT_STDERR, stdout);

    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_function);

    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, buff);

    /* non-2xx => error */
    curl_easy_setopt(curl_handle, CURLOPT_FAILONERROR, 0);

    ret_code= curl_easy_perform(curl_handle );

    if( ret_code!=0) {
                LM_ERR("Error [%i] while performing curl operation", ret_code);
    } else {
                curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &http_ret_code);
    }

    curl_easy_cleanup(curl_handle);
    LM_INFO("send_http_get return %i. Content length=%i", http_ret_code, buff->len);
    return http_ret_code;
}

-----------------
Vladimir Romanov
Scartel Star Lab
CTO
+7 (960) 239-0853

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.opensips.org/pipermail/users/attachments/20090305/fcb72ea6/attachment-0001.htm 


More information about the Users mailing list