+
+ if (params->gss_creds == GSS_C_NO_CREDENTIAL) {
+ unsigned int free_password = 0;
+ sasl_secret_t *password = NULL;
+
+ pass_result = _plug_get_password(params->utils, &password,
+ &free_password, prompt_need);
+ if (pass_result == SASL_OK) {
+ gss_buffer_desc pwBuf;
+ gss_buffer_desc nameBuf;
+ gss_OID_set_desc mechs;
+
+ nameBuf.length = strlen(text->user);
+ nameBuf.value = (void *)text->user;
+ pwBuf.length = password->len;
+ pwBuf.value = password->data;
+ mechs.count = 1;
+ mechs.elements = text->mech;
+
+ GSS_LOCK_MUTEX(params->utils);
+ maj_stat = gss_import_name(&min_stat, &nameBuf,
+ GSS_C_NT_USER_NAME, &text->client_name);
+ if (maj_stat == GSS_S_COMPLETE) {
+ maj_stat = gss_acquire_cred_with_password(&min_stat,
+ text->client_name,
+ &pwBuf, GSS_C_INDEFINITE,
+ &mechs, GSS_C_INITIATE,
+ &text->client_creds,
+ NULL, NULL);
+ if (GSS_ERROR(maj_stat)) {
+ if (free_password) _plug_free_secret(params->utils, &password);
+ sasl_gss_seterror(text->utils, maj_stat, min_stat);
+ GSS_UNLOCK_MUTEX(params->utils);
+ sasl_gss_free_context_contents(text);
+ return SASL_FAIL;
+ }
+ }
+ GSS_UNLOCK_MUTEX(params->utils);
+ if (free_password) _plug_free_secret(params->utils, &password);
+ }
+ }