Hi all,

I've got a weird problem using a function passed to curlopt_writefunction, 
using cURL library (easy interface) version 7.19.7 on a Redhat EL 5.4 system.

I'm using libcurl as part of a C++ application to send/receive checkout 
requests and notifications to Google Checkout.  I've got this working perfectly 
on the same system talking to a different server in a different application, 
and as far as I can tell the code is virtually identical so I'm not sure where 
it's going wrong.

In the working application, cURL passes 1 as the size parameter and the number 
of characters (e.g. 16,384 = 16K) as the nmemb parameter to my write function.  
But, in the new one that doesn't work, I'm getting huge size and nmemb 
parameters that are causing the application to try and allocate 3GB of memory!

Here's a GDB output at the point my write function is called:

Breakpoint 1, aspire_platform::GoogleCheckoutClient::OnDataRead (
    this=0x80ee011, ptr=0x1, size=307, nmemb=11936960, stream=0x0)
    at /opt/nmail32/aspire_backend/google_lib/src/GoogleCheckoutClient.cpp:236

Notice that the pointer to the data (ptr) has the address of 0x1 which causes a 
segfault if I try to read it:

(gdb) p (char*)ptr
$1 = 0x1 <Address 0x1 out of bounds>

Also the "307" passed to the size parameter is actually the size of the data 
received - no idea what the nmemb figure is.  In my working application, the 
size of the data is in the nmemb parameter, and the size parameter is always 1.

Any ideas what could cause this?  Note that the working application does 
typically have 2-3 calls made to my write function (it receives an average of 
25KB) whereas this one has tiny responses (average of 300 bytes) - is that 
significant?

This is a GDB trace of the same point in the working application:

Breakpoint 1, aspire_platform::OpenSrsClient::OnDataRead (ptr=0x8a6b1cc, 
    size=1, nmemb=423, stream=0xb624c0)
    at /opt/nmail32/aspire_backend/opensrs_lib/src/OpenSrsClient.cpp:299
(gdb) p (char*)ptr
$3 = 0x8a6b1cc "<?xml version='1.0' encoding=\"UTF-8\" standalone=\"no\" 
?>\n..."

Both cURL sessions are set up the same - they both POST some XML data to the 
remote server, and both servers return HTTP status 200.  Also I've just noticed 
that the working version has a "stream" pointer passed to it, but the 
non-working one doesn't - yet neither sets the option curlopt_writedata.

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

Reply via email to