- } else {
- return -1;
- }
-
- while (( csn_ptr = strstr( cookie->octet_str.bv_val, "csn=" )) != NULL ) {
- AttributeDescription *ad = slap_schema.si_ad_modifyTimestamp;
- slap_syntax_validate_func *validate;
- struct berval stamp;
-
- /* This only happens when called from main */
- if ( ad == NULL )
- break;
-
- csn_str = csn_ptr + STRLENOF("csn=");
- cval = strchr( csn_str, ',' );
- if ( cval )
- csn_str_len = cval - csn_str;
- else
- csn_str_len = 0;
-
- /* FIXME use csnValidate when it gets implemented */
- csn_ptr = strchr( csn_str, '#' );
- if ( !csn_ptr ) break;
-
- stamp.bv_val = csn_str;
- stamp.bv_len = csn_ptr - csn_str;
- validate = ad->ad_type->sat_syntax->ssyn_validate;
- if ( validate( ad->ad_type->sat_syntax, &stamp ) != LDAP_SUCCESS )
- break;
- valid = 1;
- break;
+ if ( !strncmp( next, "csn=", STRLENOF("csn=") )) {
+ slap_syntax_validate_func *validate;
+ struct berval stamp;
+
+ next += STRLENOF("csn=");
+ while ( next < end ) {
+ csn_str = next;
+ /* FIXME use csnValidate when it gets implemented */
+ csn_ptr = strchr( csn_str, '#' );
+ if ( !csn_ptr || csn_ptr > end )
+ break;
+ /* ad will be NULL when called from main. we just
+ * want to parse the rid then. But we still iterate
+ * through the string to find the end.
+ */
+ if ( ad ) {
+ stamp.bv_val = csn_str;
+ stamp.bv_len = csn_ptr - csn_str;
+ validate = ad->ad_type->sat_syntax->ssyn_validate;
+ if ( validate( ad->ad_type->sat_syntax, &stamp )
+ != LDAP_SUCCESS )
+ break;
+ }
+ cval = strchr( csn_ptr, ';' );
+ if ( !cval )
+ cval = strchr(csn_ptr, ',' );
+ if ( cval )
+ stamp.bv_len = cval - csn_str;
+ else
+ stamp.bv_len = end - csn_str;
+ if ( ad ) {
+ struct berval bv;
+ ber_dupbv_x( &bv, &stamp, memctx );
+ ber_bvarray_add_x( &cookie->ctxcsn, &bv, memctx );
+ cookie->numcsns++;
+ }
+ if ( cval ) {
+ next = cval + 1;
+ if ( *cval != ';' )
+ break;
+ } else {
+ next = end;
+ break;
+ }
+ }
+ continue;
+ }
+ next++;