cURL / Mailing Lists / curl-users / Single Mail

curl-users

Re: Problem with strdup

From: todd <toddf_at_simosoftware.com>
Date: Thu, 16 Dec 2004 22:11:13 -0500

Hi,

Eric VERGNAUD wrote:

>Hi,
>
>I hope I'm wrong but I think I've identified a potential memory problem in
>libcurl, that has been annoying me for some time now.
>
>I'm compiling libcurl using gcc on MacOS X. Then I'm linking libcurl.a in my
>app compiled with CodeWarrior 9.
>
>I noticed that each time I call curl_easy_cleanup, MallocDebug complains
>about libcurl freeing an unallocated block.
>
>Today I decided to track this down, whch is not easy because I cannot debug
>libcurl.a from CodeWarrior.
>
>I had a look at the block for which MallocDebug complains, and it showed
>the host address I just called, that is 127.0.0.1:8080.
>
>Then using atos I decoded the stack trace and found the following:
>_curl_easy_cleanup
>_Curl_hash_destroy
>_Curl_hash_clean
>_Curl_llist_destroy
>_Curl_llist_remove
>__hash_element_dtor
>_free
>_unlockedfree
>_printStack
>
>Which shows that __hash_element_dtor calls free on an unallocated block.
>
>I discovered that the only element added through Curl_hash_add is entry_id
>in cache_resolv_response . entry_id is created by create_hostcache_id. Looks
>like the problematic entry.
>
>I had a look at Curl_hash_add and mk_hash_element and found the following:
>
> he->key = strdup(key);
>
>On the web, I read the following:
>
>The general rule is simple. C++ uses new and delete for dynamic memory
>allocation, whereas C uses malloc and free.
>
> Memory allocated with new should be deallocated with delete only.
>
> Memory allocated with malloc should be deallocated with free only.
>
> Mixing them produces undefined results. Do not mix them! Unfortunately,
>its not always easy to obey this simple rule. Consider the string duplicate
>function:
> char * strdup(const char *ps); // returns a copy of the string pointed to
>by ps
>
> char * newName = strdup (oldName);
> ...
> // finished with newName, deallocate it
>
> How will you deallocate newName? If the strdup() you're using is from a C
>library you must use free, but if it's from a C++ library you must use
>delete. What you must do varies from system to system and compiler to
>compiler. To avoid such problems try not to use functions that are neither
>in the standard library, nor available in a stable form on most computing
>platforms.
>
>Since my program is written in C++, I believe strdup calls new instead of
>malloc.
>
>I believe that replacing the above line by:
>
> he->key = malloc(key_len);
> memcpy(he->key,key,key_len);
>
>Will solve my problem.
>
>What do you think ?
>
>-------------------------------
>Eric VERGNAUD - JLynx Software
>Cutting-edge technologies and
>services for software companies
>web: http://www.jlynx.com
>-------------------------------
>
>
>
>
I think it may depend on you C++ library but in general strdup uses
malloc or at least it uses the same memory allocator that malloc does.
Also, I believe that if the C++ library had a different implementation
of strdup then it would be likely that it would also provide a different
implementation of free that obeyed the C++ memory allocator rules. What
i'm saying is I don't think this is the answer to your problem...
-todd
Received on 2004-12-17