asterisk/main
Russell Bryant 12631bc3a0 Fix handling of removing nodes from the middle of a heap.
This bug surfaced in 1.6.2 and does not affect code in any other released
version of Asterisk.  It manifested itself as SIP qualify not happening when
it should, causing peers to go unreachable.  This was debugged down to scheduler
entries sometimes not getting executed when they were supposed to, which was in
turn caused by an error in the heap code.

The problem only sometimes occurs, and it is due to the logic for removing an entry
in the heap from an arbitrary location (not just popping off the top).  The scheduler
performs this operation frequently when entries are removed before they run (when
ast_sched_del() is used).

In a normal pop off of the top of the heap, a node is taken off the bottom,
placed at the top, and then bubbled down until the max heap property is restored
(see max_heapify()).  This same logic was used for removing an arbitrary node
from the middle of the heap.  Unfortunately, that logic is full of fail.  This
patch fixes that by fully restoring the max heap property when a node is thrown
into the middle of the heap.  Instead of just pushing it down as appropriate, it
first pushes it up as high as it will go, and _then_ pushes it down.

Lastly, fix a minor problem in ast_heap_verify(), which is only used for
debugging.  If a parent and child node have the same value, that is not an
error.  The only error is if a parent's value is less than its children.

A huge thanks goes out to cappucinoking for debugging this down to the scheduler,
and then producing an ast_heap test case that demonstrated the breakage.  That
made it very easy for me to focus on the heap logic and produce a fix.  Open source
projects are awesome.

