Terry Wilson [Thu, 16 Jun 2011 22:35:41 +0000 (22:35 +0000)]
Lock the channel before calling the setoption callback
The channel needs to be locked before calling these callback functions. Also,
sip_setoption needs to lock the pvt and a check p->rtp is non-null before using
it.
DYNAMIC_FEATURES were broken by a recent DTMF change. This patch makes
sure that dynamic features are also checked when deciding whether or not
to pass DTMF through or store it for interpreting.
Jonathan Rose [Wed, 15 Jun 2011 17:42:42 +0000 (17:42 +0000)]
Adds locking to find_table in res_configure_pgsql to prevent a crash.
Bryonclark described the problem as occuring during this function because of multiple
simultaneous database operations causing corruption against a pgsqlConn object.
Richard Mudgett [Wed, 15 Jun 2011 16:43:18 +0000 (16:43 +0000)]
[regression] Voicemail MWI is no longer sent.
When leaving a voicemail, the MWI message is never sent. The same thing
happens when checking a voicemail and marking it as read.
If you restart Asterisk, everything comes up at that state correctly, but
changes to the messages in voicemail causes the light to not be set
appropriately. Very easy to reproduce.
* Made ast_event_check_subscriber() return TRUE if there are ANY
subscribers to an event type when there are no restricting ie values
passed. This allows an event being queued to be queued.
Resolve a segfault/bus error when we try to map memory that falls on a page
boundary.
The fix for ASTERISK-15359 was incorrect in that it added 1 to the length of the
mmap'd region. The problem with this is that reading/writing to that extra byte
outside of the bounds of the underlying fd causes a bus error.
The real issue is that we are working with both a FILE * and the raw fd
underneath it and not synchronizing between them. The code that was removed in
ASTERISK-15359 was correct, but we weren't flushing the FILE * before mapping
the fd.
Looking at the manager code in 1.4 reveals that the FILE * in 'struct
mansession' is never used except to create a temporary file that we immediately
fdopen. This means we just need to write a 0 byte to the fd and everything will
just work. The other branches require a call to fflush() which, while not a
guaranteed fix, should reduce the likelihood of a crash.
This all makes sense in my head.
(closes issue ASTERISK-16460)
Reported by: Ravelomanantsoa Hoby (hoby)
Patches:
issue17747_1.4_svn_markII.patch uploaded by Sean Bright (license #5060)
........
................
Jonathan Rose [Tue, 14 Jun 2011 16:38:43 +0000 (16:38 +0000)]
Changes contact use in build_peer to use the FORCE_RPORT flag instead of RPORT_PRESENT
It turned out that this was causing NAT=Yes to always use rport when present which was
against 1.6.2 behavior and the check itself was redundant since the only way this
segment of code could be reached was if RPORT_PRESENT was already evaluated as true
earlier.
Leif Madsen [Mon, 13 Jun 2011 20:22:21 +0000 (20:22 +0000)]
Additional documentation for bindaddr.
Note that bindaddr will only enable UDP instead of both UDP and TCP which is
what I would expect for backwards compatibility with systems being upgraded
which only support UDP transportation.
(closes issue ASTERISK-17976)
Reported by: Sean Darcy
Terry Wilson [Fri, 10 Jun 2011 15:29:00 +0000 (15:29 +0000)]
Avoid a DB1 infinite loop bug
Explicity check the last entry in the DB and make sure that we don't iterate
past it. Since there can be no duplicates, this just makes sure that we stop
after matching the last key.
This patch also refactors the code to get away from some code duplication. A
previous patch added many astdb tests and this patch passed them.
Richard Mudgett [Thu, 9 Jun 2011 16:31:53 +0000 (16:31 +0000)]
Remove potential deadlock in call pickup race.
Deadlock is possible in ast_do_pickup() when holding the target channel
lock and trying to get the chan channel lock. Also, holding the target
lock when calling ast_channel_masquerade() is not a good idea because that
routine does deadlock avoidance.
* Removed the need to hold the target lock after marking the target with a
datastore and getting the connected line data off of the target channel.
* Moved can_pickup() to ast_can_pickup() in features.c. Now all the call
pickup methods use the same basic call pickup availability check.
Jonathan Rose [Thu, 9 Jun 2011 14:06:42 +0000 (14:06 +0000)]
Adds ast_escape_encoded utility to properly handle escaping of quoted field before uri.
This commit backports a feature in trunk affecting initreqprep so that display name won't
be encoded improperly. Also includes unit tests for the ast_escape_quoted function.
This patch gives 1.8 a much improved outlook in countries which don't use standard
ASCII characters.
Richard Mudgett [Wed, 8 Jun 2011 20:46:55 +0000 (20:46 +0000)]
Ring all queue with more than 255 agents will cause crash.
1. Create a ring-all queue with 500 permanent agents.
2. Call it.
3. Asterisk will crash.
The watchers array in app_queue.c has a hard limit of 255. Bounds
checking is not done on this array. No sane person should put 255 people
in a ring-all queue, but we should not crash anyway.
Gregory Nietsky [Wed, 8 Jun 2011 06:18:38 +0000 (06:18 +0000)]
Make handle_request_publish do dialog expiration and destruction.
This patch fixes handle_request_publish so that it does dialog expiration and destruction.
Without this patch the incoming PUBLISH requests will get stuck in the dialog list.
Restarting asterisk is the only way to remove them.
Personal observation on one system the server hung up while looping through the channels
rendering asterisk unusable and all sip phones unregisterd when they try reregister
more requests are added.
Richard Mudgett [Fri, 3 Jun 2011 22:09:36 +0000 (22:09 +0000)]
Asterisk crash when unloading cdr_radius/cel_radius.
The rc_openlog() API call is passed a string that is used by openlog() to
format log messages. The openlog() does not copy the string it just keeps
a pointer to it. When the module is unloaded, the string is gone from
memory. Depending upon module load order and if the other module then has
an error, a crash happens.
* Pass rc_openlog() a strdup'd string with the understanding that there
will be a small memory leak if the cdr_radius/cel_radius modules are
unloaded.
* Call rc_destroy() to free the rc handle memory when the module is
unloaded.
Richard Mudgett [Fri, 3 Jun 2011 20:58:13 +0000 (20:58 +0000)]
Event subscription fixes.
Must commit the subscription fixes together with the integration
subscription tests. The subscription fixes cause an erroneously passing
test to fail. The new subscription tests detect errors without the
subscription fixes.
* Added missing event_names[] table entry.
* Reworked ast_event_check_subscriber()/match_sub_ie_val_to_event() to
correctly detect if a subscriber exists for the proposed event.
* Made match_ie_val() and match_sub_ie_val_to_event() check the buffer
length for RAW payload types.
* Fixed error handling memory leak in ast_event_sub_activate(),
ast_event_unsubscribe(), and ast_event_queue().
* Made ast_event_new() and ast_event_check_subscriber() better protect
themselves from an invalid payload type.
* Added container lock protection between removing old cache events and
adding the new cached event in
ast_event_queue_and_cache()/event_update_cache().
Alexandr Anikin [Wed, 1 Jun 2011 10:40:19 +0000 (10:40 +0000)]
Fix double alerting, add forced alerting before answer
Fix double alerting (it wasn't fixed here by issue #18542)
Add forced alerting before connect (if it wasn't before)
Try to send all packets from outgoing queue rather than one only
Call goes into clearing state when disconnect command is received
David Vossel [Tue, 31 May 2011 18:52:54 +0000 (18:52 +0000)]
Chan_local locking cleanup.
This patch removes all of the unnecessary deadlock
avoidance loops that occur in chan_local. It also
resolves an issue with a deadlock triggered by
local channel optimizations.
Richard Mudgett [Fri, 27 May 2011 23:45:41 +0000 (23:45 +0000)]
Crash when using hagi and no servers are available.
When none of the servers returned by the SRV querey respond, asterisk
crashes. The problem is that if the loop over all the SRV entries
finishes then the srv_context has already been cleaned up.
* Make ast_srv_cleanup() check to see if the context is already cleaned
up.
Alec L Davis [Fri, 27 May 2011 08:31:15 +0000 (08:31 +0000)]
Fix *8 directed pickup locks system during pickupsound play out
move playout from sip_pickup_thread to bridge using BRIDGE_PLAY_SOUND method,
This stop the clash of 2 threads trying to write audio to same channel.
In addition fixes choppy audio beep in issue 19177.
Mark Murawki [Thu, 26 May 2011 21:48:45 +0000 (21:48 +0000)]
Fixed build problem with dev mode enabled, which was caused by commit 321100. Reformulated patch to be more generic.
Moved the sip uri parse variable initalization to parse_uri_full in reqresp_parser.c. This will ensure that any use of parse uri will have null output variables if the parse fails.
Mark Murawki [Thu, 26 May 2011 20:09:35 +0000 (20:09 +0000)]
ast_sockaddr_resolve() in netsock2.c may deref a null pointer
Added a null check in netsock2 ast_sockaddr_resolve() as well as added default initalizers in chan_sip parse_uri_legacy_check() to make sure that invalid uris will make null (and not undefined) user,pass,domain,transport variables
Terry Wilson [Thu, 26 May 2011 17:29:54 +0000 (17:29 +0000)]
Initialize stack-allocated ast_sockaddrs before use
It is important to always initialize ast_sockaddrs before use--even if they
are passed to ast_sockaddr_copy as the underlying storage could be bigger
than what ends up being copied--leaving part of the data unitialized.
Richard Mudgett [Wed, 25 May 2011 22:25:18 +0000 (22:25 +0000)]
Native SIP CCSS sends bad CC cancel SUBSCRIBE message.
The SUBSCRIBE message used to cancel a CC request has incorrect To/From
SIP headers. They are reversed and the dialog tags are the same when they
should not be. If pedantic mode was disabled, then the cancel would have
succeeded despite the incorrect message.
* The SIP_OUTGOING flag was not set correctly for the dialog and I had to
move some CC subscribe handling code as a result.
* Initialized the dialog subscribed type to CALL_COMPLETION earlier. If a
CC request SUBSCRIBE message comes in and the CC instance is not found,
the 404 response was duplicated.
Richard Mudgett [Wed, 25 May 2011 17:06:38 +0000 (17:06 +0000)]
The AMI Newstate event contains different information between v1.4 and v1.8.
The addition of connected line support in v1.8 changes the behavior of the
channel caller ID somewhat. The channel caller ID value no longer time
shares with the connected line ID on outgoing call legs. The timing of
some AMI events/responses output the connected line ID as caller ID.
These party ID's are now separate.
* The ConnectedLineNum and ConnectedLineName headers were added to many
AMI events/responses if the CallerIDNum/CallerIDName headers were also
present.
Richard Mudgett [Wed, 25 May 2011 16:23:11 +0000 (16:23 +0000)]
Give zombies a safe channel driver to use.
Recent crashes from zombie channels suggests that they need a safe home to
goto. When a masquerade happens, the physical part of the zombie channel
is hungup. The hangup normally sets the channel private pointer to NULL.
If someone then blindly does a callback to the channel driver, a crash is
likely because the private pointer is NULL.
The masquerade now sets the channel technology of zombie channels to the
kill channel driver.
Related to the following issues:
(issue #19116)
(issue #19310)
Richard Mudgett [Mon, 23 May 2011 17:53:44 +0000 (17:53 +0000)]
Add ConnectedLineNum/Name headers to output of AMI action Status.
* Add ConnectedLineNum and ConnectedLineName headers to the output of the
AMI action Status. This makes it easier to find out who the channel is
connected to without having to lookup BridgedChannel or when they are
connected to an application (e.g.: VoiceMail) which has no bridged
channel.
* Bridged channels with no CallerID had "" instead of "<unknown>" output,
that might be a bug as "<unknown>" was what older versions used.
The meetme CLI command completion leaves conferences mutex locked.
When issuing a meetme kick CLI command and an invalid (non-existent)
conference number is specified, pressing Tab leaves the conferences mutex
locked and, therefore, all conferences deadlock.
This commit modifies the way polling is done on TLS sockets.
Because of the buffering the TLS layer does, polling is unreliable. If poll is
called while there is data waiting to be read in the TLS layer but not at the
network layer, the messaging processing engine will not proceed until something
else writes data to the socket, which may not occur. This change modifies the
logic around TLS sockets to only poll after a failed read on a non-blocking
socket. This way we know that there is no data waiting to be read from the
buffering layer.
(closes issue #19182)
Reported by: st
Patches:
ssl-poll-fix3.diff uploaded by mnicholson (license 96)
Tested by: mnicholson
Jonathan Rose [Fri, 20 May 2011 18:12:21 +0000 (18:12 +0000)]
Fixes an imapfolder related crash
imapfolders being set in the general section of voicemail would cause the inbox folder name to
change. Since sound file names are made based on the names of the folders, this would cause
the audio related to that folder name to change and if Asterisk attempted to play it, the
channel would instantly hang up when the audio file couldn't be found. This patch searches for
the name of the folder first to leave existing behavior in tact and if that fails, it uses
the normal inbox name to get the sound file instead.
Richard Mudgett [Fri, 20 May 2011 16:43:02 +0000 (16:43 +0000)]
Crash while transferring a call during DTMF feature timeout.
When a call is being attended transferred during the time between
AST_FRAME_DTMF_BEGIN and AST_FRAME_DTMF_END, the transferred channel
becomes a zombie (so tech data is not available), making ast_dtmf_stream()
segfault when it tries to send the DTMF digit (at least with SIP
channels).
Patch based on feature-end-zombie.patch uploaded by Irontec (license 1256)
* Check for zombies when ast_channel_bridge() returns.
* Guarantee that the fo parameter value is initialized in
ast_channel_bridge() before any returns.
Richard Mudgett [Fri, 20 May 2011 15:48:25 +0000 (15:48 +0000)]
Crash when using directed pickup applications.
The directed pickup applications can cause a crash if the pickup was
successful because the dialplan keeps executing.
This patch does the following:
* Completes the channel masquerade on a successful pickup before the
application returns. The channel is now guaranteed a zombie and must not
continue executing the dialplan.
* Changes the return value of the directed pickup applications to return
zero if the pickup failed and nonzero(-1) if the pickup succeeded.
* Made some code optimizations that no longer require re-checking the
pickup channel to see if it is still available to pickup.
Jonathan Rose [Fri, 20 May 2011 13:28:24 +0000 (13:28 +0000)]
Adds legacy_useroption_parsing to address interoperability concerns.
With the new option engaged, Asterisk should interpret user fields with useroptions
contained within the userfield of the uri by stripping them out of the original message
whenever a semicolon is encountered in the userfield string.
Terry Wilson [Thu, 19 May 2011 23:28:13 +0000 (23:28 +0000)]
Revert part of a change to the bridging API code
The capabilities used in the bridging API are very different than the
ones used for formats. When the conversion was made expanding the bit
width of codecs, the bridging code was accidentally accosted in ways
that it didn't deserve.
Richard Mudgett [Thu, 19 May 2011 16:50:48 +0000 (16:50 +0000)]
CCSS generic agent with POTS and ISDN phones fail caller busy call-back test.
If the following is true after a CCSS activation:
* The generic agent is for an analog phone or ISDN phone. (Caller party)
* The called party becomes available.
* The caller party is not available.
When the caller party becomes available, the caller is not alerted to the
called party being available. The generic agent still thinks the caller
is busy.
* Fixed the generic agent device state event subscription to look for all
device states that are considered available.
* Encapsulated the device state test for CCSS generic device available in
cc_generic_is_device_available(). Made the generic agent and monitor use
the new function instead of the manually coded inline equivalent.
Make sure everyone gets an unhold when a transfer succeeds
Some phones, like the Snom phones, send a hold to the transfer target after
before sending the REFER. We need to make sure that we unhold the parties
that are being connected after the masquerade. If Local channels with the /nm
option are used when dialing the parties, hold music would still be playing on
the transfer target, even after being connected with the transferee.
........
................
Terry Wilson [Wed, 18 May 2011 20:22:36 +0000 (20:22 +0000)]
Unbreak the storing of registrations for restart
The fix for issue 18882 broke retrieving non-realtime peers from the ast_db
on restart/reload. This patch tries to unbreak things while leaving the intent
of the original fix intact.
(closes issue #19318)
Reported by: remiq
Patches:
diff.txt uploaded by twilson (license 396)
Tested by: lmadsen, remiq
The mISDN HDLC mode is prevented on dialed channels.
The use of mISDN HDLC mode is prevented if the mISDN dial technology
option 'h1' is used when config option astdtmf=yes.
There is a bug in channels/misdn/isdn_lib.c which prevents the use of HDLC
mode. Instead of setting the channel to HDLC mode it is set to
transparent(no dsp, no hdlc), although hdlc is not "no hdlc". I.e the
logging message is correct, but the if condition is not.
Jonathan Rose [Mon, 16 May 2011 21:00:55 +0000 (21:00 +0000)]
Makes busy detection in dsp.c always allow for at least one frame (20ms) of error so that 200ms tone lengths don't get ignored by single frame error lengths.
Richard Mudgett [Mon, 16 May 2011 20:33:37 +0000 (20:33 +0000)]
Deadlock between generic CCSS agent and native ISDN CCSS.
Deadlock can occur when the generic CCSS agent is deleting duplicate CC
offers and the native ISDN CC driver is processing an incoming CC message.
The cc_core_instances container lock cannot be held when an agent or
monitor callback is invoked without the possibility of a deadlock.
* Make kill_duplicate_offers() remove the reference in cc_core_instances
outside of the container lock.