curl-library
Re: [EXAMPLE] Bug in getinmemory.c
Date: Tue, 10 May 2011 20:43:00 +0000
Just for the record, I've been using this example code, modified to suit my own purposes, for a couple of months on many different operating systems, as part of my Wikipedia bot. It works perfectly on Windows, OS X, FreeBSD, Linux...
Richard
----- Original Message -----
From: Martin Möller
Sent: 05/11/11 03:42 AM
To: curl-library_at_cool.haxx.se
Subject: [EXAMPLE] Bug in getinmemory.c
Hello @ all,
I found a bug in getinmemory.c in docs/examples.
This version misuses realloc: It resizes a chunk of memory, but doesn’t take into
account that the realloced memory address changes.
I think this file was never actually tested.
Attached is a patch for solving the problem
(The diff is stored in unified form):
--- getinmemory.c.orig 2011-05-10 19:23:37.000000000 +0200
+++ getinmemory.c 2011-05-10 19:30:10.000000000 +0200
@@ -39,19 +39,24 @@
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
{
size_t realsize = size * nmemb;
+ char * reall;
struct MemoryStruct *mem = (struct MemoryStruct *)data;
- mem->memory = realloc(mem->memory, mem->size + realsize + 1);
- if (mem->memory == NULL) {
+ reall = malloc(mem->size + realsize + 1);
+ if (reall == NULL) {
/* out of memory! */
- printf("not enough memory (realloc returned NULL)\n");
+ printf("not enough memory (malloc returned NULL)\n");
exit(EXIT_FAILURE);
}
- memcpy(&(mem->memory[mem->size]), ptr, realsize);
+ if (mem->memory)
+ memcpy (reall, mem->memory, mem->size);
+
+ memcpy(reall + mem->size, ptr, realsize);
mem->size += realsize;
- mem->memory[mem->size] = 0;
+ reall [mem->size] = 0;
+ mem->memory = reall;
return realsize;
}
@@ -62,7 +67,7 @@
struct MemoryStruct chunk;
- chunk.memory = malloc(1); /* will be grown as needed by the realloc above */
+ chunk.memory = NULL; /* will be grown as needed by the malloc above */
chunk.size = 0; /* no data at this point */
curl_global_init(CURL_GLOBAL_ALL);
@@ -71,7 +76,7 @@
curl_handle = curl_easy_init();
/* specify URL to get */
- curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.example.com/ ");
+ curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.google.de/ ");
/* send all data to this function */
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
------
Best regards,
Martin Moeller
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette: http://curl.haxx.se/mail/etiquette.html
Received on 2011-05-10