It happens that I need to use the CURLOPT_WRITEFUNCTION and I'm stuck...

In the main() I do this:

        curl_easy_setopt(sessionA, CURLOPT_WRITEFUNCTION, writeFunction);
        curl_easy_setopt(sessionA, CURLOPT_WRITEDATA, (void *)&storedUndrl);

        // Here I check and verify that storedUndrl is properly initialized: 
POSITIVE!

        curl_easy_setopt(sessionA, CURLOPT_URL, UndrlURL.c_str());
        result = curl_easy_perform(sessionA);


The downloaded page should get stored here (global scope):

struct thread_status {
        char *data;
        size_t currentSize;
        size_t spacemade;
} storedUndrl =  {NULL, 0, 0};



Here is the writeFunction. Things go awry immediately at the very 1st call, 
where I added comments.

Does someone have any idea about what's going wrong or what I'm doing wrong?

Thanks!!


size_t static writeFunction( void *ptr, size_t size, size_t nmemb, void 
*thePage)
{
        size_t NEWSPACE = 400000;
        size_t nbytes = size*nmemb;

        struct thread_status *page_status = (struct thread_status *)thePage;    
        

        // At the first call (*page_status).currentSize and 
(*page_status).spacemade
        // should both be equal 0, as initialized. Instead they both are huge 
size_t numbers.

        // The increment immediatley here below works: the huge currentSize 
gets incremented
        // by the corret amount.

        (*page_status).currentSize += nbytes;

        if ( (*page_status).currentSize > (*page_status).spacemade ) {
                (*page_status).data = (char *)realloc( (*page_status).data, 
(*page_status).spacemade );

                // Segmentation fault occurs here because 
(*page_status).spacemade is huge! ~3G!

                (*page_status).spacemade += NEWSPACE;
        }

        // realloc: in case ptr==NULL (1st argument), the function behaves as 
malloc, allocating a block
        // of size given by the 2nd argument (in bytes) and returning a pointer 
to the beginning of it.

        assert((*page_status).data != NULL);
        memcpy((*page_status).data + (*page_status).currentSize +1, ptr, 
nbytes);

        return nbytes;
}

                                          
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette:  http://curl.haxx.se/mail/etiquette.html

Reply via email to