]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
ldap: Crashfix
authorTimo Sirainen <tss@iki.fi>
Tue, 26 Mar 2013 08:36:49 +0000 (10:36 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 26 Mar 2013 08:36:49 +0000 (10:36 +0200)
src/auth/db-ldap.c
src/auth/db-ldap.h
src/auth/passdb-ldap.c
src/auth/userdb-ldap.c

index c9b8cffd0e1cc0d319e595ea7a9a0a2e10a34083..78d266307c045d2f62e914a1570b2c7fa6740308 100644 (file)
@@ -158,7 +158,7 @@ static void db_ldap_conn_close(struct ldap_connection *conn);
 struct db_ldap_result_iterate_context *
 db_ldap_result_iterate_init_full(struct ldap_connection *conn,
                                 struct ldap_request_search *ldap_request,
-                                bool iter_dn_values);
+                                LDAPMessage *res, bool iter_dn_values);
 
 static int deref2str(const char *str)
 {
@@ -547,14 +547,15 @@ db_ldap_find_request(struct ldap_connection *conn, int msgid,
 }
 
 static int db_ldap_fields_get_dn(struct ldap_connection *conn,
-                                struct ldap_request_search *request)
+                                struct ldap_request_search *request,
+                                LDAPMessage *res)
 {
        struct auth_request *auth_request = request->request.auth_request;
        struct ldap_request_named_result *named_res;
        struct db_ldap_result_iterate_context *ldap_iter;
        const char *name, *const *values;
 
-       ldap_iter = db_ldap_result_iterate_init_full(conn, request, TRUE);
+       ldap_iter = db_ldap_result_iterate_init_full(conn, request, res, TRUE);
        while (db_ldap_result_iterate_next(ldap_iter, &name, &values)) {
                if (values[1] != NULL) {
                        auth_request_log_warning(auth_request, "ldap",
@@ -668,7 +669,8 @@ static int db_ldap_search_save_result(struct ldap_request_search *request,
 }
 
 static int db_ldap_search_next_subsearch(struct ldap_connection *conn,
-                                        struct ldap_request_search *request)
+                                        struct ldap_request_search *request,
+                                        LDAPMessage *res)
 {
        struct ldap_request_named_result *named_res;
        const struct ldap_field *field;
@@ -683,7 +685,7 @@ static int db_ldap_search_next_subsearch(struct ldap_connection *conn,
                        named_res = array_append_space(&request->named_results);
                        named_res->field = field;
                }
-               if (db_ldap_fields_get_dn(conn, request) < 0)
+               if (db_ldap_fields_get_dn(conn, request, res) < 0)
                        return -1;
        } else {
                request->name_idx++;
@@ -773,7 +775,7 @@ db_ldap_handle_request_result(struct ldap_connection *conn,
                                return FALSE;
                        }
                } else {
-                       ret = db_ldap_search_next_subsearch(conn, srequest);
+                       ret = db_ldap_search_next_subsearch(conn, srequest, res);
                        if (ret > 0) {
                                /* free this result, but not the others */
                                ldap_msgfree(res);
@@ -788,22 +790,12 @@ db_ldap_handle_request_result(struct ldap_connection *conn,
                aqueue_delete(conn->request_queue, idx);
        }
 
-       if (srequest == NULL) {
-               T_BEGIN {
-                       request->callback(conn, request, res);
-               } T_END;
-       } else {
-               T_BEGIN {
-                       LDAPMessage *orig_result = srequest->result;
-
-                       if (res != NULL && srequest->result != NULL)
-                               request->callback(conn, request, srequest->result);
+       T_BEGIN {
+               if (res != NULL && srequest != NULL && srequest->result != NULL)
+                       request->callback(conn, request, srequest->result);
 
-                       srequest->result = res;
-                       request->callback(conn, request, res);
-                       srequest->result = orig_result;
-               } T_END;
-       }
+               request->callback(conn, request, res);
+       } T_END;
 
        if (idx > 0) {
                /* see if there are timed out requests */
@@ -1453,15 +1445,13 @@ get_ldap_fields(struct db_ldap_result_iterate_context *ctx,
 struct db_ldap_result_iterate_context *
 db_ldap_result_iterate_init_full(struct ldap_connection *conn,
                                 struct ldap_request_search *ldap_request,
-                                bool iter_dn_values)
+                                LDAPMessage *res, bool iter_dn_values)
 {
        struct db_ldap_result_iterate_context *ctx;
        const struct ldap_request_named_result *named_res;
        const char *suffix;
        pool_t pool;
 
-       i_assert(ldap_request->result != NULL);
-
        pool = pool_alloconly_create("ldap result iter", 1024);
        ctx = p_new(pool, struct db_ldap_result_iterate_context, 1);
        ctx->pool = pool;
@@ -1472,7 +1462,7 @@ db_ldap_result_iterate_init_full(struct ldap_connection *conn,
        if (ctx->auth_request->set->debug)
                ctx->debug = t_str_new(256);
 
-       get_ldap_fields(ctx, conn, ldap_request->result, "");
+       get_ldap_fields(ctx, conn, res, "");
        if (array_is_created(&ldap_request->named_results)) {
                array_foreach(&ldap_request->named_results, named_res) {
                        suffix = t_strdup_printf("@%s", named_res->field->name);
@@ -1485,9 +1475,10 @@ db_ldap_result_iterate_init_full(struct ldap_connection *conn,
 
 struct db_ldap_result_iterate_context *
 db_ldap_result_iterate_init(struct ldap_connection *conn,
-                           struct ldap_request_search *ldap_request)
+                           struct ldap_request_search *ldap_request,
+                           LDAPMessage *res)
 {
-       return db_ldap_result_iterate_init_full(conn, ldap_request, FALSE);
+       return db_ldap_result_iterate_init_full(conn, ldap_request, res, FALSE);
 }
 
 static const char *db_ldap_field_get_default(const char *data)
index 83750442edffc828bcea8b4a87ed92f969a7d98d..bd90432922348d004dd3e38a2ba37cac1222af6b 100644 (file)
@@ -196,7 +196,8 @@ const char *ldap_get_error(struct ldap_connection *conn);
 
 struct db_ldap_result_iterate_context *
 db_ldap_result_iterate_init(struct ldap_connection *conn,
-                           struct ldap_request_search *ldap_request);
+                           struct ldap_request_search *ldap_request,
+                           LDAPMessage *res);
 bool db_ldap_result_iterate_next(struct db_ldap_result_iterate_context *ctx,
                                 const char **name_r,
                                 const char *const **values_r);
index f8965dff7098b8e4d8cb393f48ead95b3c2b4779..535a3ba3c9d209b9383f0db22f3b31b7260ceaa9 100644 (file)
@@ -41,12 +41,13 @@ struct passdb_ldap_request {
 static void
 ldap_query_save_result(struct ldap_connection *conn,
                       struct auth_request *auth_request,
-                      struct ldap_request_search *ldap_request)
+                      struct ldap_request_search *ldap_request,
+                      LDAPMessage *res)
 {
        struct db_ldap_result_iterate_context *ldap_iter;
        const char *name, *const *values;
 
-       ldap_iter = db_ldap_result_iterate_init(conn, ldap_request);
+       ldap_iter = db_ldap_result_iterate_init(conn, ldap_request, res);
        while (db_ldap_result_iterate_next(ldap_iter, &name, &values)) {
                if (values[1] != NULL) {
                        auth_request_log_warning(auth_request, "ldap",
@@ -129,7 +130,7 @@ ldap_lookup_pass_callback(struct ldap_connection *conn,
        if (ldap_request->entries++ == 0) {
                /* first entry */
                ldap_query_save_result(conn, auth_request,
-                                      &ldap_request->request.search);
+                                      &ldap_request->request.search, res);
        }
 }
 
@@ -245,7 +246,7 @@ static void ldap_bind_lookup_dn_callback(struct ldap_connection *conn,
 
                /* first entry */
                ldap_query_save_result(conn, auth_request,
-                                      &passdb_ldap_request->request.search);
+                                      &passdb_ldap_request->request.search, res);
 
                /* save dn */
                dn = ldap_get_dn(conn->ld, res);
index a82c119d73fd1f12493f4607209a4847e571b9cc..9ef6243622c69ab8d5f7e933c40ece8debb9298e 100644 (file)
@@ -44,14 +44,15 @@ struct ldap_userdb_iterate_context {
 static void
 ldap_query_get_result(struct ldap_connection *conn,
                      struct auth_request *auth_request,
-                     struct ldap_request_search *ldap_request)
+                     struct ldap_request_search *ldap_request,
+                     LDAPMessage *res)
 {
        struct db_ldap_result_iterate_context *ldap_iter;
        const char *name, *const *values;
 
        auth_request_init_userdb_reply(auth_request);
 
-       ldap_iter = db_ldap_result_iterate_init(conn, ldap_request);
+       ldap_iter = db_ldap_result_iterate_init(conn, ldap_request, res);
        while (db_ldap_result_iterate_next(ldap_iter, &name, &values)) {
                auth_request_set_userdb_field_values(auth_request,
                                                     name, values);
@@ -100,7 +101,8 @@ static void userdb_ldap_lookup_callback(struct ldap_connection *conn,
 
        if (urequest->entries++ == 0) {
                /* first entry */
-               ldap_query_get_result(conn, auth_request, &urequest->request);
+               ldap_query_get_result(conn, auth_request,
+                                     &urequest->request, res);
        }
 }
 
@@ -167,7 +169,7 @@ static void userdb_ldap_iterate_callback(struct ldap_connection *conn,
        request->create_time = ioloop_time;
 
        ctx->in_callback = TRUE;
-       ldap_iter = db_ldap_result_iterate_init(conn, &urequest->request);
+       ldap_iter = db_ldap_result_iterate_init(conn, &urequest->request, res);
        while (db_ldap_result_iterate_next(ldap_iter, &name, &values)) {
                if (strcmp(name, "user") != 0) {
                        i_warning("ldap: iterate: "