cURL / Mailing Lists / curl-library / Single Mail

curl-library

Re: cURL bug -- Segmentation Fault when timeout is 1 second

From: Daniel Marschall <info_at_daniel-marschall.de>
Date: Wed, 4 Feb 2009 19:57:53 +0100

> Please don't top-post. http://curl.haxx.se/mail/etiquette.html
>
> Daniel Marschall on February 04, 2009 10:24 AM wrote:
>>
>> I am very confused at the moment. Can you please help me? I don't know
>> what
>> to do. It doesn't work...
>> Now I have again a memory-access-error :-(
>>
>> static int writer(char* data, size_t size, size_t nmemb, char* buffer)
>> {
>> // What we will return
>> int result = 0;
>>
>> // Is there anything in the buffer?
>> if (buffer != NULL)
>> {
>> buffer = (char*)realloc(buffer, size * nmemb); // Extend
>> the buffer
>
> No, this does not "extend" the buffer. It will resize the buffer to
> exactly size*nmemb bytes (and forget how large it was before). Did
> you read the documentation for realloc()?
>
>> // Append the data to the buffer
>> strcat(buffer, data);
>
> You claimed that you didn't use "strncpy() or a similar function".
> strcat()
> certainly qualifies. This is dangerous code, causing potential buffer
> overruns and security risks. Did you earlier say this code runs on a
> root server? That would be scary. Again, use memcpy() or a similar
> function.

Ok

>
> For example, assume "buffer" is infinitely large (for now), and
> "lastindex"
> is the next element in "buffer" that you will write to. More correct
> code would be:
>
> memcpy( &buffer[lastindex], data, size*nmemb );
> lastindex += size*nmemb;

Ok, I will try it. But lastindex may not be a global variable. I have to
detect it direct inside of the writer-function to allow asychronous calls.

>
> Of course, in reality you would need to ensure that buffer is large
> enough
> to hold the new data. At a minimum, your realloc call would be:
>
> buffer = realloc( buffer, lastindex + 1 + size*nmemb );
>
> But this is inefficient, because you would call realloc on every write
> callback. It is better to allocate a large buffer, and then expand it
> in large chunks as needed later on.

I have now following code, but it still doesn't work:

Isn't there any example code that simply make a http-call with C?

static int writer(char* data, size_t size, size_t nmemb, char* buffer)
{
        // What we will return
        int result = 0;

        // Is there anything in the buffer?
        if (buffer != NULL)
        {
                //buffer = (char*)realloc(buffer, size * nmemb);
                int lastindex = strlen(buffer); // is that correct?
                buffer = (char*)realloc( buffer, lastindex + 1 + size*nmemb );

                // Append the data to the buffer
                //strcat(buffer, data);
                memcpy( &buffer[lastindex], data, size*nmemb );
                lastindex += size*nmemb;

                // How much did we write?
                result = size * nmemb;
        }

        return result;
}

                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
                char errorBuffer[CURL_ERROR_SIZE];
                curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
                //char* buffer;
                char *buffer = (char*)malloc(12);
                //buffer[0] = '\0';
                curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);

Can you please show me how to make a correct code for that simple suppose
"http-output into char*"?

Sorry, I am very new in C++ and in C I have also more problems than in C++
where you have "easy" functions like ->Append. I developed in the past with
Java, Delphi and PHP where the pointer stuff is not so complex like here.

>
> GaryM at Casabi
>
 
Received on 2009-02-04