diff options
| author | Adam Tkac <atkac@fedoraproject.org> | 2008-02-11 17:11:26 +0000 |
|---|---|---|
| committer | Adam Tkac <atkac@fedoraproject.org> | 2008-02-11 17:11:26 +0000 |
| commit | bbeea42ab3194cda396fdf32e9ee516cec4bb3ca (patch) | |
| tree | 9b777a864c486e21af457cae2ebc188ad676bb6a /bind-9.5-transfer-segv.patch | |
| parent | e31eda425bcf9874906f356b197ce4df0e70cec9 (diff) | |
| download | bind-bbeea42ab3194cda396fdf32e9ee516cec4bb3ca.tar.gz bind-bbeea42ab3194cda396fdf32e9ee516cec4bb3ca.tar.xz bind-bbeea42ab3194cda396fdf32e9ee516cec4bb3ca.zip | |
- build with -D_GNU_SOURCE (#431734)
- improved fix for #253537, posttrans script is now used
- improved fix for #400461
- 9.5.0b2
- bind-9.3.2b1-PIE.patch replaced by bind-9.5-PIE.patch
- only named, named-sdb and lwresd are PIE
- bind-9.5-sdb.patch has been updated
- bind-9.5-libidn.patch has been updated
- bind-9.4.0-sdb-sqlite-bld.patch replaced by bind-9.5-sdb-sqlite-bld.patch
- removed bind-9.5-gssapi-header.patch (upstream)
- removed bind-9.5-CVE-2008-0122.patch (upstream)
- removed bind-9.2.2-nsl.patch
Diffstat (limited to 'bind-9.5-transfer-segv.patch')
| -rw-r--r-- | bind-9.5-transfer-segv.patch | 206 |
1 files changed, 11 insertions, 195 deletions
diff --git a/bind-9.5-transfer-segv.patch b/bind-9.5-transfer-segv.patch index 656e0ff..8ba5456 100644 --- a/bind-9.5-transfer-segv.patch +++ b/bind-9.5-transfer-segv.patch @@ -1,197 +1,13 @@ diff -up bind-9.5.0b1/lib/dns/rbtdb.c.segv bind-9.5.0b1/lib/dns/rbtdb.c ---- bind-9.5.0b1/lib/dns/rbtdb.c.segv 2008-02-04 12:30:36.000000000 +0100 -+++ bind-9.5.0b1/lib/dns/rbtdb.c 2008-02-04 13:46:48.000000000 +0100 -@@ -763,23 +763,17 @@ free_rbtdb(dns_rbtdb_t *rbtdb, isc_boole - isc_mem_put(rbtdb->common.mctx, rbtdb->current_version, - sizeof(rbtdb_version_t)); +--- bind-9.5.0b1/lib/dns/rbtdb.c.segv 2008-02-11 14:52:12.000000000 +0100 ++++ bind-9.5.0b1/lib/dns/rbtdb.c 2008-02-11 14:55:58.000000000 +0100 +@@ -1633,7 +1633,8 @@ decrement_reference(dns_rbtdb_t *rbtdb, + "decrement_reference: " + "dns_rbt_deletenode: %s", + isc_result_totext(result)); +- } else if (dns_rbtnode_refcurrent(node) == 0) { ++ } else if (rbtdb->deadnodes != NULL && ++ dns_rbtnode_refcurrent(node) == 0) { + INSIST(!ISC_LINK_LINKED(node, deadlink)); + ISC_LIST_APPEND(rbtdb->deadnodes[bucket], node, deadlink); } -- if (IS_CACHE(rbtdb)) { -- /* -- * We assume the number of remaining dead nodes is reasonably -- * small; the overhead of unlinking all nodes here should be -- * negligible. -- */ -- for (i = 0; i < rbtdb->node_lock_count; i++) { -- dns_rbtnode_t *node; -- -- node = ISC_LIST_HEAD(rbtdb->deadnodes[i]); -- while (node != NULL) { -- ISC_LIST_UNLINK(rbtdb->deadnodes[i], node, -- deadlink); -- node = ISC_LIST_HEAD(rbtdb->deadnodes[i]); -- } -+ -+ for (i = 0; i < rbtdb->node_lock_count; i++) { -+ dns_rbtnode_t *node; -+ -+ node = ISC_LIST_HEAD(rbtdb->deadnodes[i]); -+ while (node != NULL) { -+ ISC_LIST_UNLINK(rbtdb->deadnodes[i], node, deadlink); -+ node = ISC_LIST_HEAD(rbtdb->deadnodes[i]); - } - } -+ - if (event == NULL) - rbtdb->quantum = (rbtdb->task != NULL) ? 100 : 0; - again: -@@ -1912,6 +1906,7 @@ closeversion(dns_db_t *db, dns_dbversion - } - - if (!EMPTY(cleanup_list)) { -+ RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); - for (changed = HEAD(cleanup_list); - changed != NULL; - changed = next_changed) { -@@ -1922,16 +1917,18 @@ closeversion(dns_db_t *db, dns_dbversion - lock = &rbtdb->node_locks[rbtnode->locknum].lock; - - NODE_LOCK(lock, isc_rwlocktype_write); -+ cleanup_dead_nodes(rbtdb, rbtnode->locknum); - if (rollback) - rollback_node(rbtnode, serial); - decrement_reference(rbtdb, rbtnode, least_serial, - isc_rwlocktype_write, -- isc_rwlocktype_none); -+ isc_rwlocktype_write); - NODE_UNLOCK(lock, isc_rwlocktype_write); - - isc_mem_put(rbtdb->common.mctx, changed, - sizeof(*changed)); - } -+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); - } - - end: -@@ -2009,6 +2006,7 @@ findnode(dns_db_t *db, dns_name_t *name, - dns_name_t nodename; - isc_result_t result; - isc_rwlocktype_t locktype = isc_rwlocktype_read; -+ isc_boolean_t need_relock; - - REQUIRE(VALID_RBTDB(rbtdb)); - -@@ -2064,29 +2062,27 @@ findnode(dns_db_t *db, dns_name_t *name, - * happen to hold a write lock on the tree, it's a good chance to purge - * dead nodes. - */ -- if (IS_CACHE(rbtdb)) { -- isc_boolean_t need_relock = ISC_FALSE; -+ need_relock = ISC_FALSE; -+ NODE_WEAKLOCK(&rbtdb->node_locks[node->locknum].lock, -+ isc_rwlocktype_read); -+ if (ISC_LINK_LINKED(node, deadlink) && isc_rwlocktype_write) -+ need_relock = ISC_TRUE; -+ else if (!ISC_LIST_EMPTY(rbtdb->deadnodes[node->locknum]) && -+ locktype == isc_rwlocktype_write) -+ need_relock = ISC_TRUE; -+ NODE_WEAKUNLOCK(&rbtdb->node_locks[node->locknum].lock, -+ isc_rwlocktype_read); -+ if (need_relock) { - - NODE_WEAKLOCK(&rbtdb->node_locks[node->locknum].lock, -- isc_rwlocktype_read); -- if (ISC_LINK_LINKED(node, deadlink) && isc_rwlocktype_write) -- need_relock = ISC_TRUE; -- else if (!ISC_LIST_EMPTY(rbtdb->deadnodes[node->locknum]) && -- locktype == isc_rwlocktype_write) -- need_relock = ISC_TRUE; -+ isc_rwlocktype_write); -+ if (ISC_LINK_LINKED(node, deadlink)) -+ ISC_LIST_UNLINK(rbtdb->deadnodes[node->locknum], -+ node, deadlink); -+ if (locktype == isc_rwlocktype_write) -+ cleanup_dead_nodes(rbtdb, node->locknum); - NODE_WEAKUNLOCK(&rbtdb->node_locks[node->locknum].lock, -- isc_rwlocktype_read); -- if (need_relock) { -- NODE_WEAKLOCK(&rbtdb->node_locks[node->locknum].lock, -- isc_rwlocktype_write); -- if (ISC_LINK_LINKED(node, deadlink)) -- ISC_LIST_UNLINK(rbtdb->deadnodes[node->locknum], -- node, deadlink); -- if (locktype == isc_rwlocktype_write) -- cleanup_dead_nodes(rbtdb, node->locknum); -- NODE_WEAKUNLOCK(&rbtdb->node_locks[node->locknum].lock, -- isc_rwlocktype_write); -- } -+ isc_rwlocktype_write); - } - - NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock); -@@ -6149,15 +6145,6 @@ dns_rbtdb_create - for (i = 0; i < (int)rbtdb->node_lock_count; i++) - ISC_LIST_INIT(rbtdb->rdatasets[i]); - -- rbtdb->deadnodes = isc_mem_get(mctx, rbtdb->node_lock_count * -- sizeof(rbtnodelist_t)); -- if (rbtdb->deadnodes == NULL) { -- result = ISC_R_NOMEMORY; -- goto cleanup_rdatasets; -- } -- for (i = 0; i < (int)rbtdb->node_lock_count; i++) -- ISC_LIST_INIT(rbtdb->deadnodes[i]); -- - /* - * Create the heaps. - */ -@@ -6165,7 +6152,7 @@ dns_rbtdb_create - sizeof(isc_heap_t *)); - if (rbtdb->heaps == NULL) { - result = ISC_R_NOMEMORY; -- goto cleanup_deadnodes; -+ goto cleanup_rdatasets; - } - for (i = 0; i < (int)rbtdb->node_lock_count; i++) - rbtdb->heaps[i] = NULL; -@@ -6178,10 +6165,18 @@ dns_rbtdb_create - } - } else { - rbtdb->rdatasets = NULL; -- rbtdb->deadnodes = NULL; - rbtdb->heaps = NULL; - } - -+ rbtdb->deadnodes = isc_mem_get(mctx, rbtdb->node_lock_count * -+ sizeof(rbtnodelist_t)); -+ if (rbtdb->deadnodes == NULL) { -+ result = ISC_R_NOMEMORY; -+ goto cleanup_heaps; -+ } -+ for (i = 0; i < (int)rbtdb->node_lock_count; i++) -+ ISC_LIST_INIT(rbtdb->deadnodes[i]); -+ - rbtdb->active = rbtdb->node_lock_count; - - for (i = 0; i < (int)(rbtdb->node_lock_count); i++) { -@@ -6197,7 +6192,7 @@ dns_rbtdb_create - isc_refcount_decrement(&rbtdb->node_locks[i].references, NULL); - isc_refcount_destroy(&rbtdb->node_locks[i].references); - } -- goto cleanup_heaps; -+ goto cleanup_deadnodes; - } - rbtdb->node_locks[i].exiting = ISC_FALSE; - } -@@ -6310,6 +6305,10 @@ dns_rbtdb_create - - return (ISC_R_SUCCESS); - -+ cleanup_deadnodes: -+ isc_mem_put(mctx, rbtdb->deadnodes, -+ rbtdb->node_lock_count * sizeof(rbtnodelist_t)); -+ - cleanup_heaps: - if (rbtdb->heaps != NULL) { - for (i = 0 ; i < (int)rbtdb->node_lock_count ; i++) -@@ -6319,11 +6318,6 @@ dns_rbtdb_create - rbtdb->node_lock_count * sizeof(isc_heap_t *)); - } - -- cleanup_deadnodes: -- if (rbtdb->deadnodes != NULL) -- isc_mem_put(mctx, rbtdb->deadnodes, -- rbtdb->node_lock_count * sizeof(rbtnodelist_t)); -- - cleanup_rdatasets: - if (rbtdb->rdatasets != NULL) - isc_mem_put(mctx, rbtdb->rdatasets, rbtdb->node_lock_count * |
