mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-06 10:46:21 +08:00
improve previous commit; fix ITS#5108 by letting both SID and RID be 0..4095, input/output in decimal, but consistently handled in hexadecimals within CSN
This commit is contained in:
parent
2132aa3b16
commit
7dc7c60c4b
@ -854,7 +854,9 @@ factor is measure of security provided by the underlying transport,
|
|||||||
e.g. ldapi:// (and eventually IPSEC). It is not normally used.
|
e.g. ldapi:// (and eventually IPSEC). It is not normally used.
|
||||||
.TP
|
.TP
|
||||||
.B serverID <integer> [<URL>]
|
.B serverID <integer> [<URL>]
|
||||||
Specify an integer ID from 0 to 4095 for this server. These IDs are
|
Specify an integer ID from 0 to 4095 for this server (limited
|
||||||
|
to 3 hexadecimal digits).
|
||||||
|
These IDs are
|
||||||
required when using multimaster replication and each master must have a
|
required when using multimaster replication and each master must have a
|
||||||
unique ID. If the URL is provided, this directive may be specified
|
unique ID. If the URL is provided, this directive may be specified
|
||||||
multiple times, providing a complete list of participating servers
|
multiple times, providing a complete list of participating servers
|
||||||
@ -1584,7 +1586,8 @@ replication engine.
|
|||||||
identifies the current
|
identifies the current
|
||||||
.B syncrepl
|
.B syncrepl
|
||||||
directive within the replication consumer site.
|
directive within the replication consumer site.
|
||||||
It is a non-negative integer having no more than three digits.
|
It is a non-negative integer not greater than 4095 (limited
|
||||||
|
to three hexadecimal digits).
|
||||||
|
|
||||||
.B provider
|
.B provider
|
||||||
specifies the replication provider site containing the master content
|
specifies the replication provider site containing the master content
|
||||||
|
@ -945,6 +945,7 @@ config_generic(ConfigArgs *c) {
|
|||||||
struct berval bv;
|
struct berval bv;
|
||||||
|
|
||||||
for ( si = sid_list; si; si=si->si_next ) {
|
for ( si = sid_list; si; si=si->si_next ) {
|
||||||
|
assert( si->si_num >= 0 && si->si_num <= SLAP_SYNC_SID_MAX );
|
||||||
if ( !BER_BVISEMPTY( &si->si_url )) {
|
if ( !BER_BVISEMPTY( &si->si_url )) {
|
||||||
bv.bv_len = si->si_url.bv_len + 6;
|
bv.bv_len = si->si_url.bv_len + 6;
|
||||||
bv.bv_val = ch_malloc( bv.bv_len );
|
bv.bv_val = ch_malloc( bv.bv_len );
|
||||||
@ -1460,8 +1461,10 @@ config_generic(ConfigArgs *c) {
|
|||||||
{
|
{
|
||||||
ServerID *si, **sip;
|
ServerID *si, **sip;
|
||||||
LDAPURLDesc *lud;
|
LDAPURLDesc *lud;
|
||||||
int num = atoi( c->argv[1] );
|
int num;
|
||||||
if ( num < 0 || num > SLAP_SYNC_SID_MAX ) {
|
if ( lutil_atoi( &num, c->argv[1] ) ||
|
||||||
|
num < 0 || num > SLAP_SYNC_SID_MAX )
|
||||||
|
{
|
||||||
snprintf( c->cr_msg, sizeof( c->cr_msg ),
|
snprintf( c->cr_msg, sizeof( c->cr_msg ),
|
||||||
"<%s> illegal server ID", c->argv[0] );
|
"<%s> illegal server ID", c->argv[0] );
|
||||||
Debug(LDAP_DEBUG_ANY, "%s: %s %s\n",
|
Debug(LDAP_DEBUG_ANY, "%s: %s %s\n",
|
||||||
|
@ -120,20 +120,37 @@ slap_sync_cookie_free(
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
slap_parse_csn_sid( struct berval *csn )
|
slap_parse_csn_sid( struct berval *csnp )
|
||||||
{
|
{
|
||||||
char *p, *q;
|
char *p, *q;
|
||||||
|
struct berval csn = *csnp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
p = memchr( csn->bv_val, '#', csn->bv_len );
|
p = ber_bvchr( &csn, '#' );
|
||||||
if ( p )
|
|
||||||
p = strchr( p+1, '#' );
|
|
||||||
if ( !p )
|
if ( !p )
|
||||||
return -1;
|
return -1;
|
||||||
p++;
|
p++;
|
||||||
i = strtoul( p, &q, 10 );
|
csn.bv_len -= p - csn.bv_val;
|
||||||
if ( p == q || i > SLAP_SYNC_SID_MAX )
|
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 = (int)strtoul( p, &q, 16 );
|
||||||
|
if ( p == q || q != p + csn.bv_len || i > SLAP_SYNC_SID_MAX ) {
|
||||||
i = -1;
|
i = -1;
|
||||||
|
}
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +52,6 @@ slapadd( int argc, char **argv )
|
|||||||
|
|
||||||
struct berval csn;
|
struct berval csn;
|
||||||
struct berval maxcsn[ SLAP_SYNC_SID_MAX + 1 ];
|
struct berval maxcsn[ SLAP_SYNC_SID_MAX + 1 ];
|
||||||
MatchingRule *mr_csnsid;
|
|
||||||
unsigned long sid;
|
unsigned long sid;
|
||||||
struct berval bvtext;
|
struct berval bvtext;
|
||||||
Attribute *attr;
|
Attribute *attr;
|
||||||
@ -104,8 +103,6 @@ slapadd( int argc, char **argv )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( update_ctxcsn ) {
|
if ( update_ctxcsn ) {
|
||||||
mr_csnsid = mr_find( "CSNSIDMatch" );
|
|
||||||
assert( mr_csnsid != NULL );
|
|
||||||
maxcsn[ 0 ].bv_val = maxcsnbuf;
|
maxcsn[ 0 ].bv_val = maxcsnbuf;
|
||||||
for ( sid = 1; sid <= SLAP_SYNC_SID_MAX; sid++ ) {
|
for ( sid = 1; sid <= SLAP_SYNC_SID_MAX; sid++ ) {
|
||||||
maxcsn[ sid ].bv_val = maxcsn[ sid - 1 ].bv_val + LDAP_LUTIL_CSNSTR_BUFSIZE;
|
maxcsn[ sid ].bv_val = maxcsn[ sid - 1 ].bv_val + LDAP_LUTIL_CSNSTR_BUFSIZE;
|
||||||
@ -280,24 +277,21 @@ slapadd( int argc, char **argv )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( update_ctxcsn ) {
|
if ( update_ctxcsn ) {
|
||||||
struct berval nsid;
|
int rc_sid;
|
||||||
|
|
||||||
attr = attr_find( e->e_attrs, slap_schema.si_ad_entryCSN );
|
attr = attr_find( e->e_attrs, slap_schema.si_ad_entryCSN );
|
||||||
assert( attr != NULL );
|
assert( attr != NULL );
|
||||||
|
|
||||||
rc = mr_csnsid->smr_normalize( SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
|
rc_sid = slap_parse_csn_sid( &attr->a_nvals[ 0 ] );
|
||||||
NULL, NULL, &attr->a_nvals[ 0 ], &nsid, NULL );
|
if ( rc_sid < 0 ) {
|
||||||
assert( rc == LDAP_SUCCESS );
|
|
||||||
rc = lutil_atoulx( &sid, nsid.bv_val, 16 );
|
|
||||||
ber_memfree( nsid.bv_val );
|
|
||||||
if ( rc ) {
|
|
||||||
Debug( LDAP_DEBUG_ANY, "%s: could not "
|
Debug( LDAP_DEBUG_ANY, "%s: could not "
|
||||||
"extract SID from entryCSN=%s\n",
|
"extract SID from entryCSN=%s\n",
|
||||||
progname, attr->a_nvals[ 0 ].bv_val, 0 );
|
progname, attr->a_nvals[ 0 ].bv_val, 0 );
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
assert( sid <= SLAP_SYNC_SID_MAX );
|
assert( rc_sid <= SLAP_SYNC_SID_MAX );
|
||||||
|
|
||||||
|
sid = (unsigned)rc_sid;
|
||||||
if ( maxcsn[ sid ].bv_len != 0 ) {
|
if ( maxcsn[ sid ].bv_len != 0 ) {
|
||||||
match = 0;
|
match = 0;
|
||||||
value_match( &match, slap_schema.si_ad_entryCSN,
|
value_match( &match, slap_schema.si_ad_entryCSN,
|
||||||
@ -355,19 +349,10 @@ slapadd( int argc, char **argv )
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for ( i = 0; !BER_BVISNULL( &attr->a_vals[ i ] ); i++ ) {
|
for ( i = 0; !BER_BVISNULL( &attr->a_vals[ i ] ); i++ ) {
|
||||||
struct berval nsid;
|
int rc_sid;
|
||||||
|
|
||||||
rc = mr_csnsid->smr_normalize( SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
|
rc_sid = slap_parse_csn_sid( &attr->a_nvals[ i ] );
|
||||||
NULL, NULL, &attr->a_nvals[ i ], &nsid, NULL );
|
if ( rc_sid < 0 ) {
|
||||||
|
|
||||||
/* must succeed, since it passed
|
|
||||||
* validation/normalization */
|
|
||||||
assert( rc == LDAP_SUCCESS );
|
|
||||||
|
|
||||||
rc = lutil_atoulx( &sid, nsid.bv_val, 16 );
|
|
||||||
ber_memfree( nsid.bv_val );
|
|
||||||
|
|
||||||
if ( rc ) {
|
|
||||||
Debug( LDAP_DEBUG_ANY,
|
Debug( LDAP_DEBUG_ANY,
|
||||||
"%s: unable to extract SID "
|
"%s: unable to extract SID "
|
||||||
"from #%d contextCSN=%s\n",
|
"from #%d contextCSN=%s\n",
|
||||||
@ -376,6 +361,10 @@ slapadd( int argc, char **argv )
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert( rc_sid <= SLAP_SYNC_SID_MAX );
|
||||||
|
|
||||||
|
sid = (unsigned)rc_sid;
|
||||||
|
|
||||||
if ( maxcsn[ sid ].bv_len == 0 ) {
|
if ( maxcsn[ sid ].bv_len == 0 ) {
|
||||||
match = -1;
|
match = -1;
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ typedef struct syncinfo_s {
|
|||||||
BackendDB *si_wbe;
|
BackendDB *si_wbe;
|
||||||
struct re_s *si_re;
|
struct re_s *si_re;
|
||||||
int si_rid;
|
int si_rid;
|
||||||
char si_ridtxt[8];
|
char si_ridtxt[ STRLENOF("rid=4095") + 1 ];
|
||||||
slap_bindconf si_bindconf;
|
slap_bindconf si_bindconf;
|
||||||
struct berval si_base;
|
struct berval si_base;
|
||||||
struct berval si_logbase;
|
struct berval si_logbase;
|
||||||
@ -3351,15 +3351,15 @@ parse_syncrepl_line(
|
|||||||
Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 );
|
Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if ( tmp >= 1000 || tmp < 0 ) {
|
if ( tmp > SLAP_SYNC_SID_MAX || tmp < 0 ) {
|
||||||
snprintf( c->cr_msg, sizeof( c->cr_msg ),
|
snprintf( c->cr_msg, sizeof( c->cr_msg ),
|
||||||
"Error: parse_syncrepl_line: "
|
"Error: parse_syncrepl_line: "
|
||||||
"syncrepl id %d is out of range [0..999]", tmp );
|
"syncrepl id %d is out of range [0..4095]", tmp );
|
||||||
Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 );
|
Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
si->si_rid = tmp;
|
si->si_rid = tmp;
|
||||||
sprintf( si->si_ridtxt, IDSTR "=%03d", si->si_rid );
|
sprintf( si->si_ridtxt, IDSTR "=%d", si->si_rid );
|
||||||
gots |= GOT_ID;
|
gots |= GOT_ID;
|
||||||
} else if ( !strncasecmp( c->argv[ i ], PROVIDERSTR "=",
|
} else if ( !strncasecmp( c->argv[ i ], PROVIDERSTR "=",
|
||||||
STRLENOF( PROVIDERSTR "=" ) ) )
|
STRLENOF( PROVIDERSTR "=" ) ) )
|
||||||
@ -3905,7 +3905,8 @@ syncrepl_unparse( syncinfo_t *si, struct berval *bv )
|
|||||||
si->si_bindconf.sb_version = LDAP_VERSION3;
|
si->si_bindconf.sb_version = LDAP_VERSION3;
|
||||||
|
|
||||||
ptr = buf;
|
ptr = buf;
|
||||||
ptr += snprintf( ptr, WHATSLEFT, IDSTR "=%03d " PROVIDERSTR "=%s",
|
assert( si->si_rid >= 0 && si->si_rid <= SLAP_SYNC_SID_MAX );
|
||||||
|
ptr += snprintf( ptr, WHATSLEFT, IDSTR "=%d " PROVIDERSTR "=%s",
|
||||||
si->si_rid, si->si_bindconf.sb_uri.bv_val );
|
si->si_rid, si->si_bindconf.sb_uri.bv_val );
|
||||||
if ( ptr - buf >= sizeof( buf ) ) return;
|
if ( ptr - buf >= sizeof( buf ) ) return;
|
||||||
if ( !BER_BVISNULL( &bc ) ) {
|
if ( !BER_BVISNULL( &bc ) ) {
|
||||||
|
Loading…
Reference in New Issue
Block a user