Commit Graph

27497 Commits

Author SHA1 Message Date
Richard Mudgett
a036c35903 res_stasis: Handle re-enter stasis bridge with swap channel.
We lose the fact that there is a swap channel if there is one.  We
currently wind up rejoining the stasis bridge as a normal join after the
swap channel has already been kicked from the bridge.

This patch preserves the swap channel so the AMI/ARI events can note that
the channel joining the bridge is swapping with another channel.  Another
benefit to swaqpping in one operation is if there are any channels that
get lonely (MOH, bridge playback, and bridge record channels).  The lonely
channels won't leave before the joining channel has a chance to come back
in under stasis if the swap channel is the only reason the lonely channels
are staying in the bridge.

ASTERISK-25947 #close
Reported by: Richard Mudgett

ASTERISK-24649
Reported by: John Bigelow

ASTERISK-24782
Reported by: John Bigelow

Change-Id: If37ea508831d1fed6dbfac2f191c638fc0a850ee
2016-04-20 15:45:46 -05:00
Richard Mudgett
9942d50aa5 bridge: Hold off more than one imparting channel at a time.
An earlier patch blocked the ast_bridge_impart() call until the channel
either entered the target bridge or it failed.  Unfortuantely, if the
target bridge is stasis and the imprted channel is not a stasis channel,
stasis bounces the channel out of the bridge to come back into the bridge
as a proper stasis channel.  When the channel is bounced out, that
released the block on ast_bridge_impart() to continue.  If the impart was
a result of a transfer, then it became a race to see if the swap channel
would get hung up before the imparted channel could come back into the
stasis bridge.  If the imparted channel won then everything is fine.  If
the swap channel gets hung up first then the transfer will fail because
the swap channel is leaving the bridge.

* Allow a chain of ast_bridge_impart()'s to happen before any are
unblocked to prevent the race condition described above.  When the channel
finally joins the bridge or completely fails to join the bridge then the
ast_bridge_impart() instances are unblocked.

ASTERISK-25947
Reported by: Richard Mudgett

ASTERISK-24649
Reported by: John Bigelow

ASTERISK-24782
Reported by: John Bigelow

Change-Id: I8fef369171f295f580024ab4971e95c799d0dde1
2016-04-20 15:45:38 -05:00
Joshua Colp
b1b3460783 Merge "pjproject: Add patch for removing strip of '[]' from header params" into 13 2016-04-20 08:17:21 -05:00
Joshua Colp
08f6408dc6 Merge "PJSIP: Remove PJSIP parsing functions from uri length validation." into 13 2016-04-19 15:19:35 -05:00
Joshua Colp
ded3794fc6 app_talkdetect: Make the module core supported.
This module is used as part of testsuite tests to confirm
stuff works. I'm accordingly marking it as core as it is
required by those tests.

Change-Id: I558e7af7679b22b8ed641d7dd37ee4ca35b11e88
2016-04-19 15:02:18 -03:00
Mark Michelson
efae187217 PJSIP: Remove PJSIP parsing functions from uri length validation.
The PJSIP parsing functions provide a nice concise way to check the
length of a hostname in a SIP URI. The problem is that in order to use
those parsing functions, it's required to use them from a thread that
has registered with PJLib.

On startup, when parsing AOR configuration, the permanent URI handler
may not be run from a PJLib-registered thread. Specifically, this could
happen when Asterisk was started in daemon mode rather than
console-mode. If PJProject were compiled with assertions enabled, then
this would cause Asterisk to crash on startup.

The solution presented here is to do our own parsing of the contact URI
in order to ensure that the hostname in the URI is not too long. The
parsing does not attempt to perform a full SIP URI parse/validation,
since the hostname in the URI is what is important.

ASTERISK-25928 #close
Reported by Joshua Colp

