At 12:02 01/05/2002, Stig Venaas wrote:
>This is a bit involved, I'll try to explain. I'm trying to fix a
>problem in the LDAP extension, but not sure how best to do it.
>
>The issue is that code like
>
>$e = ldap_first_entry($ds, ldap_read($ds,$dn,"objectClass=*"));
>$a = ldap_get_attributes($ds, $e);
>
>crashes.
>
>What happens is that ldap_read() returns a resource. After
>ldap_first_entry() is executed, the resource returned by
>ldap_read() is freed because it is not referred any more,
>at least it looks that way to the Zend. The destructor for
>that resource will free the result obtained by ldap_read().
>The problem is that the resource returned by ldap_first_entry()
>is simply a pointer inside the data obtained with ldap_read(),
>but this has now been freed, so when ldap_get_attributes()
>tries to access it, it's already freed. The solution would be
>to make sure that the result resource created by ldap_read()
>is not freed as long as there exists entry resources created
>by ldap_first_entry() etc. Or that the result destructor for
>the resource created by ldap_read() does not free it, and
>have the entry destructor (created by ldap_first_entry() etc)
>free the memory if it is the last entry resource for that
>result resource. That would require some additional data
>structures and refcounting though. Maybe a Zend variable could
>be used and let Zend do the ref counting, perhaps I could
>increase the refcount for the result resource each time I
>create an entry resource, and decrease it again in the
>entry destructor? Anyone got some advice?

If ldap_first_entry() relies on the resource that is passed onto it, then 
it should add a reference count to it, using zend_list_addref().  The 
resource ldap_first_entry returns should be responsible for this reference, 
and its destructor should call zend_list_delete().  Then, only when no 
resources need the resource returned by ldap_read(), it'll be allowed to be 
freed.

Zeev


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to