OpenLDAP 2.1.31 Engineering
Fixed slapd extended match memory leak (ITS#3146)
Fixed slapd abandon/cancel pending bug (ITS#3160)
+ Fixed slapd invalid cookie in pagedResults control (ITS#3089)
Fixed libldap matchedValues parsing bug (ITS#3216)
OpenLDAP 2.1.30 Release
LDAPControl *ctrl,
const char **text )
{
- ber_tag_t tag;
- ber_int_t size;
- BerElement *ber;
- struct berval cookie = { 0, NULL };
+
+ int rc = LDAP_SUCCESS;
+ ber_tag_t tag;
+ ber_int_t size;
+ BerElement *ber;
+ struct berval cookie = { 0, NULL };
if ( op->o_pagedresults != SLAP_NO_CONTROL ) {
*text = "paged results control specified multiple times";
}
tag = ber_scanf( ber, "{im}", &size, &cookie );
- (void) ber_free( ber, 1 );
if( tag == LBER_ERROR ) {
*text = "paged results control could not be decoded";
- return LDAP_PROTOCOL_ERROR;
+ rc = LDAP_PROTOCOL_ERROR;
+ goto done;
}
if( size < 0 ) {
*text = "paged results control size invalid";
- return LDAP_PROTOCOL_ERROR;
+ rc = LDAP_PROTOCOL_ERROR;
+ goto done;
}
if( cookie.bv_len ) {
if( cookie.bv_len != sizeof( reqcookie ) ) {
/* bad cookie */
*text = "paged results cookie is invalid";
- return LDAP_PROTOCOL_ERROR;
+ rc = LDAP_PROTOCOL_ERROR;
+ goto done;
}
AC_MEMCPY( &reqcookie, cookie.bv_val, sizeof( reqcookie ));
if( reqcookie > op->o_pagedresults_state.ps_cookie ) {
/* bad cookie */
*text = "paged results cookie is invalid";
- return LDAP_PROTOCOL_ERROR;
+ rc = LDAP_PROTOCOL_ERROR;
+ goto done;
} else if( reqcookie < op->o_pagedresults_state.ps_cookie ) {
*text = "paged results cookie is invalid or old";
- return LDAP_UNWILLING_TO_PERFORM;
+ rc = LDAP_UNWILLING_TO_PERFORM;
+ goto done;
}
} else {
/* Initial request. Initialize state. */
? SLAP_CRITICAL_CONTROL
: SLAP_NONCRITICAL_CONTROL;
- return LDAP_SUCCESS;
+done:;
+ (void)ber_free( ber, 1 );
+ return rc;
}
#endif