diff --git a/CHANGES b/CHANGES
index d037893c4068c417dfa66f8eae94e7ed3a5d0020..7187d5aed8b5ba39237313faa690249372ac6366 100644
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,7 @@ OpenLDAP 2.4 Change Log
 OpenLDAP 2.4.24 Engineering
 	Fixed liblber to not close invalid sockets (ITS#6585)
 	Fixed libldap dnssrv port format specifier (ITS#6644)
+	Fixed libldap sasl partial write handling (ITS#6639)
 	Fixed ldapsearch segfault with deref (ITS#6638)
 	Fixed slapd acl parsing overflow (ITS#6611)
 	Fixed slapd modify to return actual error (ITS#6581)
diff --git a/libraries/libldap/sasl.c b/libraries/libldap/sasl.c
index 6aa8cce49791cda8720636d6f88c8589c4cee24d..8856ef78d556b74607390d2e2b548460565af3b7 100644
--- a/libraries/libldap/sasl.c
+++ b/libraries/libldap/sasl.c
@@ -733,8 +733,9 @@ sb_sasl_generic_write( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
 		return ret;
 	} else if ( p->buf_out.buf_ptr != p->buf_out.buf_end ) {
 		/* partial write? pretend nothing got written */
-		len2 = 0;
 		p->flags |= LDAP_PVT_SASL_PARTIAL_WRITE;
+		sock_errset(EAGAIN);
+		len2 = -1;
 	}
 
 	/* return number of bytes encoded, not written, to ensure