From: Timo Sirainen Date: Tue, 26 Mar 2013 08:36:49 +0000 (+0200) Subject: ldap: Crashfix X-Git-Tag: 2.2.rc4~66 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b6df44e31bf9d54669b5903dfb5dd3fbbe896acc;p=thirdparty%2Fdovecot%2Fcore.git ldap: Crashfix --- diff --git a/src/auth/db-ldap.c b/src/auth/db-ldap.c index c9b8cffd0e..78d266307c 100644 --- a/src/auth/db-ldap.c +++ b/src/auth/db-ldap.c @@ -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) diff --git a/src/auth/db-ldap.h b/src/auth/db-ldap.h index 83750442ed..bd90432922 100644 --- a/src/auth/db-ldap.h +++ b/src/auth/db-ldap.h @@ -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); diff --git a/src/auth/passdb-ldap.c b/src/auth/passdb-ldap.c index f8965dff70..535a3ba3c9 100644 --- a/src/auth/passdb-ldap.c +++ b/src/auth/passdb-ldap.c @@ -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); diff --git a/src/auth/userdb-ldap.c b/src/auth/userdb-ldap.c index a82c119d73..9ef6243622 100644 --- a/src/auth/userdb-ldap.c +++ b/src/auth/userdb-ldap.c @@ -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: "