On 10/01/2013 09:03 PM, Jakub Hrozek wrote:
Hi,
the attached two patches fix #2077. I wrote the patches even though there are unresolved 1.11 issues because there was a customer looking for a test package.
Patch 1: Ack.
Patch 2: Nack.
static struct tevent_req *get_user_dn_send(TALLOC_CTX *memctx, struct tevent_context *ev, struct sss_domain_info *domain, struct sdap_handle *sh, struct sdap_options *opts, const char *username) { struct tevent_req *req; struct tevent_req *subreq; struct get_user_dn_state *state; char *clean_name; char *filter; const char **attrs; errno_t ret;
req = tevent_req_create(memctx, &state, struct get_user_dn_state); if (!req) return NULL; state->username = username;
Input string should be strdupped to be safe, due to asynchronous nature of the request.
static void get_user_dn_done(struct tevent_req *subreq) { errno_t ret; struct tevent_req *req = tevent_req_callback_data(subreq, struct tevent_req); struct get_user_dn_state *state = tevent_req_data(req, struct get_user_dn_state); struct ldb_message_element *el; struct sysdb_attrs **users; size_t count;
ret = sdap_search_user_recv(state, subreq, NULL, &users, &count); talloc_zfree(subreq); if (ret && ret != ENOENT) { DEBUG(SSSDBG_OP_FAILURE, ("Failed to retrieve users\n")); tevent_req_error(req, ret); return; } if (count == 0) { DEBUG(SSSDBG_OP_FAILURE, ("No such user\n")); tevent_req_error(req, ENOMEM); return; } else if (count > 1) { DEBUG(SSSDBG_OP_FAILURE, ("Multiple users matched\n")); tevent_req_error(req, EIO); return; } /* exactly one user. Get the originalDN */ ret = sysdb_attrs_get_el(users[0], SYSDB_ORIG_DN, &el); if (ret || el == NULL || el->num_values == 0) { DEBUG(SSSDBG_OP_FAILURE, ("originalDN is not available for [%s].\n", state->username)); tevent_req_error(req, ret ? ret : EIO); return; }
You can use directly sysdb_attrs_get_el_ext() with alloc param set to false. That will make error handling easier.