[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: ber_memfree debugging



At 09:39 PM 6/6/99 +0200, Bert Vermeulen wrote:
>ber_memfree() in liblber has an assertion on the memory to be freed.
>Should this be there?

That's debatable. 

I am currently using assert() to detect portability bugs in our
memory allocation codes.  This assert actually demonstrates
such a bug.

>It's bombing out on me because
>ldap_str2attributetype() in libldap frees pointers regardless if they've
>been used or not.

Before the recent memory allocation changes, this code called
free(NULL).  This is a bug.  OpenLDAP should not assume
STDC semantics.  I've added asserts specifically to detect
such bugs.

Now, one could say that LDAP_FREE() should provide should
provide STDC semantics even where free() doesn't.  In the
long run, I concur.  In fact, in the long run, I rather
eliminate most of the caller NULL checks.  This allows
LDAP_FREE to be used to implement other sorts of deallocation
bugs (such as duplicate frees).

Here an off the wall suggestion.

Round 3: (we gone a couple already on this)
	ber_memfree: don't assert(p != NULL)
	LDAP_FREE: assert(p != NULL)
	LDAP_INT_FREE: don't assert(p != NULL)

	Where LDAP_FREE(p) asserts.  Review code for usage
	and change to either:
		if(p) LDAP_FREE(p);
	or
		LDAP_INT_FREE(p);

Round 4:
	Phase out LDAP_FREE in favor of LDAP_INT_FREE.
	Possibly change LDAP_INT_FREE to do double free
	and/or use after free detection.

>It looks to me like the assertion should happen within the #ifdef
>LDAP_MEMORY_DEBUG block...

The LDAP_MEMORY_DEBUG enables detect wrong heap deallocation
detection which is something completely different.  It's not
test enough to be included as part of general debugging
(LDAP_DEBUG) and general debugging isn't ready for it.