Russell Bryant [Mon, 6 Aug 2007 20:44:09 +0000 (20:44 +0000)]
Fix an issue where dynamic threads can get free'd, but still exist in the
dynamic thread list.
(closes issue #10392, patch from Mihai, with credit to his colleague, Pete)
Russell Bryant [Mon, 6 Aug 2007 16:50:54 +0000 (16:50 +0000)]
Fix the return value of AST_LIST_REMOVE(). This shouldn't be causing any
problems, though, because the only code that uses the return value only checks
to see if it is NULL.
(closes issue #10390, pointed out by mihai)
Joshua Colp [Mon, 6 Aug 2007 16:32:44 +0000 (16:32 +0000)]
It is possible for a transfer to occur before the remote device has our tag in which case they send none in the transfer. In this case we need to not fail the transfer dialog lookup.
Joshua Colp [Mon, 6 Aug 2007 15:27:24 +0000 (15:27 +0000)]
(closes issue #10355)
Reported by: wdecarne
Now that we pass through RTP timestamp information we need to make the allowed timestamp skew considerably less. There are situations where a source may change and due to the timestamp difference the receiver will experience an audio gap since we did not indicate by setting the marker bit that the source changed.
Mark Michelson [Fri, 3 Aug 2007 20:25:22 +0000 (20:25 +0000)]
Changed the behavior of sip's realtime_peer function to match the corresponding way of matching for non-realtime peers.
Now matches are made on both the IP address and port number, or if the insecure setting is set to "port" then just match on the
IP address.
In order to accomplish this, I also added a new API call, ast_category_root, which returns the first variable of an ast_category struct
Fix a problem when you call Voicemail() with multiple mailboxes specified and
ODBC_STORAGE is in use. The audio part of the message was only given to the
first mailbox specified.
Russell Bryant [Fri, 3 Aug 2007 19:39:49 +0000 (19:39 +0000)]
Add some improvements to lock debugging. These changes take effect
with DEBUG_THREADS enabled and provide the following:
* This will keep track of which locks are held by which thread as well as
which lock a thread is waiting for in a thread-local data structure. A
reference to this structure is available on the stack in the dummy_start()
function, which is the common entry point for all threads. This information
can be easily retrieved using gdb if you switch to the dummy_start() stack
frame of any thread and print the contents of the lock_info variable.
* All of the thread-local structures for keeping track of this lock information
are also stored in a list so that the information can be dumped to the CLI
using the "core show locks" CLI command. This introduces a little bit of a
performance hit as it requires additional underlying locking operations
inside of every lock/unlock on an ast_mutex. However, the benefits of
having this information available at the CLI is huge, especially considering
this is only done in DEBUG_THREADS mode. It means that in most cases where
we debug deadlocks, we no longer have to request access to the machine to
analyze the contents of ast_mutex_t structures. We can now just ask them
to get the output of "core show locks", which gives us all of the information
we needed in most cases.
I also had to make some additional changes to astmm.c to make this work when
both MALLOC_DEBUG and DEBUG_THREADS are enabled. I disabled tracking of one
of the locks in astmm.c because it gets used inside the replacement memory
allocation routines, and the lock tracking code allocates memory. This caused
infinite recursion.
Russell Bryant [Fri, 3 Aug 2007 17:01:07 +0000 (17:01 +0000)]
Only pass through HOLD and UNHOLD control frames when the mohinterpret option
is set to "passthrough". This was pointed out by Kevin in the middle of a
training session.
Russell Bryant [Fri, 3 Aug 2007 02:04:22 +0000 (02:04 +0000)]
Don't reuse the timespec that was set to 0 in the previous timedwait as it
will just return immediately. Also, fix some logic so the thread's lock
isn't unlocked twice in the weird case of dynamic threads getting acquired
right after a timeout.
(pointed out by SteveK)
Russell Bryant [Thu, 2 Aug 2007 19:25:14 +0000 (19:25 +0000)]
Fix the case where a dynamic thread times out waiting for something to do
during the first time it runs. This shouldn't ever happen, but we should
account for it anyway.
(pointed out by pete, who works with mihai)
Steve Murphy [Thu, 2 Aug 2007 18:21:40 +0000 (18:21 +0000)]
Merged revisions 77942 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.2
........
r77942 | murf | 2007-08-02 11:56:37 -0600 (Thu, 02 Aug 2007) | 1 line
This patch hopefully solves 10141; The user is running with it, and it doesn't appear to harm asterisk's operation, and may prevent a crash. I'll store it in 1.2, as we have shut down support on 1.2, but since I developed the patch before support finished, and it might affect 1.4 and trunk, I'm going ahead with it.
........
Russell Bryant [Thu, 2 Aug 2007 18:04:43 +0000 (18:04 +0000)]
Fix another race condition in the handling of dynamic threads. If the dynamic
thread timed out waiting for something to do, but was acquired to perform an
action immediately afterwords, then wait on the condition again to give the
other thread a chance to finish setting up the data for what action this thread
should perform. Otherwise, if it immediately continues, it will perform the
wrong action.
(reported on IRC by mihai, patch by me)
(related to issue #10289)
Russell Bryant [Thu, 2 Aug 2007 16:56:04 +0000 (16:56 +0000)]
Add another sanity check to vnak_retransmit(). This check ensures that frames
that have already been marked for deletion don't get retransmitted.
(closes issue #10361, patch from mihai)
Russell Bryant [Wed, 1 Aug 2007 22:16:17 +0000 (22:16 +0000)]
Fix some race conditions which have been causing weird problems in chan_iax2.
The most notable problem is that people have been seeing storms of VNAK frames
being sent due to really old frames mysteriously being in the retransmission
queue and never getting removed.
It was possible that a dynamic thread got created, but did not acquire its lock
before the thread that created it signals it to perform an action. When this
happens, the thread will sleep until it hits a timeout, and then get destroyed.
So, the action never gets performed and in some cases, means a frame doesn't
get transmitted and never gets freed since the scheduler never gets a chance
to reschedule transmission.
Another less severe race condition is in the handling of a timeout for a dynamic
thread. It was possible for it to be acquired to perform at action at the same
time that it hit a timeout. When this occurs, whatever action it was acquired
for would never get performed.
(patch contributed by Mihai and SteveK)
(closes issue #10289)
(closes issue #10248)
(closes issue #10232)
(possibly related to issue #10359)
Mark Michelson [Wed, 1 Aug 2007 14:08:57 +0000 (14:08 +0000)]
Fixes an issue I introduced to queues wherein a queue with joinempty=yes would kick people out of the queue because of erroneously
thinking the 'n' option was in use.
(closes issue #10320, reported by jfitzgibbon, patched by me, tested by blitzrage and me)
Thank you blitzrage for all the testing you've done lately with queues! It's much appreciated!
Mark Michelson [Wed, 1 Aug 2007 13:59:59 +0000 (13:59 +0000)]
If a queue uses dynamic realtime members, then the member list should be updated after each attempt to call the queue.
This fixes an issue where if a caller calls into a queue where no one is logged in, they would wait forever even if a member
logged in at some point.
(closes issue #10346, reported by and tested by blitzrage, patched by me)
Mark Michelson [Tue, 31 Jul 2007 15:21:22 +0000 (15:21 +0000)]
This patch makes Asterisk send 100 Trying provisional responses upon receipt of re-invites. This makes it so that if there are two or more Asterisk
servers between endpoints, the Asterisk servers will not keep retransmitting the re-invites.
(closes issue #10274, reported by cstadlmann, patched by me with approval from file)
Jason Parker [Mon, 30 Jul 2007 20:17:08 +0000 (20:17 +0000)]
Applications like SayAlpha() should not hang up the channel if you
request an "unknown" character such as a comma.
Instead, skip the character and move on.
Issue 10083, initial patch by jsmith, modified by me.
Russell Bryant [Mon, 30 Jul 2007 20:16:43 +0000 (20:16 +0000)]
Fix an issue that could potentially cause corruption of the global iax frame
queue. In the network_thread() loop, it traverses the list using the
AST_LIST_TRAVERSE_SAFE macro. However, to remove an element of the list within
this loop, it used AST_LIST_REMOVE, instead of AST_LIST_REMOVE_CURRENT, which I
believe could leave some of the internal variables of the SAFE macro invalid.
Mihai says that he already made this change in his local copy and it didn't help
his VNAK storm issues, but I still think it's wrong. :)
Russell Bryant [Mon, 30 Jul 2007 19:13:31 +0000 (19:13 +0000)]
(closes issue #10279)
Reported by: seanbright
Patches:
res_agi.carefulwrite.1.4.07252007.patch uploaded by seanbright (license 71)
res_agi.carefulwrite.trunk.07252007.patch uploaded by seanbright (license 71)
Allow the "agi_network: yes" line to be printed out in the AGI debug output.
Also, allow partial writes to be handled when writing out this line just like
it is for all of the others.
Russell Bryant [Mon, 30 Jul 2007 17:29:43 +0000 (17:29 +0000)]
(closes issue #10301)
Reported by: fnordian
Patches:
asterisk-1.4.9-channel.c.patch uploaded by fnordian (license 110)
Additional changes by me
Fix some problems in channel_find_locked() which can cause an infinite loop.
The reference to the previous channel is set to NULL in some cases. These changes
ensure that the reference to the previous channel gets restored before needing
it again.
I'm not convinced that the code that is setting it to NULL is really the right
thing to do. However, I am making these changes to fix the obvious problem
and just leaving an XXX comment that it needs a better explanation that what
is there now.
(closes issue #10327)
Reported by: kkiely
Instead of directly mucking with the extension/context/priority of the channel we are transferring when it has a PBX simply call ast_async_goto on it. This will ensure that the channel gets handled properly and sent to the right place.
(closes issue #10301)
Reported by: fnordian
Patches:
asterisk-1.4.9-channel.c.patch uploaded by fnordian (license 110)
Restore previous behavior where if we failed to lock the channel we wanted we would return to exactly the same point as if we had just reentered the function.
(closes issue #10310)
Reported by: prashant_jois
Patches:
cdr_pgsql.patch uploaded by prashant (license 114)
Finish the Postgresql connection after the log messages are printed so we don't access invalid memory.
(closes issue #10323)
Reported by: julianjm
Patches:
chan_sip_device_state_hold_fix.v1.diff.txt uploaded by julianjm (license 99)
Clear ONHOLD flag when decrementing the onHold peer count. If we did not do this the count may keep decreasing.
(closes issue #10302)
Reported by: litnialex
If a DTMF end frame comes from a channel without a begin and it is going to a technology that only accepts end frames (aka INFO) then use the minimum DTMF duration if one is not in the frame already.
Russell Bryant [Thu, 26 Jul 2007 21:23:23 +0000 (21:23 +0000)]
AST_DEVMODE was defined in trunk, but not in 1.4. When Asterisk is compiled
under dev mode, AST_DEVMODE will get defined in buildopts.h. Change 1.4 to
define it in the same way that trunk does. Also, revert the change that added
this define in the Makefile
The advantage to doing it this way is that buildopts.h gets installed when
you install Asterisk. Then, when building any out of tree modules, or
building asterisk-addons, these modules know which options the rest of Asterisk
was built with.
Mark Michelson [Thu, 26 Jul 2007 20:35:17 +0000 (20:35 +0000)]
Fixes to get ast_backtrace working properly. The AST_DEVMODE macro was never defined so the majority of ast_backtrace never
attempted compilation. The makefile now defines AST_DEVMODE if configure was run with --enable-dev-mode. Also, changes were
made to acccomodate 64 bit systems in ast_backtrace.
Thanks to qwell, kpfleming, and Corydon76 for their roles in allowing me to get this committed
Mark Michelson [Thu, 26 Jul 2007 18:30:29 +0000 (18:30 +0000)]
Two consecutive calls to PQfinish could occur, meaning free gets called on the same variable twice.
This patch sets the connection to NULL after calls to PQfinish so that the problem does not occur.
Also in this patch, prashant_jois informed me that it is safe to pass a null pointer to PQfinish, so
I have removed the check for conn's existence from my_unload_module.
(closes issue 10295, reported by junky, patched by me with input from prashant_jois)
Steve Murphy [Wed, 25 Jul 2007 22:39:27 +0000 (22:39 +0000)]
This fix solves problem with intense squelch noise when someone joins conf in bug 9430; We repro'd the problem with meetme opts of 'CciMo'; Josh Colp supplied this patch, and I'm applying it. It looks like playing the recorded username will louse up the next thing played into the channel. Josh rearranged the code so as to start things over before playing data directly into the conference.
(closes issue #10303)
Reported by: jtodd
Add SPEECH_DTMF_TERMINATOR variable so the user can specify the digit to terminate a DTMF string with. If none is specified then no terminator will be used.
Mark Michelson [Tue, 24 Jul 2007 16:26:58 +0000 (16:26 +0000)]
Added a membercount variable to call_queue struct which keeps track of the number of logged in members in a particular queue.
This makes it so that the 'n' option for Queue() can act properly depending on which strategy is used. If the strategy is
roundrobin, rrmemory, or ringall, we want to ring each phone once before moving on in the dialplan. However, if any other strategy is
used, we will only ring one phone since it cannot be guaranteed that a different phone will ring on subsequent attempts to ring a phone.
As a side effect of this, the QUEUE_MEMBER_COUNT dialplan function now just reads the membercount variable instead of traversing through
the member list to figure out how many members there are.
Special thanks to blitzrage for helping to test this out.
(closes issue #10127, reported by bcnit, patched by me, tested by blitzrage)
It was our stated intention for 1.4 that files created in app_voicemail should
depend upon the umask. Unfortunately, mkstemp() creates files with mode 0600,
regardless of the umask. This corrects that deficiency.
(closes issue #5866)
Reported by: tyler
Do not force channel format changes when a generator is present. The generator may have changed the formats itself and changing them back would cause issues.
(closes issue #10268)
Reported by: mvanbaak
Patches:
chan_skinny_openbsd.diff uploaded by mvanbaak (license 7)
Add another OS that has to use the Macros for byte ordering.
Russell Bryant [Mon, 23 Jul 2007 12:25:01 +0000 (12:25 +0000)]
Use a signed integer for storing the number of bytes in the packet read from
the network. Using an unsigned value here made it impossible to handle an
error returned from recvfrom(). Furthermore, in the case that recvfrom()
did return an error, this would cause a crash due to a heap overflow.
(closes issue #10265, reported by and fix suggested by timrobbins)
Backport a fix for a memory leak that was fixed in trunk in reivision 76221
by rizzo. The memory used for the localaddr list was not freed during a
configuration reload.
Mark Michelson [Fri, 20 Jul 2007 18:42:27 +0000 (18:42 +0000)]
When using users.conf for the entries in the directory, if multiple users had the same last name, only the first user listed would be available
in the directory.
(closes issue #10200, reported by mrskippy, patched by me)
Russell Bryant [Fri, 20 Jul 2007 18:22:24 +0000 (18:22 +0000)]
Use the define that specifies the default length of an artificially created
DTMF digit in the ast_senddigit() function. The define is set to 100ms by
default, which is the same thing that this function was using. But, using
the define lets changes take effect in this case, as well as the others where
it was already used.
(closes issue #10247)
Reported by: fkasumovic
Patches:
chan_sip.patch uploaded by fkasumovic (license #101)
Drop any peer realm authentication entries when reloading so multiple entries do not get added to the peer.
(closes issue #10246)
Reported by: fkasumovic
Patches:
res_conver.patch uploaded by fkasumovic (license #101)
Use the last occurance of . to find the extension, not the first occurance.
Mark Michelson [Thu, 19 Jul 2007 16:26:10 +0000 (16:26 +0000)]
Changes in handling return values of several functions in app_queue. This all started as a fix for issue #10008
but now includes all of the following changes:
1. Simplifying the code to handle positive return values from ast API calls.
2. Removing the background_file function.
3. The fix for issue #10008
(closes issue #10008, reported and patched by dimas)
When processing full frames, take sequence number wraparound into account when
deciding whether or not we need to request retransmissions by sending a VNAK.
This code could cause VNAKs to be sent erroneously in some cases, and to not
be sent in other cases when it should have been.
(closes issue #10237, reported and patched by mihai)
When traversing the queue of frames for possible retransmission after
receiving a VNAK, handle sequence number wraparound so that all frames that
should be retransmitted actually do get retransmitted.
(issue #10227, reported and patched by mihai)