Change-Id: Ic3d6c20ff3502507c17244a8b7e2ca761dc7fb60
2016-04-19 09:45:15 -06:00
Joshua Colp
9a22ef81af Merge "app_queue: Frequent segfaults in function can_ring_entry()" into 13 2016-04-19 09:49:11 -05:00
Joshua Colp
47adff8977 Merge "stasis_bridge.c: Update stasis bridge push diagnostic messages." into 13 2016-04-19 09:42:50 -05:00
Joshua Colp
a048a0ffbd Merge "res_pjsip_transport_management: Allow unload to occur." into 13 2016-04-19 09:40:42 -05:00
Joshua Colp
c922846c6d Merge "bridge_channel.c: Ignore role setup failure in channel push." into 13 2016-04-19 09:37:30 -05:00
Mark Michelson
f436b9ab11 res_pjsip_registrar: Fix bad memory-ness with user_agent.
Recent changes to the PJSIP registrar resulted in tests failing due to
missing AOR_CONTACT_ADDED test events. The reason for this was that the
user_agent string had junk values in it, resulting in being unable to
generate the event.

I'm going to be honest here, I have no idea why this was happening. Here
are the steps needed for the user_agent variable to get messed up:
* REGISTER is received
* First contact in the REGISTER results in a contact being removed
* Second contact in the REGISTER results in a contact being added
* The contact, AOR, expiration, and user agent all have to be passed as
  format parameters to the creation of a string. Any subset of those
  parameters would not be enough to cause the problem.

Looking into what was happening, the thing that struck me as odd was
that the user_agent variable was meant to be set to the value of the
User-Agent SIP header in the incoming REGISTER. However, when removing a
contact, the user_agent variable would be set (via ast_strdupa inside a
loop) to the stored contact's user_agent. This means that the
user_agent's value would be incorrect when attempting to process further
contacts in the incoming REGISTER.

The fix here is to use a different variable for the stored user agent
when removing a contact. Correcting the behavior to be correct also
means the memory usage is less weird, and the issue no longer occurs.

ASTERISK-25929 #close
Reported by Joshua Colp

Change-Id: I7cd24c86a38dec69ebcc94150614bc25f46b8c08
2016-04-19 08:23:54 -05:00
Joshua Colp
49bfdc9ac0 res_pjsip_transport_management: Allow unload to occur.
At shutdown it is possible for modules to be unloaded that wouldn't
normally be unloaded. This allows the environment to be cleaned up.

The res_pjsip_transport_management module did not have the unload
logic in it to clean itself up causing the res_pjsip module to not
get unloaded. As a result the res_pjsip monitor thread kept going
processing traffic and timers when it shouldn't.

Change-Id: Ic8cadee131e3b2c436a81d3ae8bb5775999ae00a
2016-04-18 15:49:07 -03:00
Richard Mudgett
f4693d1897 bridge_channel.c: Ignore role setup failure in channel push.
We have to setup the channel roles after the bridge class push is called
because the bridge class push callback may have set roles on the incoming
channel.  Since we have already partially pushed the channel into the
bridge and reversing what we have already done could be problematic, the
only thing we can do is press on to complete pushing the channel into the
bridge.

* Ignore any channel role setup errors after pushing the channel into a
bridge.  The channel may behave incorrectly in the bridge but we can no
longer abort the push at this time.

Change-Id: I08a97082b729052ee65cdca6bb730cf1289ede00
2016-04-18 10:51:56 -05:00
Jaco Kroon
22335fe18a chan_sip: Don't verify table if rtupdate=no
If rtupdate=no do not verify sipregs/peers table has updatable fields.

ASTERISK-25934 #close

Change-Id: Iaa2c53037b93daccc7e7333c40d61861847b856d
2016-04-18 05:34:51 -05:00
Joshua Colp
c7732a2600 Merge "Codecs: strip codec name while parsing allow/disallow options" into 13 2016-04-18 05:31:09 -05:00
ibercom
3b9d8b60b2 app_queue: Frequent segfaults in function can_ring_entry()
ASTERISK-25888 #close

Change-Id: I007a2f2dd99823e04fb5be3ff01f02b0a2956117
2016-04-18 05:06:27 -05:00
Richard Mudgett
724acb6ce7 stasis_bridge.c: Update stasis bridge push diagnostic messages.
Change-Id: I195b14994c9dcccb9452491ca20a885d2a54605a
2016-04-15 20:24:46 -05:00
Joshua Colp
56c8182913 Merge "app_voicemail/IMAP: function 'save_to_folder' creates wrong folder" into 13 2016-04-15 13:21:21 -05:00
Mark Michelson
5f78801859 transport management: Register thread with PJProject.
The scheduler thread that kills idle TCP connections was not registering
with PJProject properly and causing assertions if PJProject was built in
debug mode.

