X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fldapsync.c;h=bd4680960944e4ce6adc8eb6184eb8f93c6a98b6;hb=294da7ed11a9a5721b15d0ed81682f123e20cbb0;hp=95eb9e83d5952a77fe6bcb4a880d72f316171b57;hpb=36571123cab07e490888b63ce90020ae211882db;p=openldap diff --git a/servers/slapd/ldapsync.c b/servers/slapd/ldapsync.c index 95eb9e83d5..bd46809609 100644 --- a/servers/slapd/ldapsync.c +++ b/servers/slapd/ldapsync.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2003-2007 The OpenLDAP Foundation. + * Copyright 2003-2008 The OpenLDAP Foundation. * Portions Copyright 2003 IBM Corporation. * All rights reserved. * @@ -35,12 +35,13 @@ slap_compose_sync_cookie( Operation *op, struct berval *cookie, BerVarray csn, - int rid ) + int rid, + int sid ) { int len, numcsn = 0; if ( csn ) { - for (; !BER_BVISEMPTY( &csn[numcsn] ); numcsn++); + for (; !BER_BVISNULL( &csn[numcsn] ); numcsn++); } if ( numcsn == 0 || rid == -1 ) { @@ -51,6 +52,9 @@ slap_compose_sync_cookie( } else { len = snprintf( cookiestr, sizeof( cookiestr ), "rid=%03d", rid ); + if ( sid >= 0 ) { + len += sprintf( cookiestr+len, ",sid=%03x", sid ); + } } ber_str2bv_x( cookiestr, len, 1, cookie, op ? op->o_tmpmemctx : NULL ); @@ -63,12 +67,19 @@ slap_compose_sync_cookie( len += csn[i].bv_len + 1; len += STRLENOF("rid=123,csn="); + if ( sid >= 0 ) + len += STRLENOF("sid=xxx,"); + cookie->bv_val = slap_sl_malloc( len, op ? op->o_tmpmemctx : NULL ); - len = sprintf( cookie->bv_val, "rid=%03d,csn=", rid ); + len = sprintf( cookie->bv_val, "rid=%03d,", rid ); ptr = cookie->bv_val + len; + if ( sid >= 0 ) { + ptr += sprintf( ptr, "sid=%03x,", sid ); + } + ptr = lutil_strcopy( ptr, "csn=" ); for ( i=0; ibv_val, csn->bv_len ); + ptr = lutil_strncopy( ptr, csn[i].bv_val, csn[i].bv_len ); *ptr++ = ';'; } ptr--; @@ -109,30 +120,46 @@ slap_sync_cookie_free( } int -slap_parse_csn_sid( struct berval *csn ) +slap_parse_csn_sid( struct berval *csnp ) { char *p, *q; + struct berval csn = *csnp; int i; - p = memchr( csn->bv_val, '#', csn->bv_len ); - if ( p ) - p = strchr( p+1, '#' ); + p = ber_bvchr( &csn, '#' ); if ( !p ) return -1; p++; - i = strtoul( p, &q, 10 ); - if ( p == q || i > SLAP_SYNC_SID_MAX ) + csn.bv_len -= p - csn.bv_val; + csn.bv_val = p; + + p = ber_bvchr( &csn, '#' ); + if ( !p ) + return -1; + p++; + csn.bv_len -= p - csn.bv_val; + csn.bv_val = p; + + q = ber_bvchr( &csn, '#' ); + if ( !q ) + return -1; + + csn.bv_len = q - p; + + i = strtol( p, &q, 16 ); + if ( p == q || q != p + csn.bv_len || i < 0 || i > SLAP_SYNC_SID_MAX ) { i = -1; + } + return i; } int * -slap_parse_csn_sids( BerVarray csns, int numcsns ) +slap_parse_csn_sids( BerVarray csns, int numcsns, void *memctx ) { int i, *ret; - char *p, *q; - ret = ch_malloc( numcsns * sizeof(int) ); + ret = slap_sl_malloc( numcsns * sizeof(int), memctx ); for ( i=0; irid = -1; + cookie->sid = -1; cookie->ctxcsn = NULL; cookie->sids = NULL; cookie->numcsns = 0; @@ -168,9 +194,14 @@ slap_parse_sync_cookie( for ( next=cookie->octet_str.bv_val; next < end; ) { if ( !strncmp( next, "rid=", STRLENOF("rid=") )) { - rid_ptr = next; - cookie->rid = strtoul( &rid_ptr[ STRLENOF( "rid=" ) ], &next, 10 ); - if ( next == rid_ptr || next > end || *next != ',' ) { + char *rid_ptr = next; + cookie->rid = strtol( &rid_ptr[ STRLENOF( "rid=" ) ], &next, 10 ); + if ( next == rid_ptr || + next > end || + ( *next && *next != ',' ) || + cookie->rid < 0 || + cookie->rid > SLAP_SYNC_RID_MAX ) + { return -1; } if ( *next == ',' ) { @@ -181,6 +212,23 @@ slap_parse_sync_cookie( } continue; } + if ( !strncmp( next, "sid=", STRLENOF("sid=") )) { + char *sid_ptr = next; + sid_ptr = next; + cookie->sid = strtol( &sid_ptr[ STRLENOF( "sid=" ) ], &next, 16 ); + if ( next == sid_ptr || + next > end || + ( *next && *next != ',' ) || + cookie->sid < 0 || + cookie->sid > SLAP_SYNC_SID_MAX ) + { + return -1; + } + if ( *next == ',' ) { + next++; + } + continue; + } if ( !strncmp( next, "csn=", STRLENOF("csn=") )) { slap_syntax_validate_func *validate; struct berval stamp; @@ -212,7 +260,9 @@ slap_parse_sync_cookie( else stamp.bv_len = end - csn_str; if ( ad ) { - value_add_one( &cookie->ctxcsn, &stamp ); + struct berval bv; + ber_dupbv_x( &bv, &stamp, memctx ); + ber_bvarray_add_x( &cookie->ctxcsn, &bv, memctx ); cookie->numcsns++; } if ( cval ) { @@ -229,7 +279,8 @@ slap_parse_sync_cookie( next++; } if ( cookie->numcsns ) { - cookie->sids = slap_parse_csn_sids( cookie->ctxcsn, cookie->numcsns ); + cookie->sids = slap_parse_csn_sids( cookie->ctxcsn, cookie->numcsns, + memctx ); } return 0; } @@ -258,6 +309,7 @@ slap_init_sync_cookie_ctxcsn( cookie->ctxcsn = NULL; value_add_one( &cookie->ctxcsn, &ctxcsn ); cookie->numcsns = 1; + cookie->sid = -1; return 0; } @@ -287,6 +339,7 @@ slap_dup_sync_cookie( } new->rid = src->rid; + new->sid = src->sid; new->numcsns = src->numcsns; if ( src->numcsns ) {