(closes issue #16936)
Reported by: ib2
Tested by: cappucinoking, crjw

(closes issue #17277)
Reported by: cappucinoking
Patches:
      heap-fix.rev2.diff uploaded by russell (license 2)
Tested by: cappucinoking, russell


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@261496 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2010-05-06 13:58:07 +00:00
..
db1-ast Merged revisions 209879 via svnmerge from 2009-08-01 11:29:25 +00:00
editline Add gar to the check for AR for those silly OSes (Solaris) that don't have ar. 2010-04-27 21:13:01 +00:00
stdtime Resolve more compiler warnings on FreeBSD. 2010-03-20 12:03:07 +00:00
Makefile Allow symbol export filtering to work properly on platforms that have symbol prefixes. 2010-04-02 18:57:58 +00:00
abstract_jb.c Fix jitterbuffer logging not creating logfiles. 2010-03-10 18:25:18 +00:00
acl.c Fix incorrect ACL behavior when CIDR notation of "/0" is used. 2010-02-25 22:41:48 +00:00
adsistub.c remove a bunch of useless #include "options.h" 2007-11-21 23:09:02 +00:00
aescrypt.c Spacing changes only 2009-03-04 20:48:42 +00:00
aeskey.c use the OpenSSL AES implementation if it's available (unless configured not to) 2007-05-24 22:07:50 +00:00
aesopt.h merge new_loader_completion branch, including (at least): 2006-08-21 02:11:39 +00:00
aestab.c use the OpenSSL AES implementation if it's available (unless configured not to) 2007-05-24 22:07:50 +00:00
alaw.c Fix compile when certain G711 menuselect options are enabled. 2009-08-19 22:38:46 +00:00
app.c Merged revisions 257544 via svnmerge from 2010-04-15 21:26:19 +00:00
ast_expr2.c Allow "REMAINDER" to function properly in expressions. 2009-12-28 22:09:40 +00:00
ast_expr2.fl Merged revisions 245496 via svnmerge from 2010-02-08 20:41:05 +00:00
ast_expr2.h Merged revisions 179807 via svnmerge from 2009-03-03 22:12:02 +00:00
ast_expr2.y Allow "REMAINDER" to function properly in expressions. 2009-12-28 22:09:40 +00:00
ast_expr2f.c Merged revisions 245496 via svnmerge from 2010-02-08 20:41:05 +00:00
asterisk.c Asterisk data retrieval API. 2010-04-22 18:07:02 +00:00
asterisk.dynamics Export dynamic (weak-linked) symbols correctly. 2009-11-30 16:53:10 +00:00
asterisk.exports.in Allow symbol export filtering to work properly on platforms that have symbol prefixes. 2010-04-02 18:57:58 +00:00
astfd.c Merged revisions 228338 via svnmerge from 2009-11-06 15:42:46 +00:00
astmm.c Two more minor fixes due to constification 2009-05-22 16:53:41 +00:00
astobj2.c Remove ABI differences that occured when compiling with DEBUG_THREADS. 2010-04-22 19:08:01 +00:00
audiohook.c Merged revisions 260049 via svnmerge from 2010-04-29 15:33:27 +00:00
autochan.c Convert the ast_channel data structure over to the astobj2 framework. 2009-04-24 14:04:26 +00:00
autoservice.c Expand codec bitfield from 32 bits to 64 bits. 2009-11-04 14:05:12 +00:00
bridging.c Expand codec bitfield from 32 bits to 64 bits. 2009-11-04 14:05:12 +00:00
buildinfo.c fix a few small things found by using sparse 2008-10-30 16:49:02 +00:00
callerid.c More 32->64 bit codec conversions. 2009-12-01 20:27:37 +00:00
ccss.c Shuffle some casts to make builds on bamboo happier. 2010-04-27 22:11:58 +00:00
cdr.c Merged revisions 193391,258670 via svnmerge from 2010-04-22 21:57:59 +00:00
cel.c Consolidate ast_channel.cid.cid_rdnis into ast_channel.redirecting.from.number. 2010-04-03 02:12:33 +00:00
channel.c Merged revisions 261093-261094 via svnmerge from 2010-05-04 23:51:52 +00:00
chanvars.c Add additional memory debugging to several core APIs, and fix several memory 2008-10-14 22:38:06 +00:00
cli.c Change per-file debug and verbose levels to be per-module, the way 2010-03-23 14:22:27 +00:00
config.c Merged revisions 241015 via svnmerge from 2010-01-18 19:57:52 +00:00
cryptostub.c Don't include logger.h in asterisk.h by default as it is causing problems building 2008-10-10 00:42:13 +00:00
cygload.c Doxygen updates, formatting. 2007-12-11 22:20:22 +00:00
data.c Avoid making AstData depend on libxml2 to compile. 2010-05-02 02:52:23 +00:00
datastore.c Properly account for memory allocated for channels and datastores 2009-05-05 10:34:19 +00:00
db.c More 'static' qualifiers on module global variables. 2009-06-15 17:34:30 +00:00
devicestate.c Merged revisions 205409 via svnmerge from 2009-07-08 22:15:06 +00:00
dial.c Consolidate ast_channel.cid.cid_rdnis into ast_channel.redirecting.from.number. 2010-04-03 02:12:33 +00:00
dns.c Fix a few compilation problems found when building Asterisk against uClibc. 2009-07-08 16:43:12 +00:00
dnsmgr.c AST-2009-005 2009-08-10 19:20:57 +00:00
dsp.c restarts busydetector (if enabled) when DTMF is received after call is bridged. 2009-12-20 08:22:35 +00:00
ecdisa.h merge new_loader_completion branch, including (at least): 2006-08-21 02:11:39 +00:00
enum.c Extend max call limit duration from 24.8 days to 292+ million years. 2010-01-18 22:31:25 +00:00
event.c Add ast_event subscription unit test and fix some ast_event API bugs. 2010-04-22 21:06:53 +00:00
features.c Merged revisions 193391,258670 via svnmerge from 2010-04-22 21:57:59 +00:00
file.c Merged revisions 254451 via svnmerge from 2010-03-25 16:03:51 +00:00
fixedjitterbuf.c Start untangling header inclusion in a way that does not affect 2007-11-16 20:04:58 +00:00
fixedjitterbuf.h Merged revisions 135841,135847,135850 via svnmerge from 2008-08-06 00:30:53 +00:00
frame.c Added MixMonitorMute manager command 2010-04-21 11:27:27 +00:00
fskmodem.c (Step 2 of 2) 2008-07-21 21:00:47 +00:00
fskmodem_float.c Optionally build integer-based routines for FSK tone decoding (but default 2008-07-21 20:59:03 +00:00
fskmodem_int.c Optionally build integer-based routines for FSK tone decoding (but default 2008-07-21 20:59:03 +00:00
global_datastores.c Merged revisions 172517 via svnmerge from 2009-01-30 21:29:12 +00:00
hashtab.c Add MALLOC_DEBUG to various utility APIs, so that memory leaks can be tracked back to their source. 2009-03-11 00:29:59 +00:00
heap.c Fix handling of removing nodes from the middle of a heap. 2010-05-06 13:58:07 +00:00
http.c Don't act like an http write failed when it didn't 2010-03-23 16:52:53 +00:00
image.c More 'static' qualifiers on module global variables. 2009-06-15 17:34:30 +00:00
indications.c Change log message to match severity. 2010-04-19 21:57:56 +00:00
io.c Merged revisions 182810 via svnmerge from 2009-03-18 02:28:55 +00:00
jitterbuf.c Merged revisions 174583 via svnmerge from 2009-02-10 18:16:31 +00:00
loader.c RTP documentation states that you can pass NULL as the module, so make sure that's really the case. 2010-02-17 07:01:13 +00:00
lock.c Remove ABI differences that occured when compiling with DEBUG_THREADS. 2010-04-22 19:08:01 +00:00
logger.c CLI command logger set level auto complete. 2010-04-12 14:39:37 +00:00
manager.c New 'manager show settings' CLI command. 2010-05-05 00:44:37 +00:00
md5.c Start untangling header inclusion in a way that does not affect 2007-11-16 20:04:58 +00:00
netsock.c fixes an ast_netsock_list memory leak. 2009-10-08 19:35:30 +00:00
pbx.c Fix potential invalid reads that could occur in pbx.c 2010-03-24 21:10:38 +00:00
plc.c Start untangling header inclusion in a way that does not affect 2007-11-16 20:04:58 +00:00
poll.c MAX() moved to utils.h 2010-01-13 10:45:19 +00:00
privacy.c remove a bunch of useless #include "options.h" 2007-11-21 23:09:02 +00:00
rtp_engine.c Only change the RTP ssrc when we see that it has changed 2010-03-12 22:04:51 +00:00
say.c Merged revisions 237573 via svnmerge from 2010-01-04 21:48:20 +00:00
sched.c Initialize counters in ast_sched_report so that resulting data is not bogus. 2010-02-03 19:26:53 +00:00
security_events.c Add an API for reporting security events, and a security event logging module. 2009-07-11 19:15:03 +00:00
sha1.c more header removal/normalization 2007-11-21 00:23:49 +00:00
slinfactory.c Expand codec bitfield from 32 bits to 64 bits. 2009-11-04 14:05:12 +00:00
srv.c func_srv and explicit specification of a remote IP for SIP. 2010-04-09 14:37:50 +00:00
ssl.c pthread_self returns a pthread_t which is not an unsigned int on all 2009-07-09 08:31:24 +00:00
strcompat.c Don't allow file descriptors to go above 64k, when we're closing them in a fork(2). 2010-04-30 06:19:35 +00:00
strings.c Fix two problems in ast_str functions found while writing a unit test. 2010-02-17 21:22:40 +00:00
stun.c This commit introduces COLP/CONP and Redirecting party information into Asterisk. 2009-04-03 22:41:46 +00:00
syslog.c Add functions to map syslog facilities and priorities constants to strings. 2009-06-26 13:00:35 +00:00
taskprocessor.c Minor tweaks to comment blocks and includes. 2010-02-22 06:45:52 +00:00
tcptls.c Resolve more compiler warnings on FreeBSD. 2010-03-20 12:03:07 +00:00
tdd.c Merge changes from str_substitution that are unrelated to that branch. 2009-04-01 20:13:28 +00:00
term.c Merged revisions 248582 via svnmerge from 2010-02-24 21:17:26 +00:00
test.c Put test output for a failure in a CDATA section in the XML results. 2010-03-23 22:35:56 +00:00
threadstorage.c Fixed an issue in the threadstorage cli functions resulting from the constification of struct ast_cli_args in r196072. 2009-06-01 15:23:21 +00:00
timing.c Extend max call limit duration from 24.8 days to 292+ million years. 2010-01-18 22:31:25 +00:00
translate.c Using the builtin function breaks OpenBSD 4.2 2009-12-04 21:06:22 +00:00
udptl.c fixes crash during T.38 negotiation caused by invalid or missing FaxMaxDatagram field 2010-02-02 22:27:23 +00:00
ulaw.c Fix compile when certain G711 menuselect options are enabled. 2009-08-19 22:38:46 +00:00
utils.c Add new unit test for stringfields. 2010-03-10 23:15:55 +00:00
xml.c Asterisk data retrieval API. 2010-04-22 18:07:02 +00:00
xmldoc.c Fix a typo. 2010-03-17 00:40:51 +00:00