Ldap fix

Erik Tews erik.tews at millenux.com
Tue Aug 26 22:21:35 GMT 2003


Hi

This patch will fix a problem with some ldap-servers. Details in the patch.
-------------- next part --------------
--- samba-3.0.0beta3-vanilla/source/lib/smbldap.c	Wed Jul 16 15:23:58 2003
+++ samba-3.0.0beta3/source/lib/smbldap.c	Tue Aug 26 19:51:05 2003
@@ -428,28 +428,32 @@
 		ldap_value_free(values);
 		return;
 	}
-
-	/* Regardless of the real operation (add or modify)
-	   we add the new value here. We rely on deleting
-	   the old value, should it exist. */
-
-	if ((newval != NULL) && (strlen(newval) > 0)) {
+	
+	/* 20030826 erik.tews at millenux.com jochen.schmidt at millenux.com
+	   Once we did an add and a del when we had to do a update,
+	   This is known to work on openldap, but will fail on some other
+	   ldap-servers when doing this on a SINGLE-VALUE field. So we now
+	   do a real replace in ldap. Doing a del first and then add is not
+	   an option too, because this will fail on required attributes. */
+	
+	/* If values == NULL we will do a add because there is no old
+	   data on the ldap-server */
+	
+	if ((newval != NULL) && (strlen(newval) > 0) && (values == NULL)) {
 		smbldap_set_mod(mods, LDAP_MOD_ADD, attribute, newval);
 	}
-
+	
+        /* If values is NULL, we don't need a replace because there
+           is no old data on the ldap-server */
+	
 	if (values == NULL) {
-		/* There has been no value before, so don't delete it.
-		   Here's a possible race: We might end up with
-		   duplicate attributes */
 		return;
 	}
+	
+	/* Now we do a real replace on the ldap-server and no add del
+	   combination */
 
-	/* By deleting exactly the value we found in the entry this
-	   should be race-free in the sense that the LDAP-Server will
-	   deny the complete operation if somebody changed the
-	   attribute behind our back. */
-
-	smbldap_set_mod(mods, LDAP_MOD_DELETE, attribute, values[0]);
+	smbldap_set_mod(mods, LDAP_MOD_REPLACE, attribute, newval);
 	ldap_value_free(values);
 }
 


More information about the samba-technical mailing list