Corey Farrell [Tue, 19 Dec 2017 00:59:57 +0000 (19:59 -0500)]
chan_sip: Fix memory leaks.
In change_redirecting_information variables we use ast_strlen_zero to
see if a value should be saved. In the case where the value is not NULL
but is a zero length string we leaked.
handle_response_subscribe leaked a reference to the ccss monitor
instance.
This module uses AST_DEFINE_APP_ARGS_TYPE to define struct's instead of
directly using AST_DECLARE_APP_ARGS. Initialize the variables declared
in this way.
Corey Farrell [Tue, 19 Dec 2017 00:04:56 +0000 (19:04 -0500)]
app_voicemail: Fix memory management issues.
* mwi_sub_event_cb: mwist leaked on separate_mailbox failure.
* add_email_attachment: A reference to sox_gain_tmpdir was used
after the storage was out of scope.
Attempting to dial PJSIP/endpoint when the endpoint doesn't exist and
disable_multi_domain=no results in a misleading empty endpoint name
message. The message should say the endpoint was not found.
* Added missing endpoint not found message.
* Added more information to the empty endpoint name msgs if available.
Corey Farrell [Tue, 21 Nov 2017 05:10:58 +0000 (00:10 -0500)]
loader: Rework of load_dynamic_module.
* Split off load_dlopen to perform actual dlopen, check results and log
warnings when needed.
* Use flags which minimize number of calls to dlopen required. First
attempt always uses RTLD_GLOBAL when global_symbols_only is enabled,
RTLD_LOCAL when it is not.
This patch significantly reduces the number of dlopen's performed. With
299 modules my system ran dlopen 857 times before this patch, 655 times
after this patch.
Corey Farrell [Wed, 22 Nov 2017 02:34:56 +0000 (21:34 -0500)]
loader: Minor fix to module registration.
This protects the module loader itself against crashing if dlopen is
called on a module from outside loader.c.
* Expand scope of lock inside ast_module_register to include reading of
resource_being_loaded.
* NULL check resource_being_loaded.
* Set resource_being_loaded NULL as soon as dlopen returns. This fixes
some error paths where it was not NULL'ed.
* Create module_destroy function to deduplicate code from
ast_module_unregister and modules_shutdown.
* Resolve leak that occured if a module did not successfully register.
* Simplify checking for successful registration.
Corey Farrell [Tue, 12 Dec 2017 18:55:12 +0000 (13:55 -0500)]
aco: Minimize use of regex.
Remove nearly all use of regex from ACO users. Still remaining:
* app_confbridge has a legitamate use of option name regex.
* ast_sorcery_object_fields_register is implemented with regex, all
callers use simple prefix based regex. I haven't decided the best
way to fix this in both 13/15 and master.
Corey Farrell [Tue, 12 Dec 2017 18:36:39 +0000 (13:36 -0500)]
aco: Create ways to minimize use of regex.
ACO uses regex in many situations where it is completely unneeded. In
some cases this doubles the total processing performed by
aco_process_config.
* Create ACO_IGNORE category type for use in place of skip_category
regex source string.
* Create additional aco_category_op values to allow specifying category
filter using either a single plain string or a NULL terminated array
of plain strings.
* Create ACO_PREFIX to allow matching option names to case insensitive
prefixes.
Richard Mudgett [Tue, 12 Dec 2017 00:20:06 +0000 (18:20 -0600)]
res_rtp_asterisk.c: Disable packet flood detection for video streams.
We should not do flood detection on video RTP streams. Video RTP streams
are very bursty by nature. They send out a burst of packets to update the
video frame then wait for the next video frame update. Really only audio
streams can be checked for flooding. The others are either bursty or
don't have a set rate.
* Added code to selectively disable packet flood detection for video RTP
streams.
Corey Farrell [Wed, 13 Dec 2017 15:50:59 +0000 (10:50 -0500)]
CLI: Remove special handling of 'core set verbose' from rasterisk.
rasterisk does not need to handle setting verbose levels locally, it
should just tell the daemon what it wants and print what it is given.
Just max out the verbose level on the local client so all filtering
happens on the daemon.
Joshua Colp [Thu, 30 Nov 2017 16:12:55 +0000 (16:12 +0000)]
AST-2017-012: Place single RTCP report block at beginning of report.
When the RTCP code was transitioned over to Stasis a code change
was made to keep track of how many reports are present. This count
controlled where report blocks were placed in the RTCP report.
If a compound RTCP packet was received this logic would incorrectly
place a report block in the wrong location resulting in a write
to an invalid location.
This change removes this counting logic and always places the report
block at the first position. If in the future multiple reports are
supported the logic can be extended but for now keeping a count
serves no purpose.
Joshua Colp [Wed, 6 Dec 2017 14:24:03 +0000 (14:24 +0000)]
pjsip: Ignore state changes from old transactions.
When we fail over to a new target we create a new transaction
and it becomes the current INVITE transaction. This does not
prevent the previous transaction from raising state changes
and causing the session to be prematurely disconnected if a
transport error occurs immediately.
This change backports a fix from PJSIP that eliminates the
incorrect state change and reduces when they would be raised
in the first place.
Ivan Poddubny [Tue, 12 Dec 2017 21:38:01 +0000 (22:38 +0100)]
app_queue: Fix extension state subscriptions removed on dialplan reload
The approach with having a single global subscription to all extension
state changes has one issue: dynamically created hints don't have any
watchers and are therefore garbage collected on the first dialplan
reload.
This change creates a state subscription for every queue member with a
hint as state_interface, thus increasing the count of watches for
hints, so they are not destroyed prematurely anymore.
There are 2 side effects:
1. The state change callback in app_queue is not executed when
there are no members referring to the extension.
2. The callback is called multiple times for the same hint if it's
associated with more than one queue member.
Corey Farrell [Tue, 12 Dec 2017 21:16:38 +0000 (16:16 -0500)]
menuselect: Tweak check for recently run configure.
Recently menuselect has randomly produced an error stating that
configure was just run and make had to be restarted. I believe this is
due to an incorrect menuselect/Makefile rule. The original rule
produced an error if makeopts or autoconfig.h were older than
makeopts.in or autoconfig.h.in. I believe this can create an issue if
makeopts is older than autoconfig.h.in or if autoconfig.h is older than
makeopts.in. The new rules compare files independently.
This patch does three things associated with the initial incoming INVITE
request URI.
1) Add access to the full initial incoming INVITE request URI.
2) We were not setting DNID on incoming PJSIP channels. The DNID is the
user portion of the initial incoming INVITE Request-URI. The value is
accessed by reading CALLERID(dnid).
3) Fix CHANNEL(pjsip,target_uri) documentation.
* The initial incoming INVITE request URI is now available using
CHANNEL(pjsip,request_uri).
* Set the DNID on PJSIP channel creation so CALLERID(dnid) can return the
initial incoming INVITE request URI user portion.
* CHANNEL(pjsip,target_uri) now correctly documents that the target URI is
the contact URI.
* Refactored print_escaped_uri() out of channel_read_pjsip() to handle
pjsip_uri_print() error condition when the buffer is too small.
Sean Bright [Thu, 7 Dec 2017 20:19:40 +0000 (15:19 -0500)]
astdb: Improve prefix searches in astdb
Using the LIKE operator requires a full table scan of 'astdb', whereas a
comparison operation is able to use the primary key index.
This patch adds a new function to the AstDB API for quick prefix matches
and updates res_sorcery_astdb to utilize it. This showed substantial
performance improvement in my test environment.
Related to ASTERISK~26806, but does not completely resolve it.
Corey Farrell [Sat, 9 Dec 2017 00:19:34 +0000 (19:19 -0500)]
loader: Refactor resource_name_match.
Optimize resource_name_match. This change eliminates use of
ast_strdupa, instead verifying that both basename's are the same length,
then using strncasecmp.
Sean Bright [Thu, 7 Dec 2017 15:52:39 +0000 (10:52 -0500)]
utils: Add convenience function for setting fd flags
There are many places in the code base where we ignore the return value
of fcntl() when getting/setting file descriptior flags. This patch
introduces a convenience function that allows setting or clearing file
descriptor flags and will also log an error on failure for later
analysis.
Corey Farrell [Fri, 8 Dec 2017 01:41:14 +0000 (20:41 -0500)]
res_stasis and res_speech: Fix load order.
res_stasis was missing AST_MODFLAG_LOAD_ORDER. Set res_stasis and
res_speech to start at (AST_MODPRI_APP_DEPEND - 1) so they are ready for
dependent modules.
Kevin Harwell [Fri, 8 Dec 2017 00:22:34 +0000 (18:22 -0600)]
pjsip_options: contacts sometimes not being updated on reload
For both dynamic and static contacts it was possible that potential AOR
changes were not being applied to all contacts. This was because the qualify
and schedule code was only retrieving AOR's, and contacts with frequencies
greater than zero.
For instance the following could happen: and AOR/contact has a frequency of 5,
it then gets set to 0, and then a reload occurs. All scheduled OPTIONS are
stopped, a list of AOR's is retrieved with frequency > 0, but none are
selected since in this scenario all are 0. The contact for the one previously
set to 5 though does not get updated, so it's status remains "AVAILABLE".
This patch makes it so all contacts (static and dynamic) are selected, and
appropriately updated if need be.
Kevin Harwell [Fri, 8 Dec 2017 00:18:00 +0000 (18:18 -0600)]
pjsip_options: dynamic contact's fields not updated on reload
Dynamic contacts were not being properly updated on reload. As a matter of
fact any changes to the AOR that a dynamic contact was associated with were
not being applied.
On reload, this patch makes it so for each dynamic contact, the associated
AOR is now retrieved and the AOR's fields are applied to the contact.
Corey Farrell [Thu, 7 Dec 2017 16:35:39 +0000 (11:35 -0500)]
CLI: Fix remote console completion.
Duplicate checking was done incorrectly when parsing completion options
from a remote console causing all options to be ignored as duplicates.
Once fixed I had to separate processing of the best match to ensure it
was not identified as a duplicate when it is the only match.
Corey Farrell [Wed, 6 Dec 2017 20:49:32 +0000 (15:49 -0500)]
sounds_index: Avoid repeatedly reindexing.
The sounds index is rebuilt each time a format is registered or
unregistered. This causes the index to be repeatedly rebuilt during
startup and shutdown.
This patch significantly reduces the work done by delaying sound index
initialization until after modules are loaded. This way a reindex only
occurs if a format module is loaded after startup. We also skip
reindexing when format modules are unloaded during shutdown.
Corey Farrell [Wed, 6 Dec 2017 18:42:55 +0000 (13:42 -0500)]
media_index: Improve startup.
This eliminates some wasteful operations in media_index startup.
* Replace statically set string-fields with char[0].
* Eliminate pointless RAII_VAR's.
* alloc_variant: Avoid pointless ao2_find on new info->variant.
* Stop trying find_variant before alloc_variant.
* process_media_file: replace ast_str with ast_asprintf. This avoids
reallocation of file_id_str.
Overall sounds_index.c is about 27% of Asterisk startup time when using
sample configs. This patch reduces it to 20%. This is a half-fix. The
real problem is that the media_index is regenerated repeatedly - 68
times in my test.
Richard Mudgett [Wed, 6 Dec 2017 00:04:47 +0000 (18:04 -0600)]
CDR: Fix deadlock setting some CDR values.
Setting channel variables with the AMI Originate action caused a deadlock
when you set CDR(amaflags) or CDR(accountcode). This path has the channel
locked when the CDR function is called. The CDR function then
synchronously passes the job to a stasis thread. The stasis handling
function then attempts to lock the channel. Deadlock results.
* Avoid deadlock by making the CDR function handle setting amaflags and
accountcode directly on the channel rather than passing it off to the CDR
processing code under a stasis thread to do it.
* Made the CHANNEL function and the CDR function process amaflags the same
way.
* Fixed referencing the wrong message type in cdr_prop_write().
Richard Mudgett [Wed, 6 Dec 2017 13:36:02 +0000 (07:36 -0600)]
bridge_basic.c: Update transfer diagnostic messages addendum.
* Added start DTMF transfer verbose messages.
* Made associated transfer messages use a similar message format.
* Adjusted message verbose level as requested by initial reporter.