diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 48e995eb67ddae6791f06f6a85c9380dbed4b89a..df982460e87fe774e5edf894a811bd179a9e4a59 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -40,6 +40,8 @@ char *default_passwd_hash; char *default_search_base = NULL; char *default_search_nbase = NULL; +ber_len_t sockbuf_max_incoming = SLAP_SB_MAX_INCOMING_DEFAULT; + char *slapd_pid_file = NULL; char *slapd_args_file = NULL; @@ -168,6 +170,43 @@ read_config( const char *fname ) ldap_pvt_thread_set_concurrency( c ); + /* set sockbuf max */ + } else if ( strcasecmp( cargv[0], "sockbuf_max_incoming" ) == 0 ) { + long max; + if ( cargc < 2 ) { +#ifdef NEW_LOGGING + LDAP_LOG(( "config", LDAP_LEVEL_CRIT, + "%s: line %d: missing max in \"sockbuf_max_incoming <bytes\" line\n", + fname, lineno )); +#else + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing max in \"sockbuf_max_incoming <bytes\" line\n", + fname, lineno, 0 ); +#endif + + return( 1 ); + } + + max = atol( cargv[1] ); + + if( max < 0 ) { +#ifdef NEW_LOGGING + LDAP_LOG(( "config", LDAP_LEVEL_CRIT, + "%s: line %d: invalid max value (%ld) in " + "\"sockbuf_max_incoming <bytes>\" line.\n", + fname, lineno, max )); +#else + Debug( LDAP_DEBUG_ANY, + "%s: line %d: invalid max value (%ld) in " + "\"sockbuf_max_incoming <bytes>\" line.\n", + fname, lineno, max ); +#endif + + return( 1 ); + } + + sockbuf_max_incoming = max; + /* default search base */ } else if ( strcasecmp( cargv[0], "defaultSearchBase" ) == 0 ) { if ( cargc < 2 ) { diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index de77e7051d1f0720e30cec32620c2f0a1b01982f..b282cf69703f5fec566ad1e1dc97d59777d5d03c 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -362,33 +362,39 @@ long connection_init( assert( c != NULL ); - if( c->c_struct_state == SLAP_C_UNINITIALIZED ) { + if( c->c_struct_state == SLAP_C_UNINITIALIZED ) { c->c_authmech = NULL; - c->c_dn = NULL; - c->c_cdn = NULL; + c->c_dn = NULL; + c->c_cdn = NULL; c->c_listener_url = NULL; c->c_peer_domain = NULL; - c->c_peer_name = NULL; - c->c_sock_name = NULL; + c->c_peer_name = NULL; + c->c_sock_name = NULL; - c->c_ops = NULL; - c->c_pending_ops = NULL; + c->c_ops = NULL; + c->c_pending_ops = NULL; c->c_sasl_bind_mech = NULL; c->c_sasl_context = NULL; c->c_sasl_extra = NULL; - c->c_sb = ber_sockbuf_alloc( ); + c->c_sb = ber_sockbuf_alloc( ); + + { + ber_len_t max = sockbuf_max_incoming; + ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_SET_MAX_INCOMING, &max ); + } + c->c_currentber = NULL; - /* should check status of thread calls */ - ldap_pvt_thread_mutex_init( &c->c_mutex ); - ldap_pvt_thread_mutex_init( &c->c_write_mutex ); - ldap_pvt_thread_cond_init( &c->c_write_cv ); + /* should check status of thread calls */ + ldap_pvt_thread_mutex_init( &c->c_mutex ); + ldap_pvt_thread_mutex_init( &c->c_write_mutex ); + ldap_pvt_thread_cond_init( &c->c_write_cv ); - c->c_struct_state = SLAP_C_UNUSED; - } + c->c_struct_state = SLAP_C_UNUSED; + } ldap_pvt_thread_mutex_lock( &c->c_mutex ); @@ -576,9 +582,15 @@ connection_destroy( Connection *c ) c->c_connid, sd, 0, 0, 0 ); } - ber_sockbuf_free( c->c_sb ); + ber_sockbuf_free( c->c_sb ); + c->c_sb = ber_sockbuf_alloc( ); + { + ber_len_t max = sockbuf_max_incoming; + ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_SET_MAX_INCOMING, &max ); + } + c->c_conn_state = SLAP_C_INVALID; c->c_struct_state = SLAP_C_UNUSED; } diff --git a/servers/slapd/controls.c b/servers/slapd/controls.c index e99eeed1e5909301c8c437bcf9ceadcc7be78ef2..426692645c42c490572112a9972286e3a9c8de9b 100644 --- a/servers/slapd/controls.c +++ b/servers/slapd/controls.c @@ -181,7 +181,7 @@ return_results: if( sendres && rc != LDAP_SUCCESS ) { if( rc == SLAPD_DISCONNECT ) { - send_ldap_disconnect( conn, op, rc, errmsg ); + send_ldap_disconnect( conn, op, LDAP_PROTOCOL_ERROR, errmsg ); } else { send_ldap_result( conn, op, rc, NULL, errmsg, NULL, NULL ); diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index 04bb8f8aeeffa717f50b983f970e9a067bf9202e..f357a8c9e5d832dde02eceef94f978329336ab9b 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -543,7 +543,7 @@ static Listener * slap_open_listener( case AF_INET: { char *s; -#ifdef HAVE_GETADDRINFO +#if defined( HAVE_GETADDRINFO ) && defined( INET_NTOP ) char addr[INET_ADDRSTRLEN]; inet_ntop( AF_INET, &((struct sockaddr_in *)*sal)->sin_addr, addr, sizeof(addr) ); diff --git a/servers/slapd/entry.c b/servers/slapd/entry.c index b52e518a80266dddfd0e0b868b7050386f7b57e5..ed81984c8be3b00408b3da15daf62a1f77292cfa 100644 --- a/servers/slapd/entry.c +++ b/servers/slapd/entry.c @@ -264,8 +264,14 @@ entry2str( void entry_free( Entry *e ) { - Attribute *a, *next; + /* free an entry structure */ + assert( e != NULL ); + /* e_private must be freed by the caller */ + assert( e->e_private == NULL ); + e->e_private = NULL; + + /* free DNs */ if ( e->e_dn != NULL ) { free( e->e_dn ); e->e_dn = NULL; @@ -274,12 +280,11 @@ entry_free( Entry *e ) free( e->e_ndn ); e->e_ndn = NULL; } - for ( a = e->e_attrs; a != NULL; a = next ) { - next = a->a_next; - attr_free( a ); - } + + /* free attributes */ + attrs_free( e->e_attrs ); e->e_attrs = NULL; - e->e_private = NULL; + free( e ); } diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index ecdaaf2dfef8953f9209bef61c6dec302c8c00ef..f8f6d43b9acb096aa626797d450135d37572c2d5 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -760,6 +760,8 @@ LDAP_SLAPD_F (int) krbv4_ldap_auth(); /* * Other... */ +#define SLAP_SB_MAX_INCOMING_DEFAULT (1<<18 - 1) +LDAP_SLAPD_F (ber_len_t) sockbuf_max_incoming; LDAP_SLAPD_F (slap_mask_t) global_restrictops; LDAP_SLAPD_F (slap_mask_t) global_allows; diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index bed78c771e5b7b66eea17fcd385939c18389dc0a..89acc1fbdbd49ad9f9903ba76a5a899d0467374d 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -58,6 +58,7 @@ LDAP_BEGIN_DECL #define MAXREMATCHES 10 +#define SLAP_MAX_INCOMING (1<<18 - 1) #define SLAP_MAX_WORKER_THREADS 32