diff options
author | Oliver Eikemeier <eik@FreeBSD.org> | 2003-11-14 03:57:13 +0000 |
---|---|---|
committer | Oliver Eikemeier <eik@FreeBSD.org> | 2003-11-14 03:57:13 +0000 |
commit | df15f5fedf93ebb5a0f6c59931c9140680410aae (patch) | |
tree | 2d8e33442ac49d46b6a6f74dcbc9c07fcd5326dc /net/openldap20-server/files/patch-servers::slapd::back-ldbm::idl.c | |
parent | Update to 20031029. (diff) |
** NOTICE: **
* OpenLDAP 2.0 is no longer actively maintained by the OpenLDAP Project.
* You are strongly encouraged to update to OpenLDAP 2.1
* Port maintainers: Please respect the default in bsd.port.mk
* I plan to remove OpenLDAP 2.0 from the FreeBSD ports tree May 2004
- Update net/openldap21-client and net/openldap21-server to version 2.1.23
- Update net/openldap22-client and net/openldap22-server to version 2.2.2.b,
fix ITS#2747 from CVS
- some fixes for net/openldap20-server from CVS, seems like there won't be
a 2.0.28 release anymore
- remove conflict with deleted port net/openldap12
- use PORTDOCS
- use USE_OPENSSL
- don't use _REENTRANT
- add a deinstall message
PR: 58278
Submitted by: me
Approved by: marcus (mentor)
Notes
Notes:
svn path=/head/; revision=93932
Diffstat (limited to 'net/openldap20-server/files/patch-servers::slapd::back-ldbm::idl.c')
-rw-r--r-- | net/openldap20-server/files/patch-servers::slapd::back-ldbm::idl.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/net/openldap20-server/files/patch-servers::slapd::back-ldbm::idl.c b/net/openldap20-server/files/patch-servers::slapd::back-ldbm::idl.c new file mode 100644 index 000000000000..b41a8d9c95fb --- /dev/null +++ b/net/openldap20-server/files/patch-servers::slapd::back-ldbm::idl.c @@ -0,0 +1,106 @@ +# +# ITS#2348: Index corruption and crash in back-ldbm +# +--- servers/slapd/back-ldbm/idl.c.orig Fri Aug 23 20:09:40 2002 ++++ servers/slapd/back-ldbm/idl.c Wed Mar 12 12:42:29 2003 +@@ -478,9 +478,9 @@ + */ + + /* select the block to try inserting into *//* XXX linear search XXX */ +- for ( i = 0; !ID_BLOCK_NOID(idl, i) && id > ID_BLOCK_ID(idl, i); i++ ) ++ for ( i = 0; !ID_BLOCK_NOID(idl, i) && id >= ID_BLOCK_ID(idl, i); i++ ) + ; /* NULL */ +- ++ + if ( i != 0 ) { + i--; + first = 0; +@@ -488,6 +488,11 @@ + first = 1; + } + ++ /* At this point the following condition must be true: ++ * ID_BLOCK_ID(idl, i) <= id && id < ID_BLOCK_ID(idl, i+1) ++ * except when i is the first or the last block. ++ */ ++ + /* get the block */ + cont_alloc( &k2, &key ); + cont_id( &k2, ID_BLOCK_ID(idl, i) ); +@@ -533,15 +538,16 @@ + + /* is there a next block? */ + if ( !first && !ID_BLOCK_NOID(idl, i + 1) ) { ++ Datum k3; + /* read it in */ +- cont_alloc( &k2, &key ); +- cont_id( &k2, ID_BLOCK_ID(idl, i + 1) ); +- if ( (tmp2 = idl_fetch_one( be, db, k2 )) == NULL ) { ++ cont_alloc( &k3, &key ); ++ cont_id( &k3, ID_BLOCK_ID(idl, i + 1) ); ++ if ( (tmp2 = idl_fetch_one( be, db, k3 )) == NULL ) { + Debug( LDAP_DEBUG_ANY, + "idl_insert_key: idl_fetch_one returned NULL\n", + 0, 0, 0 ); + /* split the original block */ +- cont_free( &k2 ); ++ cont_free( &k3 ); + goto split; + } + +@@ -552,9 +558,6 @@ + */ + if (id < ID_BLOCK_ID(tmp, ID_BLOCK_NIDS(tmp) - 1)) { + ID id2 = ID_BLOCK_ID(tmp, ID_BLOCK_NIDS(tmp) - 1); +- Datum k3; +- +- ldbm_datum_init( k3 ); + + --ID_BLOCK_NIDS(tmp); + /* This must succeed since we just popped one +@@ -562,16 +565,11 @@ + */ + rc = idl_insert( &tmp, id, db->dbc_maxids ); + +- k3.dptr = ch_malloc(k2.dsize); +- k3.dsize = k2.dsize; +- AC_MEMCPY(k3.dptr, k2.dptr, k3.dsize); +- if ( (rc = idl_store( be, db, k3, tmp )) != 0 ) { ++ if ( (rc = idl_store( be, db, k2, tmp )) != 0 ) { + Debug( LDAP_DEBUG_ANY, + "idl_insert_key: idl_store returned %d\n", rc, 0, 0 ); + } + +- free( k3.dptr ); +- + id = id2; + /* This new id will necessarily be inserted + * as the first id of the next block by the +@@ -583,7 +581,7 @@ + db->dbc_maxids )) ) { + case 1: /* id inserted first in block */ + rc = idl_change_first( be, db, key, idl, +- i + 1, k2, tmp2 ); ++ i + 1, k3, tmp2 ); + /* FALL */ + + case 2: /* id already there - how? */ +@@ -598,8 +596,10 @@ + id, 0, 0 ); + } + ++ cont_free( &k3 ); + idl_free( tmp ); + idl_free( tmp2 ); ++ cont_free( &k2 ); + idl_free( idl ); + return( 0 ); + +@@ -607,6 +607,7 @@ + break; + } + ++ cont_free( &k3 ); + idl_free( tmp2 ); + } + |