This change registers the thread with PJProject the first time that the
scheduler callback executes.

AST-2016-005

Change-Id: I5f7a37e2c80726a99afe9dc2a4a69bdedf661283
2016-04-14 14:25:13 -05:00
Joshua Colp
13cb5ea73f Merge "res_pjsip_transport_management: Kill idle TCP connections." into 13 2016-04-14 13:02:47 -05:00
Joshua Colp
120493d5c0 Merge "Rename res_pjsip_keepalive res_pjsip_transport_management" into 13 2016-04-14 13:01:13 -05:00
Joshua Colp
6c9c714bb6 Merge "AST-2016-004: Fix crash on REGISTER with long URI." into 13 2016-04-14 13:00:14 -05:00
Mark Michelson
7fb3724a77 res_pjsip_transport_management: Kill idle TCP connections.
"Idle" here means that someone connects to us and does not send a SIP
request. PJProject will not automatically time out such connections, so
it's up to Asterisk to do it instead.

When we receive an incoming TCP connection, we will start a timer
(equivalent to transaction timer D) waiting to receive an incoming
request. If we do not receive a request in that timeframe, then we will
shut down the TCP connection.

ASTERISK-25796 #close
Reported by George Joseph

AST-2016-005

Change-Id: I7b0d303e5d140d0ccaf2f7af562071e3d1130ac6
2016-04-14 11:58:04 -05:00
Mark Michelson
707fd4dcd0 Rename res_pjsip_keepalive res_pjsip_transport_management
ASTERISK-25796
Reported by George Joseph

AST-2016-005

Change-Id: Id322a05f927392293570599730050bc677d99433
2016-04-14 07:34:13 -05:00
Mark Michelson
0b4bb19e0b AST-2016-004: Fix crash on REGISTER with long URI.
Due to some ignored return values, Asterisk could crash if processing an
incoming REGISTER whose contact URI was above a certain length.

ASTERISK-25707 #close
Reported by George Joseph

Patches:
	0001-res_pjsip-Validate-that-URIs-don-t-exceed-pjproject-.patch

AST-2016-004

Change-Id: I0ed3898fe7ab10121b76c8c79046692de3a1be55
2016-04-14 07:15:47 -05:00
Richard Mudgett
f6e080c6a4 bridge_softmix.c: Fix crash if could not allocate the dsp.
Fix off nominal crash where we could not setup the channel to process
frames for the softmix bridge technology because of allocation failure.

Change-Id: Ic307a8386e46bf551e48fcd1eb97276714d56372
2016-04-13 20:59:43 -05:00
Joshua Colp
1f853df29c Merge "app_voicemail: Fix test_voicemail_notify_endl test." into 13 2016-04-13 05:20:22 -05:00
George Joseph
cf15a2f2d3 pjproject: Add patch for removing strip of '[]' from header params
From the patch submitted to Teluu on 4/12/2016
<<<<<<<<<
The wholesale stripping of '[]' from header parameters causes issues if
something (like a port) occurs after the final ']'.

'[2001🅰️:b]' will correctly parse to '2001🅰️:b'
'[2001🅰️:b]:8080' will correctly parse to '2001🅰️:b' but the scanner is left
with ':8080' and parsing stops with a syntax error.

I can't even find a case where stripping the '[]' is a good thing anyway.  Even
if you continued to parse and resulted in a string that looks like this...
'2001🅰️🅱️8080', it's not valid.

This came up in Asterisk because Kamailio sends us a Contact with an alias
URI parameter that has an IPv6 address in it like this:
Contact: <sip:1171@127.0.0.1:5080;alias=[2001:1:2::3]~43691~6>
which should be legal but causes a syntax error because of the characters
after the final ']'.  Even if it didn't, the '[]' should still not be stripped.

I've run the Asterisk Test Suite for PJSIP (252 tests) many of which are IPv6
enabled.  No issues were caused by removing the code that strips the '[]'.
>>>>>>>>>>>

