Russell Bryant [Mon, 1 Dec 2008 17:27:30 +0000 (17:27 +0000)]
Apply some logic used in iax2_indicate() to iax2_setoption(), as well, since they
both have the potential to send control frames in the middle of call setup. We
have to wait until we have received a message back from the remote end before
we try to send any more frames. Otherwise, the remote end will consider it
invalid, and we'll get stuck in an INVAL/VNAK storm.
Kevin P. Fleming [Wed, 26 Nov 2008 18:36:24 +0000 (18:36 +0000)]
simplify (and slightly bug-fix) the recent developer-oriented COMPILE_DOUBLE mode
add channels/busy.h and channels/ringtone.h to the repository instead of generating them repeatedtly; most users do not change the settings to build them, but the Makefile rules are still there if they wish to do so
ensure that 'make clean' removes dependency files for .i files that are created in COMPILE_DOUBLE mode
the change to cdr.c allows no-answer to percolate
up into CDR's, and feels like the right place to
locate this fix; if BUSY is done here, no-answer
should be, too.
Jeff Peeler [Sat, 22 Nov 2008 00:04:36 +0000 (00:04 +0000)]
(closes issue #13786)
Reported by: tzafrir
When compiling against Zaptel dahdi_compat will now only define all the DAHDI defines if the Zaptel define is present. Also, there is no such thing as DAHDI_PRI.
Steve Murphy [Fri, 21 Nov 2008 23:14:50 +0000 (23:14 +0000)]
In reference to the fix made for 13871, I was
merging the fix into 1.6.0 and realized I missed
the code in the h-exten block, and didn't catch it
because my test case had the h-exten commented out.
So, this corrects the code I missed, as a
preventative against another crash report.
Tested with the h-exten defined, all is well.
Tilghman Lesher [Fri, 21 Nov 2008 23:07:46 +0000 (23:07 +0000)]
The passed extension may not be the same in the list as the current entry,
because we strip spaces when copying the extension into the structure.
Therefore, use the copied item to place the item into the list.
(found by lmadsen on -dev, fixed by me)
Steve Murphy [Fri, 21 Nov 2008 21:19:47 +0000 (21:19 +0000)]
(closes issue #13871)
Reported by: mdu113
This one is totally my fault. The code doesn't even
create a bridge if the channel CDR has POST_DISABLED.
I didn't check for that at the end of the bridge.
Fixed with a few small insertions. Tested. Looks
good. No cdr generated, no crash, no unnecc. data
objects created either.
Mark Michelson [Thu, 20 Nov 2008 18:06:48 +0000 (18:06 +0000)]
There was an issue when attempting to reference an embedded
frame in a freed ast_filestream. This patch makes use of the
ao2 functions to make sure that we do not free an ast_filestream
structure until the embedded ast_frame has been "freed" as well.
Mark Michelson [Thu, 20 Nov 2008 17:48:42 +0000 (17:48 +0000)]
We don't handle 4XX responses to BYE well. According to
section 15 of RFC 3261, we should terminate a dialog if we
receive a 481 or 408 in response to our BYE. Since I am aware
of at least one phone manufacturer who may sometimes send a
404 as well, I am being liberal and saying that any 4XX response
to a BYE should result in a terminated dialog.
Mark Michelson [Thu, 20 Nov 2008 17:33:06 +0000 (17:33 +0000)]
Make sure to set the hangup cause on the calling channel in the case
that ast_call() fails. For incoming SIP channels, this was causing
us to send a 603 instead of a 486 when the call-limit was reached on
the destination channel.
Kevin P. Fleming [Wed, 19 Nov 2008 21:34:47 +0000 (21:34 +0000)]
the gcc optimizer frequently finds broken code (use of uninitalized variables, unreachable code, etc.), which is good. however, developers usually compile with the optimizer turned off, because if they need to debug the resulting code, optimized code makes that process very difficult. this means that we get code changes committed that weren't adequately checked over for these sorts of problems.
with this build system change, if (and only if) --enable-dev-mode was used and DONT_OPTIMIZE is turned on, when a source file is compiled it will actually be preprocessed (into a .i or .ii file), then compiled once with optimization (with the result sent to /dev/null) and again without optimization (but only if the first compile succeeded, of course).
while making these changes, i did some cleanup work in Makefile.rules to move commonly-used combinations of flag variables into their own variables, to make the file easier to read and maintain
Mark Michelson [Tue, 18 Nov 2008 22:47:57 +0000 (22:47 +0000)]
Add some missing invite state changes necessary in the sip_write
function. Not setting the invite state correctly on the call was
resulting in the Record application leaving empty files. I also
have updated the doxygen comment next to the declaration of the
INV_EARLY_MEDIA constant to reflect that we also use this state
when we *send* a 18X response to an INVITE.
Jeff Peeler [Tue, 18 Nov 2008 19:13:33 +0000 (19:13 +0000)]
(closes issue #13899)
Reported by: akkornel
This fix is the result of a bug fix in ast_app_separate_args r124395. If an argument does not exist it should always be set to a null string rather than a null pointer.
Mark Michelson [Tue, 18 Nov 2008 18:25:55 +0000 (18:25 +0000)]
Fix a crash in the end_bridge_callback of app_dial and
app_followme which would occur at the end of an attended
transfer. The error occurred because we initially stored
a pointer to an ast_channel which then was hung up due
to a masquerade.
This commit adds a "fixup" callback to the bridge_config
structure to allow for end_bridge_callback_data to be
changed in the case that a new channel pointer is needed
for the end_bridge_callback.
Kevin P. Fleming [Sat, 15 Nov 2008 19:31:03 +0000 (19:31 +0000)]
when an individual directory dist-clean is run, run clean in that directory first, and when running top-level dist-clean, do not run subdirectory clean operations twice
Kevin P. Fleming [Sat, 15 Nov 2008 18:00:32 +0000 (18:00 +0000)]
major update to doxygen configuration file:
1) update to doxygen 1.5.x style file, as used in trunk
2) tell doxygen where are header files are, so include-file processing can be done
3) make all macros that are used to define variables/functions be expanded, so that doxygen will properly document the resulting variable/function
4) make all macros that are used to provide the contents of a variable (structure) be expanded, so that doxygen will be able to document the resulting fields
5) suppress compiler attributes (__attribute__(xxx)) from being seen by doxygen, so it will properly match up function definition and usage (for an example of th effect of this, look at the doxygen docs for ast_log() from before and afte this commit)
Mark Michelson [Fri, 14 Nov 2008 15:18:59 +0000 (15:18 +0000)]
If the prompt to reenter a voicemail password timed out, it
resulted in the password not being saved, even if the input matched
what you gave when first prompted to enter a new password. This is
because the return value of ast_readstring was checked, but not checked
properly.
This bug was discovered by Jared Smith during an Asterisk training course.
Thanks for reporting it!
Tilghman Lesher [Fri, 14 Nov 2008 00:41:37 +0000 (00:41 +0000)]
ast_waitfordigit() requires that the channel be up, for no good logical
reason. This prevents While/EndWhile from working within the "h"
extension.
Reported by: jgalarneau (for ABE C.2)
Fixed by: me
Tilghman Lesher [Thu, 13 Nov 2008 21:24:00 +0000 (21:24 +0000)]
Provide more space for all the data which can appear in an originating
channel name.
(closes issue #13398)
Reported by: bamby
Patches:
manager.c.diff uploaded by bamby (license 430)
Steve Murphy [Wed, 12 Nov 2008 19:36:16 +0000 (19:36 +0000)]
It turns out that the 0x0XX00 codes being returned for
N, X, and Z are off by one, as per conversation with
jsmith on #asterisk-dev; he was teaching a class
and disconcerted that this published rule was not
being followed, with patterns _NXX, _[1-8]22 and
_[2-9]22... and NXX was winning, but [1-8] should
have been.
This change, tested on these 3 patterns now
picks the proper one.
However, this change may surprise users who
set up dialplans based on previous behavior,
which has been there for what, 2 and half
years or so now.
Tilghman Lesher [Wed, 12 Nov 2008 19:26:45 +0000 (19:26 +0000)]
If the SLA thread is not started, then reload causes a memory leak.
(closes issue #13889)
Reported by: eliel
Patches:
app_meetme.c.patch uploaded by eliel (license 64)
Tilghman Lesher [Wed, 12 Nov 2008 18:39:21 +0000 (18:39 +0000)]
Revert revision 132506, since it occasionally caused IAX2 HANGUP packets not
to be sent, and instead, schedule a task to destroy the iax2 pvt structure
10 seconds later. This allows the IAX2 HANGUP packet to be queued,
transmitted, and ACKed before the pvt is destroyed.
(closes issue #13645)
Reported by: dzajro
Patches:
20081111__bug13645__3.diff.txt uploaded by Corydon76 (license 14)
Tested by: vazir
Reviewed: http://reviewboard.digium.com/r/51/
Jeff Peeler [Wed, 12 Nov 2008 17:53:44 +0000 (17:53 +0000)]
(closes issue #13173)
Reported by: pep
This change adds an announce_thread responsible for playing announcements to an existing conference. This allows all announcing to be immediately stopped if necessary but more importantly allows other threads that need to play something to not block. There are multiple benefits to this, but the actual bug is for solving the scenario for a channel to be unusable after hang up for the entire duration of the parting announcement. The parting announcement can be extremely long depending on what the user recorded upon joining the conference.
Reviewed by Russell on Review Board:
http://reviewboard.digium.com/r/25/
Mark Michelson [Wed, 12 Nov 2008 17:38:33 +0000 (17:38 +0000)]
When doing some tests, I was having a crash at the end of every call
if an attended transfer occurred during the call. I traced the cause to
the CDR on one of the channels being NULL. murf suggested a check in
the end bridge callback to be sure the CDR is non-NULL before proceeding,
so that's what I'm adding.
Russell Bryant [Wed, 12 Nov 2008 17:29:52 +0000 (17:29 +0000)]
Move the sanity check that makes sure "always fork" is not set along with the
console option to be after the code that reads options from asterisk.conf.
This resolves a situation where Asterisk can start taking up 100% when
misconfigured.
(Thanks to Bryce Porter (x86 on IRC) for letting me log in to his system to
figure out what was causing the 100% CPU problem.)
Mark Michelson [Mon, 10 Nov 2008 21:07:39 +0000 (21:07 +0000)]
Channel drivers assume that when their indicate callback
is invoked, that the channel on which the callback was called
is locked. This patch corrects an instance in chan_agent where
a channel's indicate callback is called directly without first
locking the channel.
This was leading to some observed locking issues in chan_local,
but considering that all channel drivers operate under the
same expectations, the generic fix in chan_agent is the right
way to go.
Sean Bright [Sun, 9 Nov 2008 01:08:07 +0000 (01:08 +0000)]
Use static functions here instead of nested ones. This requires a small
change to the ast_bridge_config struct as well. To understand the reason
for this change, see the following post:
Mark Michelson [Thu, 6 Nov 2008 19:45:52 +0000 (19:45 +0000)]
The documentation listed the ability to set 'maxmsg' per
context. The truth is that you can only set this in the general section
or per mailbox. Thus I am updating the sample config file to be more
accurate.
Thanks to sasargen on IRC for bringing up this issue.
Tilghman Lesher [Tue, 4 Nov 2008 20:49:33 +0000 (20:49 +0000)]
On busy systems, it's possible for the values checked within a single line
of code to change, unless the structure is locked to ensure a consistent
state.
(closes issue #13717)
Reported by: kowalma
Patches:
20081102__bug13717.diff.txt uploaded by Corydon76 (license 14)
Tested by: kowalma
Tilghman Lesher [Mon, 3 Nov 2008 22:27:10 +0000 (22:27 +0000)]
Attempting to expunge a mailbox when the mailstream is NULL will crash Asterisk.
(Closes issue #13829)
Reported by: jaroth
Patch by: me (modified jaroth's patch)
fix a bunch of potential problems found by gcc 4.3.x, primarily bare strings being passed to printf()-like functions and ignored results from read()/write() and friends
Terry Wilson [Fri, 31 Oct 2008 15:45:29 +0000 (15:45 +0000)]
Recent CDR fixes moved execution of the 'h' exten into the bridging code, so variables that were set after ast_bridge_call was called would not show up in the 'h' exten. Added a callback function to handle setting variables, etc. from w/in the bridging code. Calls back into a nested function within the function calling ast_bridge_call
Steve Murphy [Wed, 29 Oct 2008 05:19:04 +0000 (05:19 +0000)]
A little documentation cross-ref between features and
dial and queue... I wasted some time (stupidly) trying
to get the one-touch parking stuff working, because it
didn't occur to me that I had to also have the corresponding
options in the dial command! Duh! (In all this time, I never
set this up before!)
So, to keep some poor fool from suffering the same fate,
I made the features.conf.sample file mention the corresponding
opts in dial/queue; and the docs for dial/app specifically
mention the corresponding decls in the feature.conf file.
I hope this doesn't spoil some vast, eternal plan...
Steve Murphy [Wed, 29 Oct 2008 04:36:32 +0000 (04:36 +0000)]
The magic trick to avoid this crash is not to
try to find the channel by name in the list,
which is slow and resource consuming, but rather
to pay attention to the result codes from the
ast_bridge_call, to which I added the
AST_PBX_NO_HANGUP_PEER_PARKED value, which
now are returned when a channel is parked.
If you get AST_PBX_KEEPALIVE,
then don't touch the channel pointer.
If you get AST_PBX_NO_HANGUP_PEER, or
AST_PBX_NO_HANGUP_PEER_PARKED, then don't
touch the peer pointer.
Updated the several places where the results
from a bridge were not being properly obeyed,
and fixed some code I had introduced so that
the results of the bridge were not overridden
(in trunk).
All the places that previously tested for
AST_PBX_NO_HANGUP_PEER now have to check for
both AST_PBX_NO_HANGUP_PEER and AST_PBX_NO_HANGUP_PEER_PARKED.
I tested this against the 4 common parking
scenarios:
1. A calls B; B answers; A parks B; B hangs up while A is getting the parking
slot announcement, immediately after being put on hold.
2. A calls B; B answers; A parks B; B hangs up after A has been hung up, but
before the park times out.
3. A calls B; B answers; B parks A; A hangs up while B is getting the parking slot announcement, immediately after being put on hold.
4. A calls B; B answers; B parks A; A hangs up after B has been hung up, but before the park times out.
No crash.
I also ran the scenarios above against valgrind, and accesses looked good.
Tilghman Lesher [Tue, 28 Oct 2008 17:04:56 +0000 (17:04 +0000)]
Reset all DIAL variables back to blank, in case Dial is called multiple times
per call (which could otherwise lead to inconsistent status reports).
(closes issue #13216)
Reported by: ruddy
Patches:
20081014__bug13216.diff.txt uploaded by Corydon76 (license 14)
Tested by: ruddy
Tilghman Lesher [Mon, 27 Oct 2008 21:32:00 +0000 (21:32 +0000)]
Inherit ALL elements of CallerID across a local channel.
(closes issue #13368)
Reported by: Peter Schlaile
Patches:
20080826__bug13368.diff.txt uploaded by Corydon76 (license 14)
Sean Bright [Sun, 26 Oct 2008 20:23:36 +0000 (20:23 +0000)]
Since passing \0 as the second argument to strchr is valid (and will
match the trailing \0 of a string) we need to check that first, otherwise
we end up with incorrect results. Fix suggested by reporter.
Russell Bryant [Sat, 25 Oct 2008 10:59:02 +0000 (10:59 +0000)]
Move AMI initialization to occur after loading modules. This prevents a
deadlock when someone tries to initiate a module reload from the AMI just
as Asterisk is starting.
(closes issue #13778)
Reported by: hotsblanc
Fix suggested by hotsblanc
Terry Wilson [Thu, 23 Oct 2008 16:04:42 +0000 (16:04 +0000)]
Backport fix from 1.6.0 that allows you to set parkedcalltransfers=no|caller|callee|both, but default to both which would be the equivalent of the existing behaviour.
The problem was that if someone parked a call, the callee and caller would both get assigned the builtin transfer feature, which would not only be potentially giving someone the ability to transfer themselves when they shouldn't have it, but would also dissallow reinviting the media off of the call.
(closes issue #12854)
Reported by: davidw
Patches:
parkingfix4.diff.txt uploaded by otherwiseguy
Tested by: davidw, otherwiseguy
Kevin P. Fleming [Mon, 20 Oct 2008 04:45:56 +0000 (04:45 +0000)]
break up acinclude.m4 into individual files, which will make it easier to maintain, easier to add new macros (less patching) and will ease maintenance of these macros across Asterisk branches
BJ Weschke [Sun, 19 Oct 2008 19:51:16 +0000 (19:51 +0000)]
As per kpfleming's comments to the prior commit, I'm reverting some of the changes here.
A comment was made in bug #13726
"3. The same mistake as in (2) is done in a few other places in the code that check for: #if defined(HAVE_ZAPTEL) || defined(HAVE_DAHDI)
Harmless, but still incorrect."
In the case of main/asterisk.c, this is not incorrect because without HAVE_ZAPTEL defined, we're missing
the include for ioctl and the namespace that defines DAHDI_TIMERCONFIG which is still required when
using Zaptel with the 1.4 branch.
BJ Weschke [Sat, 18 Oct 2008 01:42:23 +0000 (01:42 +0000)]
Using the GetVar handler in AMI is potentially dangerous (insta-crash [tm]) when you use a dialplan function that requires a channel and then you don't provide one or provide an invalid one in the Channel: parameter. We'll handle this situation exactly the same way it was handled in pbx.c back on r61766.
We'll create a bogus channel for the function call and destroy it when we're done. If we have trouble allocating the bogus channel then we're not going to try executing the function call at all and run the risk of crashing.
(closes issue #13715)
reported by: makoto
patch by: bweschke
Jason Parker [Fri, 17 Oct 2008 15:31:35 +0000 (15:31 +0000)]
Correctly allow chan_dahdi to compile against older versions of Zaptel.
Don't always define HAVE_ZAPTEL_CHANALARMS (since we check if it's defined..)
Minor cleanup to make things clear.
Mark Michelson [Thu, 16 Oct 2008 23:40:54 +0000 (23:40 +0000)]
Reverting changes from commits 150298 and 150301 since
I was mistakenly under the assumption that dialplan functions
*always* required that a channel be present. I need to go
home earlier, I think :)
Mark Michelson [Thu, 16 Oct 2008 23:34:37 +0000 (23:34 +0000)]
Don't try to call a dialplan function's read callback from
the manager's GetVar handler if an invalid channel has
been specified. Several dialplan functions, including
CHANNEL and SIP_HEADER, do not check for NULL-ness of
the channel being passed in.
Steve Murphy [Thu, 16 Oct 2008 15:26:10 +0000 (15:26 +0000)]
This patch is relevant to:
ABE-1628 and RYM-150398 and AST-103 in internal Digium
bug trackers.
These fixes address a really subtle memory corruption
problem that would happen in machines heavily loaded
in production environments. The corruption would
always take the form of the STMT object getting
nulled out and one of the unixODBC calls would
crash trying to access statement->connection.
It isn't fully proven yet, but the server has
now been running 2.5 days without appreciable
memory growth, or any gain of %cpu, and no
crashes. Whether this is the problem or not
on that server, these fixes are still warranted.
As it turns out, **I** introduced these errors
unwittingly, when I corrected another crash earlier.
I had formed the build_query routine, and failed
to remove mutex_unlock calls in 3 places in the
transplanted code. These unlocks would only
happen in error situations, but unlocking the
mutex early set the code up for a catastrophic
failure, it appears. It would happen only once
every 100K-200K or more calls, under heavy load...
but that is enough.
If another crash occurs, with the same MO,
I'll come back and remove my confession from the log, and
we'll keep searching, but the fact that we
have Asterisk dying from an asynchronous
wiping of the STMT object, only on some connection
error, and that the server has lived for 2.5
days on this code without a crash, sure make
it look like this was the problem!
Also, in several points, Statement handles are
set to NULL after SQLFreeHandle. This was mainly
for insurance, to guarantee a crash. As it turns
out, the code does not appear to be attempting
to use these freed pointers.
Asterisk owes a debt of gratitude to Federico Alves
and Frediano Ziglio for their untiring efforts in
finding this bug, among others.
BJ Weschke [Wed, 15 Oct 2008 18:28:54 +0000 (18:28 +0000)]
An update to the documentation/example of agents.conf.sample with the correct parameter for this feature as defined in chan_agent.c
(closes issue #13709)
Mark Michelson [Tue, 14 Oct 2008 23:00:01 +0000 (23:00 +0000)]
Add a tolerance period for sync-triggered audiohooks
so that if packetization of audio is close (but not equal)
we don't end up flushing the audiohooks over small
inconsistencies in synchronization.
Related to issue #13005, and solves the issue
for most people who were experiencing the problem.
However, a small number of people are still experiencing
the problem on long calls, so I am not closing
the issue yet