The branch, master has been updated
       via  7ce1356c9f571c55af70bd6b966fe50898c1582d (commit)
       via  794525f3427e5f01656f205504d478318d9620a4 (commit)
      from  ffdc2a3fe8437582ded1c4a3b09a54201519889b (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 7ce1356c9f571c55af70bd6b966fe50898c1582d
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Mar 28 23:29:23 2009 +0100

    lib/util: fallback to any id in idr_get_new_random()
    
    metze

commit 794525f3427e5f01656f205504d478318d9620a4
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Mar 28 23:27:47 2009 +0100

    libcli/cldap: fix memory/resource leak
    
    We need to remove the message id, when a search request is finished
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 lib/util/idtree.c    |    8 ++++++--
 libcli/cldap/cldap.c |    9 ++++++++-
 2 files changed, 14 insertions(+), 3 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/util/idtree.c b/lib/util/idtree.c
index c8a8b63..0af93a2 100644
--- a/lib/util/idtree.c
+++ b/lib/util/idtree.c
@@ -372,12 +372,16 @@ _PUBLIC_ int idr_get_new_random(struct idr_context *idp, 
void *ptr, int limit)
 
        /* first try a random starting point in the whole range, and if that 
fails,
           then start randomly in the bottom half of the range. This can only
-          fail if the range is over half full */
+          fail if the range is over half full, and finally fallback to any
+          free id */
        id = idr_get_new_above(idp, ptr, 1+(generate_random() % limit), limit);
        if (id == -1) {
                id = idr_get_new_above(idp, ptr, 
1+(generate_random()%(limit/2)), limit);
        }
-       
+       if (id == -1) {
+               id = idr_get_new_above(idp, ptr, 1, limit);
+       }
+
        return id;
 }
 
diff --git a/libcli/cldap/cldap.c b/libcli/cldap/cldap.c
index 561ae80..d3fb0bb 100644
--- a/libcli/cldap/cldap.c
+++ b/libcli/cldap/cldap.c
@@ -510,6 +510,10 @@ static void cldap_reply_state_destroy(struct tevent_req 
*req)
 static int cldap_search_state_destructor(struct cldap_search_state *s)
 {
        if (s->caller.cldap) {
+               if (s->message_id != -1) {
+                       idr_remove(s->caller.cldap->searches.idr, 
s->message_id);
+                       s->message_id = -1;
+               }
                DLIST_REMOVE(s->caller.cldap->searches.list, s);
                cldap_recvfrom_stop(s->caller.cldap);
                ZERO_STRUCT(s->caller);
@@ -542,8 +546,12 @@ struct tevent_req *cldap_search_send(TALLOC_CTX *mem_ctx,
        if (!req) {
                return NULL;
        }
+       ZERO_STRUCTP(state);
        state->req = req;
        state->caller.cldap = cldap;
+       state->message_id = -1;
+
+       talloc_set_destructor(state, cldap_search_state_destructor);
 
        if (io->in.dest_address) {
                if (cldap->connected) {
@@ -634,7 +642,6 @@ struct tevent_req *cldap_search_send(TALLOC_CTX *mem_ctx,
        tevent_req_set_callback(subreq, cldap_search_state_queue_done, req);
 
        DLIST_ADD_END(cldap->searches.list, state, struct cldap_search_state *);
-       talloc_set_destructor(state, cldap_search_state_destructor);
 
        return req;
 


-- 
Samba Shared Repository

Reply via email to