check return values from ldap operations and close it we get back
LDAP_SERVER_DOWN. stupid ldap client lib, you should retry by yourself. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@13899 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -42,7 +42,8 @@ RCSID("$Id$"); | ||||
| #include <ctype.h> | ||||
| #include <sys/un.h> | ||||
|  | ||||
| static krb5_error_code LDAP__connect(krb5_context context, HDB * db); | ||||
| static krb5_error_code LDAP__connect(krb5_context context, HDB *); | ||||
| static krb5_error_code LDAP_close(krb5_context context, HDB *); | ||||
|  | ||||
| static krb5_error_code | ||||
| LDAP_message2entry(krb5_context context, HDB * db, LDAPMessage * msg, | ||||
| @@ -165,6 +166,20 @@ LDAP_no_size_limit(krb5_context context, LDAP *lp) | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int | ||||
| check_ldap(krb5_context context, HDB *db, int ret) | ||||
| { | ||||
|     switch (ret) { | ||||
|     case LDAP_SUCCESS: | ||||
| 	return 0; | ||||
|     case LDAP_SERVER_DOWN: | ||||
| 	LDAP_close(context, db); | ||||
| 	return 1; | ||||
|     default: | ||||
| 	return 1; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static krb5_error_code | ||||
| LDAP__setmod(LDAPMod *** modlist, int modop, const char *attribute, | ||||
| 	     int *pIndex) | ||||
| @@ -744,7 +759,7 @@ LDAP_dn2principal(krb5_context context, HDB * db, const char *dn, | ||||
|     rc = ldap_search_s(HDB2LDAP(db), dn, LDAP_SCOPE_SUBTREE, | ||||
| 		       "(objectclass=krb5Principal)", krb5principal_attrs, | ||||
| 		       0, &res); | ||||
|     if (rc != LDAP_SUCCESS) { | ||||
|     if (check_ldap(context, db, rc)) { | ||||
| 	krb5_set_error_string(context, "ldap_search_s: %s", | ||||
| 			      ldap_err2string(rc)); | ||||
| 	ret = HDB_ERR_NOENTRY; | ||||
| @@ -803,7 +818,7 @@ LDAP__lookup_princ(krb5_context context, | ||||
|  | ||||
|     rc = ldap_search_s(HDB2LDAP(db), HDB2BASE(db), LDAP_SCOPE_SUBTREE, filter,  | ||||
| 		       krb5kdcentry_attrs, 0, msg); | ||||
|     if (rc != LDAP_SUCCESS) { | ||||
|     if (check_ldap(context, db, rc)) { | ||||
| 	krb5_set_error_string(context, "ldap_search_s: %s", | ||||
| 			      ldap_err2string(rc)); | ||||
| 	ret = HDB_ERR_NOENTRY; | ||||
| @@ -831,7 +846,7 @@ LDAP__lookup_princ(krb5_context context, | ||||
|  | ||||
| 	rc = ldap_search_s(HDB2LDAP(db), HDB2BASE(db), LDAP_SCOPE_SUBTREE,  | ||||
| 			   filter, krb5kdcentry_attrs, 0, msg); | ||||
| 	if (rc != LDAP_SUCCESS) { | ||||
| 	if (check_ldap(context, db, rc)) { | ||||
| 	    krb5_set_error_string(context, "ldap_search_s: %s", | ||||
| 				  ldap_err2string(rc)); | ||||
| 	    ret = HDB_ERR_NOENTRY; | ||||
| @@ -1335,6 +1350,9 @@ LDAP_seq(krb5_context context, HDB * db, unsigned flags, hdb_entry * entry) | ||||
| 	    ret = HDB_ERR_NOENTRY; | ||||
| 	    HDBSETMSGID(db, -1); | ||||
| 	    break; | ||||
| 	case LDAP_SERVER_DOWN: | ||||
| 	    LDAP_close(context, db); | ||||
| 	    /* fall though */ | ||||
| 	case 0: | ||||
| 	case -1: | ||||
| 	default: | ||||
| @@ -1565,16 +1583,15 @@ LDAP_store(krb5_context context, HDB * db, unsigned flags, | ||||
| 	errfn = "ldap_modify_s"; | ||||
|     } | ||||
|  | ||||
|     if (rc == LDAP_SUCCESS) { | ||||
| 	ret = 0; | ||||
|     } else { | ||||
|     if (check_ldap(context, db, rc)) { | ||||
| 	char *ld_error = NULL; | ||||
| 	ldap_get_option(HDB2LDAP(db), LDAP_OPT_ERROR_STRING, | ||||
| 			&ld_error); | ||||
| 	krb5_set_error_string(context, "%s: %s (dn=%s) %s: %s",  | ||||
| 			      errfn, name, dn, ldap_err2string(rc), ld_error); | ||||
| 	ret = HDB_ERR_CANT_LOCK_DB; | ||||
|     } | ||||
|     } else | ||||
| 	ret = 0; | ||||
|  | ||||
|   out: | ||||
|     /* free stuff */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Love Hörnquist Åstrand
					Love Hörnquist Åstrand