ASTERISK-25123 #close
Reported-by: Anthony Messina

Change-Id: I5cb33f4ebf07ee1f2b26d07caae715e2ec65595a
2016-04-12 14:41:43 -06:00
Joshua Colp
4ab4fc9141 Merge "res_pjsip_dialog_info: Add missing "direction" attribute in NOTIFY event" into 13 2016-04-12 13:28:47 -05:00
Joshua Colp
daa086fae4 app_voicemail: Fix test_voicemail_notify_endl test.
The test_voicemail_notify_endl test checks the end-of-line
characters of an email message to confirm that they are consistent.
The test wrongfully assumed that reading from the email message
into a buffer will always result in more than 1 character being
read. This is incorrect. If only 1 character was read the test
would go outside of the buffer and access other memory causing
a crash.

The test now checks to ensure that 2 or more characters are read
in ensuring the test stays within the buffer.

ASTERISK-25874 #close

Change-Id: Ic2c89cea6e90f2c0bc2d8138306ebbffd4f8b710
2016-04-12 10:21:56 -05:00
zuul
70c788ec5e Merge "res_pjsip: Add headers to AMI Event ContactStatusDetail" into 13 2016-04-12 07:35:01 -05:00
Alexei Gradinari
f896136460 app_voicemail/IMAP: function 'save_to_folder' creates wrong folder
If try to move message to Cust1 (number 5)
the function 'save_to_folder' tries to create Greeting folder instead of Cust1.

This patch fixed it by setting GREETINGS_FOLDER = -1

ASTERISK-24927 #close

Change-Id: I03d1a761894bcc2d130ec9b003bbcddc28e25c51
2016-04-11 22:30:53 -05:00
Alexei Gradinari
70b7673f09 res_pjsip: Add headers to AMI Event ContactStatusDetail
* Added Useragent and RegExpire headers to AMI Event
ContactStatusDetail with associated documentation.

ASTERISK-25903 #close

Change-Id: If3d121e943e588d016ba51d4eb9c6a421a562239
2016-04-11 22:24:50 -05:00
zuul
cf1c0277b5 Merge "res_pjsip_outbound_publish: Add transport for outbound PUBLISH" into 13 2016-04-11 21:26:28 -05:00
zuul
600148b5b0 Merge "alembic: Remove batch operations (and sqlite support)" into 13 2016-04-11 20:43:18 -05:00
Joshua Colp
5eec2386cf Merge "core_unreal: Fix hangupcauses not getting set on Local channels" into 13 2016-04-11 18:02:42 -05:00
zuul
df40173a00 Merge "res_pjsip contact: Lock expiration/addition of contacts" into 13 2016-04-11 16:29:38 -05:00
Alexei Gradinari
64ecd41c8f Codecs: strip codec name while parsing allow/disallow options
Failed registration using PJSIP/Realtime if one of the codec name
in allow/disallow option is wrong or contains space.

This patch strip codec name.

ASTERISK-25914

Change-Id: Ifdf02de94e5ddbce305640f6f0666084a3b9283d
2016-04-11 17:25:08 -04:00
Jaco Kroon
3f6c4667b8 core_unreal: Fix hangupcauses not getting set on Local channels
ASTERISK-25912 #close

Change-Id: I8e72e6894feaf36c9450f2788d205d07baec23aa
2016-04-11 14:55:32 -05:00
zuul
f2edcfe62e Merge "app_voicemail/IMAP: IMAP access FATAL error: Out of memory" into 13 2016-04-11 14:10:51 -05:00
George Joseph
fe7e48db03 res_pjsip contact: Lock expiration/addition of contacts
Contact expiration can occur in several places:  res_pjsip_registrar,
res_pjsip_registrar_expire, and automatically when anyone calls
ast_sip_location_retrieve_aor_contact.  At the same time, res_pjsip_registrar
may also be attempting to renew or add a contact.  Since none of this was locked
it was possible for one thread to be renewing a contact and another thread to
expire it immediately because it was working off of stale data.  This was the
casue of intermittent registration/inbound/nominal/multiple_contacts test
failures.

