[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
(ITS#4992) cldap ber_write assertion fix
Full_Name: Michael B Allen
Version: 2.3.33
OS: Linux 2.6
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (69.142.196.170)
ldap_search_ext with cldap:// will assert because it calls ldap_build_search_req
which calls ber_write w/ a NULL ld->ld_options.ldo_peer.
The following patch defers encoding the address with ber_write until after the
ldo_peer is initialized in request.c.
Note that cldap functionality is still not optimal. The transport hangs if there
is no reply.
--- search.c-2007-05-30 2007-05-30 21:20:06.000000000 -0400
+++ search.c 2007-05-30 21:50:45.000000000 -0400
@@ -259,8 +259,9 @@
LDAP_NEXT_MSGID( ld, *idp );
#ifdef LDAP_CONNECTIONLESS
if ( LDAP_IS_UDP(ld) ) {
- err = ber_write( ber, ld->ld_options.ldo_peer,
- sizeof(struct sockaddr), 0);
+ struct sockaddr sa;
+ memset(&sa, 0, sizeof sa);
+ err = ber_write( ber, &sa, sizeof(struct sockaddr), 0);
}
if ( LDAP_IS_UDP(ld) && ld->ld_options.ldo_version == LDAP_VERSION2) {
char *dn = ld->ld_options.ldo_cldapdn;
--- request.c-2007-05-30 2007-05-30 21:39:05.000000000 -0400
+++ request.c 2007-05-30 21:54:33.000000000 -0400
@@ -222,6 +222,19 @@
use_connection( ld, lc );
+#ifdef LDAP_CONNECTIONLESS
+ if ( LDAP_IS_UDP(ld) ) {
+ BerElement tmp = *ber;
+ ber_rewind( &tmp ); /* encode addr at start */
+ rc = ber_write( &tmp, ld->ld_options.ldo_peer,
+ sizeof(struct sockaddr), 0);
+ if ( rc == -1 ) {
+ ld->ld_errno = LDAP_ENCODING_ERROR;
+ return( -1 );
+ }
+ }
+#endif
+
/* If we still have an incomplete write, try to finish it before
* dealing with the new request. If we don't finish here, return
* LDAP_BUSY and let the caller retry later. We only allow a single