From e5c21d4af6895f99e2b921eac3dd775b151b416e Mon Sep 17 00:00:00 2001 From: Jan Zeleny Date: Nov 06 2009 09:27:11 +0000 Subject: rebase of both openldap and bdb --- diff --git a/.cvsignore b/.cvsignore index 3f18370..6ad21bc 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,2 +1,2 @@ -openldap-2.4.18.tgz -db-4.7.25.tar.gz +db-4.8.24.tar.gz +openldap-2.4.19.tgz diff --git a/openldap-2.4.18-ldif-buf-overflow.patch b/openldap-2.4.18-ldif-buf-overflow.patch deleted file mode 100644 index b767f12..0000000 --- a/openldap-2.4.18-ldif-buf-overflow.patch +++ /dev/null @@ -1,17 +0,0 @@ -Avoid the struct hack, just malloc two data structures in one chunk: - ---- openldap-2.4.18/servers/slapd/back-ldif/ldif.c.orig 2009-08-18 23:58:27 -+++ openldap-2.4.18/servers/slapd/back-ldif/ldif.c 2009-09-24 16:08:14 -@@ -593,9 +593,9 @@ typedef struct bvlist { - char *trunc; /* filename was truncated here */ - int inum; /* num from "attr={num}" in filename, or INT_MIN */ - char savech; /* original char at *trunc */ -- char fname; /* variable length array BVL_NAME(bvl) = &fname */ --# define BVL_NAME(bvl) ((char *) (bvl) + offsetof(bvlist, fname)) --# define BVL_SIZE(namelen) (sizeof(bvlist) + (namelen)) -+ /* BVL_NAME(&bvlist) is the filename, allocated after the struct: */ -+# define BVL_NAME(bvl) ((char *) ((bvl) + 1)) -+# define BVL_SIZE(namelen) (sizeof(bvlist) + (namelen) + 1) - } bvlist; - - static int diff --git a/openldap.spec b/openldap.spec index 552d571..91fe494 100644 --- a/openldap.spec +++ b/openldap.spec @@ -1,9 +1,9 @@ # We distribute own version of Berkeley DB to prevent # problems on db4.rpm upgrade - some versions of db4 do # not work with some versions of OpenLDAP. -%define db_version 4.7.25 +%define db_version 4.8.24 %define ldbm_backend berkeley -%define version 2.4.18 +%define version 2.4.19 %define evolution_connector_prefix %{_libdir}/evolution-openldap %define evolution_connector_includedir %{evolution_connector_prefix}/include %define evolution_connector_libdir %{evolution_connector_prefix}/%{_lib} @@ -11,7 +11,7 @@ Summary: LDAP support libraries Name: openldap Version: %{version} -Release: 4%{?dist} +Release: 1%{?dist} License: OpenLDAP Group: System Environment/Daemons Source0: ftp://ftp.OpenLDAP.org/pub/OpenLDAP/openldap-release/openldap-%{version}.tgz @@ -35,16 +35,10 @@ Patch6: openldap-2.3.19-gethostbyXXXX_r.patch Patch9: openldap-2.3.37-smbk5pwd.patch Patch10: openldap-2.4.6-multilib.patch Patch11: openldap-2.4.16-doc-cacertdir.patch -Patch12: openldap-2.4.18-ldif-buf-overflow.patch # Patches for the evolution library Patch200: openldap-2.4.6-evolution-ntlm.patch -# Patches for db4 library -Patch400: patch.4.7.25.1 -Patch401: patch.4.7.25.2 -Patch402: patch.4.7.25.3 - URL: http://www.openldap.org/ BuildRoot: %{_tmppath}/%{name}-%{version}-root BuildRequires: cyrus-sasl-devel >= 2.1, gdbm-devel, libtool >= 1.5.6-2, krb5-devel @@ -125,12 +119,6 @@ programs needed for accessing and modifying OpenLDAP directories. %prep %setup -q -c -a 1 -pushd db-%{db_version} -%patch400 -p0 -b .patch1 -%patch401 -p0 -b .patch2 -%patch402 -p0 -b .patch3 -popd - pushd openldap-%{version} %patch0 -p1 -b .config %patch1 -p1 -b .ldaprc @@ -142,7 +130,6 @@ pushd openldap-%{version} %patch9 -p1 -b .smbk5pwd %patch10 -p1 -b .multilib %patch11 -p1 -b .cacertdir -%patch12 -p1 -b .malloc cp %{_datadir}/libtool/config/config.{sub,guess} build/ popd @@ -645,6 +632,10 @@ fi %attr(0644,root,root) %{evolution_connector_libdir}/*.a %changelog +* Fri Nov 06 2009 Jan Zeleny - 2.4.19-1 +- rebased openldap to 2.4.19 +- rebased bdb to 4.8.24 + * Wed Oct 07 2009 Jan Zeleny 2.4.18-4 - updated smbk5pwd patch to be linked with libldap (#526500) - the last buffer overflow patch replaced with the one from upstream diff --git a/patch.4.7.25.1 b/patch.4.7.25.1 deleted file mode 100644 index 0d258ed..0000000 --- a/patch.4.7.25.1 +++ /dev/null @@ -1,75 +0,0 @@ -*** sequence/sequence.c.orig 2008-05-05 13:25:09.000000000 -0700 ---- sequence/sequence.c 2008-08-15 09:58:46.000000000 -0700 -*************** -*** 187,193 **** - if ((ret = __db_get_flags(dbp, &tflags)) != 0) - goto err; - -! if (DB_IS_READONLY(dbp)) { - ret = __db_rdonly(dbp->env, "DB_SEQUENCE->open"); - goto err; - } ---- 187,197 ---- - if ((ret = __db_get_flags(dbp, &tflags)) != 0) - goto err; - -! /* -! * We can let replication clients open sequences, but must -! * check later that they do not update them. -! */ -! if (F_ISSET(dbp, DB_AM_RDONLY)) { - ret = __db_rdonly(dbp->env, "DB_SEQUENCE->open"); - goto err; - } -*************** -*** 244,249 **** ---- 248,258 ---- - if ((ret != DB_NOTFOUND && ret != DB_KEYEMPTY) || - !LF_ISSET(DB_CREATE)) - goto err; -+ if (IS_REP_CLIENT(env) && -+ !F_ISSET(dbp, DB_AM_NOT_DURABLE)) { -+ ret = __db_rdonly(env, "DB_SEQUENCE->open"); -+ goto err; -+ } - ret = 0; - - rp = &seq->seq_record; -*************** -*** 296,302 **** - */ - rp = seq->seq_data.data; - if (rp->seq_version == DB_SEQUENCE_OLDVER) { -! oldver: rp->seq_version = DB_SEQUENCE_VERSION; - if (!F_ISSET(env, ENV_LITTLEENDIAN)) { - if (IS_DB_AUTO_COMMIT(dbp, txn)) { - if ((ret = ---- 305,316 ---- - */ - rp = seq->seq_data.data; - if (rp->seq_version == DB_SEQUENCE_OLDVER) { -! oldver: if (IS_REP_CLIENT(env) && -! !F_ISSET(dbp, DB_AM_NOT_DURABLE)) { -! ret = __db_rdonly(env, "DB_SEQUENCE->open"); -! goto err; -! } -! rp->seq_version = DB_SEQUENCE_VERSION; - if (!F_ISSET(env, ENV_LITTLEENDIAN)) { - if (IS_DB_AUTO_COMMIT(dbp, txn)) { - if ((ret = -*************** -*** 707,712 **** ---- 721,733 ---- - - MUTEX_LOCK(env, seq->mtx_seq); - -+ if (handle_check && IS_REP_CLIENT(env) && -+ !F_ISSET(dbp, DB_AM_NOT_DURABLE)) { -+ ret = __db_rdonly(env, "DB_SEQUENCE->get"); -+ goto err; -+ } -+ -+ - if (rp->seq_min + delta > rp->seq_max) { - __db_errx(env, "Sequence overflow"); - ret = EINVAL; diff --git a/patch.4.7.25.2 b/patch.4.7.25.2 deleted file mode 100644 index 2e4a7ec..0000000 --- a/patch.4.7.25.2 +++ /dev/null @@ -1,71 +0,0 @@ -Index: lock/lock.c -=================================================================== -RCS file: /a/CVSROOT/db/lock/lock.c,v -retrieving revision 12.61 -diff -c -r12.61 lock.c -*** lock/lock.c 22 Jul 2008 12:08:53 -0000 12.61 ---- lock/lock.c 19 Aug 2008 17:28:24 -0000 -*************** -*** 1278,1287 **** - SH_TAILQ_REMOVE( - <->obj_tab[obj_ndx], sh_obj, links, __db_lockobj); - if (sh_obj->lockobj.size > sizeof(sh_obj->objdata)) { -! LOCK_REGION_LOCK(env); - __env_alloc_free(<->reginfo, - SH_DBT_PTR(&sh_obj->lockobj)); -! LOCK_REGION_UNLOCK(env); - } - SH_TAILQ_INSERT_HEAD( - &FREE_OBJS(lt, part_id), sh_obj, links, __db_lockobj); ---- 1278,1289 ---- - SH_TAILQ_REMOVE( - <->obj_tab[obj_ndx], sh_obj, links, __db_lockobj); - if (sh_obj->lockobj.size > sizeof(sh_obj->objdata)) { -! if (region->part_t_size != 1) -! LOCK_REGION_LOCK(env); - __env_alloc_free(<->reginfo, - SH_DBT_PTR(&sh_obj->lockobj)); -! if (region->part_t_size != 1) -! LOCK_REGION_UNLOCK(env); - } - SH_TAILQ_INSERT_HEAD( - &FREE_OBJS(lt, part_id), sh_obj, links, __db_lockobj); -*************** -*** 1470,1484 **** - if (obj->size <= sizeof(sh_obj->objdata)) - p = sh_obj->objdata; - else { -! LOCK_REGION_LOCK(env); - if ((ret = - __env_alloc(<->reginfo, obj->size, &p)) != 0) { - __db_errx(env, - "No space for lock object storage"); -! LOCK_REGION_UNLOCK(env); - goto err; - } -! LOCK_REGION_UNLOCK(env); - } - - memcpy(p, obj->data, obj->size); ---- 1472,1492 ---- - if (obj->size <= sizeof(sh_obj->objdata)) - p = sh_obj->objdata; - else { -! /* -! * If we have only one partition, the region is locked. -! */ -! if (region->part_t_size != 1) -! LOCK_REGION_LOCK(env); - if ((ret = - __env_alloc(<->reginfo, obj->size, &p)) != 0) { - __db_errx(env, - "No space for lock object storage"); -! if (region->part_t_size != 1) -! LOCK_REGION_UNLOCK(env); - goto err; - } -! if (region->part_t_size != 1) -! LOCK_REGION_UNLOCK(env); - } - - memcpy(p, obj->data, obj->size); diff --git a/patch.4.7.25.3 b/patch.4.7.25.3 deleted file mode 100644 index 316d615..0000000 --- a/patch.4.7.25.3 +++ /dev/null @@ -1,314 +0,0 @@ -*** lock/lock_deadlock.c 2008-03-11 00:31:33.000000000 +1100 ---- lock/lock_deadlock.c 2008-12-16 21:54:18.000000000 +1100 -*************** -*** 121,127 **** - DB_LOCKTAB *lt; - db_timespec now; - locker_info *idmap; -! u_int32_t *bitmap, *copymap, **deadp, **free_me, *tmpmap; - u_int32_t i, cid, keeper, killid, limit, nalloc, nlockers; - u_int32_t lock_max, txn_max; - int ret, status; ---- 121,127 ---- - DB_LOCKTAB *lt; - db_timespec now; - locker_info *idmap; -! u_int32_t *bitmap, *copymap, **deadp, **deadlist, *tmpmap; - u_int32_t i, cid, keeper, killid, limit, nalloc, nlockers; - u_int32_t lock_max, txn_max; - int ret, status; -*************** -*** 133,139 **** - if (IS_REP_CLIENT(env)) - atype = DB_LOCK_MINWRITE; - -! free_me = NULL; - - lt = env->lk_handle; - if (rejectp != NULL) ---- 133,140 ---- - if (IS_REP_CLIENT(env)) - atype = DB_LOCK_MINWRITE; - -! copymap = tmpmap = NULL; -! deadlist = NULL; - - lt = env->lk_handle; - if (rejectp != NULL) -*************** -*** 179,189 **** - memcpy(copymap, bitmap, nlockers * sizeof(u_int32_t) * nalloc); - - if ((ret = __os_calloc(env, sizeof(u_int32_t), nalloc, &tmpmap)) != 0) -! goto err1; - - /* Find a deadlock. */ - if ((ret = -! __dd_find(env, bitmap, idmap, nlockers, nalloc, &deadp)) != 0) - return (ret); - - /* ---- 180,190 ---- - memcpy(copymap, bitmap, nlockers * sizeof(u_int32_t) * nalloc); - - if ((ret = __os_calloc(env, sizeof(u_int32_t), nalloc, &tmpmap)) != 0) -! goto err; - - /* Find a deadlock. */ - if ((ret = -! __dd_find(env, bitmap, idmap, nlockers, nalloc, &deadlist)) != 0) - return (ret); - - /* -*************** -*** 204,211 **** - txn_max = TXN_MAXIMUM; - - killid = BAD_KILLID; -! free_me = deadp; -! for (; *deadp != NULL; deadp++) { - if (rejectp != NULL) - ++*rejectp; - killid = (u_int32_t)(*deadp - bitmap) / nalloc; ---- 205,211 ---- - txn_max = TXN_MAXIMUM; - - killid = BAD_KILLID; -! for (deadp = deadlist; *deadp != NULL; deadp++) { - if (rejectp != NULL) - ++*rejectp; - killid = (u_int32_t)(*deadp - bitmap) / nalloc; -*************** -*** 342,352 **** - __db_msg(env, - "Aborting locker %lx", (u_long)idmap[killid].id); - } -! __os_free(env, tmpmap); -! err1: __os_free(env, copymap); -! -! err: if (free_me != NULL) -! __os_free(env, free_me); - __os_free(env, bitmap); - __os_free(env, idmap); - ---- 342,353 ---- - __db_msg(env, - "Aborting locker %lx", (u_long)idmap[killid].id); - } -! err: if(copymap != NULL) -! __os_free(env, copymap); -! if (deadlist != NULL) -! __os_free(env, deadlist); -! if(tmpmap != NULL) -! __os_free(env, tmpmap); - __os_free(env, bitmap); - __os_free(env, idmap); - -*************** -*** 360,365 **** ---- 361,377 ---- - - #define DD_INVALID_ID ((u_int32_t) -1) - -+ /* -+ * __dd_build -- -+ * Build the lock dependency bit maps. -+ * Notes on syncronization: -+ * LOCK_SYSTEM_LOCK is used to hold objects locked when we have -+ * a single partition. -+ * LOCK_LOCKERS is held while we are walking the lockers list and -+ * to single thread the use of lockerp->dd_id. -+ * LOCK_DD protects the DD list of objects. -+ */ -+ - static int - __dd_build(env, atype, bmp, nlockers, allocp, idmap, rejectp) - ENV *env; -*************** -*** 393,398 **** ---- 405,411 ---- - * In particular we do not build the conflict array and our caller - * needs to expect this. - */ -+ LOCK_SYSTEM_LOCK(lt, region); - if (atype == DB_LOCK_EXPIRE) { - skip: LOCK_DD(env, region); - op = SH_TAILQ_FIRST(®ion->dd_objs, __db_lockobj); -*************** -*** 430,446 **** - OBJECT_UNLOCK(lt, region, indx); - } - UNLOCK_DD(env, region); - goto done; - } - - /* -! * We'll check how many lockers there are, add a few more in for -! * good measure and then allocate all the structures. Then we'll -! * verify that we have enough room when we go back in and get the -! * mutex the second time. - */ -! retry: count = region->stat.st_nlockers; - if (count == 0) { - *nlockers = 0; - return (0); - } ---- 443,460 ---- - OBJECT_UNLOCK(lt, region, indx); - } - UNLOCK_DD(env, region); -+ LOCK_SYSTEM_UNLOCK(lt, region); - goto done; - } - - /* -! * Allocate after locking the region -! * to make sure the structures are large enough. - */ -! LOCK_LOCKERS(env, region); -! count = region->stat.st_nlockers; - if (count == 0) { -+ UNLOCK_LOCKERS(env, region); - *nlockers = 0; - return (0); - } -*************** -*** 448,497 **** - if (FLD_ISSET(env->dbenv->verbose, DB_VERB_DEADLOCK)) - __db_msg(env, "%lu lockers", (u_long)count); - -- count += 20; - nentries = (u_int32_t)DB_ALIGN(count, 32) / 32; - -! /* -! * Allocate enough space for a count by count bitmap matrix. -! * -! * XXX -! * We can probably save the malloc's between iterations just -! * reallocing if necessary because count grew by too much. -! */ - if ((ret = __os_calloc(env, (size_t)count, -! sizeof(u_int32_t) * nentries, &bitmap)) != 0) - return (ret); - - if ((ret = __os_calloc(env, - sizeof(u_int32_t), nentries, &tmpmap)) != 0) { - __os_free(env, bitmap); - return (ret); - } - - if ((ret = __os_calloc(env, - (size_t)count, sizeof(locker_info), &id_array)) != 0) { - __os_free(env, bitmap); - __os_free(env, tmpmap); - return (ret); - } - - /* -- * Now go back in and actually fill in the matrix. -- */ -- if (region->stat.st_nlockers > count) { -- __os_free(env, bitmap); -- __os_free(env, tmpmap); -- __os_free(env, id_array); -- goto retry; -- } -- -- /* - * First we go through and assign each locker a deadlock detector id. - */ - id = 0; -- LOCK_LOCKERS(env, region); - SH_TAILQ_FOREACH(lip, ®ion->lockers, ulinks, __db_locker) { - if (lip->master_locker == INVALID_ROFF) { - lip->dd_id = id++; - id_array[lip->dd_id].id = lip->id; - switch (atype) { ---- 462,498 ---- - if (FLD_ISSET(env->dbenv->verbose, DB_VERB_DEADLOCK)) - __db_msg(env, "%lu lockers", (u_long)count); - - nentries = (u_int32_t)DB_ALIGN(count, 32) / 32; - -! /* Allocate enough space for a count by count bitmap matrix. */ - if ((ret = __os_calloc(env, (size_t)count, -! sizeof(u_int32_t) * nentries, &bitmap)) != 0) { -! UNLOCK_LOCKERS(env, region); - return (ret); -+ } - - if ((ret = __os_calloc(env, - sizeof(u_int32_t), nentries, &tmpmap)) != 0) { -+ UNLOCK_LOCKERS(env, region); - __os_free(env, bitmap); - return (ret); - } - - if ((ret = __os_calloc(env, - (size_t)count, sizeof(locker_info), &id_array)) != 0) { -+ UNLOCK_LOCKERS(env, region); - __os_free(env, bitmap); - __os_free(env, tmpmap); - return (ret); - } - - /* - * First we go through and assign each locker a deadlock detector id. - */ - id = 0; - SH_TAILQ_FOREACH(lip, ®ion->lockers, ulinks, __db_locker) { - if (lip->master_locker == INVALID_ROFF) { -+ DB_ASSERT(env, id < count); - lip->dd_id = id++; - id_array[lip->dd_id].id = lip->id; - switch (atype) { -*************** -*** 510,516 **** - lip->dd_id = DD_INVALID_ID; - - } -- UNLOCK_LOCKERS(env, region); - - /* - * We only need consider objects that have waiters, so we use ---- 511,516 ---- -*************** -*** 669,675 **** - * status after building the bit maps so that we will not detect - * a blocked transaction without noting that it is already aborting. - */ -- LOCK_LOCKERS(env, region); - for (id = 0; id < count; id++) { - if (!id_array[id].valid) - continue; ---- 669,674 ---- -*************** -*** 738,743 **** ---- 737,743 ---- - id_array[id].in_abort = 1; - } - UNLOCK_LOCKERS(env, region); -+ LOCK_SYSTEM_UNLOCK(lt, region); - - /* - * Now we can release everything except the bitmap matrix that we -*************** -*** 839,844 **** ---- 839,845 ---- - ret = 0; - - /* We must lock so this locker cannot go away while we abort it. */ -+ LOCK_SYSTEM_LOCK(lt, region); - LOCK_LOCKERS(env, region); - - /* -*************** -*** 895,900 **** ---- 896,902 ---- - done: OBJECT_UNLOCK(lt, region, info->last_ndx); - err: - out: UNLOCK_LOCKERS(env, region); -+ LOCK_SYSTEM_UNLOCK(lt, region); - return (ret); - } - diff --git a/sources b/sources index edaad2d..1b26437 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ -fecd7a64b6d9a0eb79b817d2562956ed openldap-2.4.18.tgz -ec2b87e833779681a0c3a814aa71359e db-4.7.25.tar.gz +147afdecf438ff99ade105a5272db158 db-4.8.24.tar.gz +4a6dab2711fcf141f19bb680bc335887 openldap-2.4.19.tgz