Now, the new named lock functionality is used to lock the aor during contact
expire and add operations and res_pjsip_registrar_expire now checks the
expiration with the lock held before deleting the contact.

ASTERISK-25885 #close
Reported-by: Josh Colp

Change-Id: I83d413c46a47796f3ab052ca3b349f21cca47059
2016-04-11 13:00:14 -05:00
zuul
736a2c303d Merge "lock: Add named lock capability" into 13 2016-04-11 12:56:40 -05:00
George Joseph
0c414eaf35 pjproject: Add patch to fix Via IPv6 parsing
There's a bug in pjproject's sip_parser where the ":" wasn't correctly
interpreted. This is causing IPv6 addresses in the "received" parameter of the
Via header to cause a syntax check failure.

This patch was submitted to Teluu on 4/10/2016.

ASTERISK-25910 #close
Reported-by: Anthony Messina

Change-Id: Ic7e4c4aa14ded61860401ec349f5177568c4d922
2016-04-10 13:16:42 -06:00
George Joseph
772ff3048f lock: Add named lock capability
Locking some objects like sorcery objects can be tricky because the underlying
ao2 object may not be the same for all callers.  For instance, two threads that
call ast_sorcery_retrieve_by_id on the same aor name might actually get 2
different ao2 objects if the underlying wizard had to rehydrate the aor from a
database. Locking one ao2 object doesn't have any effect on the other even if
those objects had locks in the first place.

Named locks allow access control by keyspace and key strings.  Now an "aor"
named "1000" can be locked and any other thread attempting to lock "aor" "1000"
will wait regardless of whether the underlying ao2 object is the same or not.
Mutex and rwlocks are supported.

This capability will initially be used to lock an aor when multiple threads may
be attempting to prune expired contacts from it.

Change-Id: If258c0b7f92b02d07243ce70e535821a1ea7fb45
2016-04-08 12:50:58 -06:00
Alexei Gradinari
fd601f26f7 res_pjsip_outbound_publish: Add transport for outbound PUBLISH
The first available transport of the appropriate type is used now.
This patch adds new config option 'transport' for outbound-publish.
If transport is set then outbound PUBLISH requests will use this transport.

ASTERISK-25901 #close

Change-Id: Ib389130489b70e36795b0003fa5fd386e2680151
2016-04-08 13:44:53 -05:00
zuul
e7e16b7465 Merge "pbx.c: Minor code rearangements." into 13 2016-04-08 11:18:33 -05:00
Alexei Gradinari
5f768d2a9c res_pjsip_dialog_info: Add missing "direction" attribute in NOTIFY event
BLF pickup isn't working on Cisco SPA and Snom phones
if the direction="recipient" attribute is missing in 'dialog' tag.

This patch adds direction="recipient" if extension state is
Ringing.

ASTERISK-24601 #close

Change-Id: I5b2c097ca29fd59e92ba237ca5d397cb1b0bcd8c
2016-04-08 05:48:51 -05:00
Richard Mudgett
82638fb0c7 pbx.c: Minor code rearangements.
* Pull out a loop invariant.

* Convert an else-if ladder to a switch statement.

Change-Id: I0a95cfa9474a4600b9865f7b444534d275b37e95
2016-04-07 17:12:49 -05:00
Alexei Gradinari
bc320df173 app_voicemail/IMAP: IMAP access FATAL error: Out of memory
Sometimes uw-imap function 'mail_fetchbody' returns huge len
which then pass to uw-imap function 'rfc822_base64'.
uw-imap tries to allocate huge memory and abort() on fail.

This patch check the len.
If the len more than max size (128 Mbytes) log error.
This patch also set variables len, newlen to avoid uninizialezed len.
This patch also check pointer returned by rfc822_base64.

ASTERISK-25899 #close

Change-Id: I4a0e7d655f11abef6a5224e2169df6d5c1f1caca
2016-04-07 17:10:30 -05:00
Richard Mudgett
2ef8a954b3 pbx: Update doxygen for extension state watchers.
Change-Id: Id1403b12136de62a272c01bb355aef65fd2c2d1e
2016-04-07 16:16:22 -05:00