[OpenSIPS-Users] Bug in XCAP_Client
Anca Vamanu
anca at opensips.org
Thu Mar 5 16:39:34 CET 2009
Hi Vladimir,
Thank you for reporting this problem and also giving a solution for it.
I will put your parch in the code.
Thanks and regards,
Anca
Romanov Vladimir wrote:
>
> 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
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Users mailing list
> Users at lists.opensips.org
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>
More information about the Users
mailing list