<h4>chan_websocket: Fixed Ping/Pong messages hanging up the websocket channel</h4>
<p>Author: Joe Garlick
Date: 2026-01-15</p>
<p>When chan_websocket received a Ping or a Pong opcode it would cause the channel to hangup. This change allows Ping/Pong opcodes and allows them to silently pass</p>
<h4>cli.c: Allow 'channel request hangup' to accept patterns.</h4>
<p>Author: Sean Bright
Date: 2026-01-05</p>
<p>This extends 'channel request hangup' to accept multiple channel
names, a POSIX Extended Regular Expression, a glob-like pattern, or a
combination of all of them.</p>
<p>UserNote: The 'channel request hangup' CLI command now accepts
<h4>stasis/control.c: Add destructor to timeout_datastore.</h4>
<p>Author: George Joseph
Date: 2025-12-31</p>
<p>The timeout_datastore was missing a destructor resulting in a leak
of 16 bytes for every outgoing ARI call.</p>
<p>Resolves: #1681</p>
<h4>func_talkdetect.c: Remove reference to non-existent variables.</h4>
<p>Author: Sean Bright
Date: 2025-12-30</p>
<h4>configure.ac: use AC_PATH_TOOL for nm</h4>
<p>Author: Nathaniel Wesley Filardo
Date: 2025-11-27</p>
<p><code>nm</code> might, especially in cross-compilation scenarios, be available but prefixed with the target triple. So: use <code>AC_PATH_TOOL</code> rather than <code>AC_PATH_PROG</code> to find it. (See https://www.gnu.org/software/autoconf/manual/autoconf-2.68/html_node/Generic-Programs.html .)</p>
<p>Found and proposed fix tested by cross-compiling Asterisk using Nixpkgs on x86_64 targeting aarch64. :)</p>
<h4>res_pjsip_mwi: Fix off-nominal endpoint ao2 ref leak in mwi_get_notify_data</h4>
<p>Author: Alexei Gradinari
Date: 2025-12-29</p>
<p>Delay acquisition of the ast_sip_endpoint reference in mwi_get_notify_data()
to avoid an ao2 ref leak on early-return error paths.</p>
<p>Move ast_sip_subscription_get_endpoint() to just before first use so all
acquired references are properly cleaned up.</p>
<p>Fixes: #1675</p>
<h4>res_pjsip_messaging: Add support for following 3xx redirects</h4>
<p>Author: Maximilian Fridrich
Date: 2025-11-07</p>
<p>This commit integrates the redirect module into res_pjsip_messaging
to enable following 3xx redirect responses for outgoing SIP MESSAGEs.</p>
<p>When follow_redirect_methods contains 'message' on an endpoint, Asterisk
will now follow 3xx redirect responses for MESSAGEs, similar to how
it behaves for INVITE responses.</p>
<p>Resolves: #1576</p>
<p>UserNote: A new pjsip endpoint option follow_redirect_methods was added.
This option is a comma-delimited, case-insensitive list of SIP methods
for which SIP 3XX redirect responses are followed. An alembic upgrade
script has been added for adding this new option to the Asterisk
database.</p>
<h4>res_pjsip: Introduce redirect module for handling 3xx responses</h4>
<p>Author: Maximilian Fridrich
Date: 2025-11-07</p>
<p>This commit introduces a new redirect handling module that provides
infrastructure for following SIP 3xx redirect responses. The redirect
functionality respects the endpoint's redirect_method setting and only
follows redirects when set to 'uri_pjsip'. This infrastructure can be
used by any PJSIP module that needs to handle 3xx redirect responses.</p>
<h4>app_mixmonitor.c: Fix crash in mixmonitor_ds_remove_and_free when datastore is NULL</h4>
<p>Author: Tinet-mucw
Date: 2025-12-25</p>
<p>The datastore may be NULL, so a null pointer check needs to be added.</p>
<p>Resolves: #1673</p>
<h4>res_pjsip_refer: don't defer session termination for ari transfer</h4>
<p>Author: Sven Kube
Date: 2025-10-23</p>
<p>Allow session termination during an in progress ari handled transfer.</p>
<h4>chan_dahdi.conf.sample: Avoid warnings with default configs.</h4>
<p>Author: Naveen Albert
Date: 2025-10-23</p>
<p>callgroup and pickupgroup may only be specified for FXO-signaled channels;
however, the chan_dahdi sample config had these options uncommented in
the [channels] section, thus applying these settings to all channels,
resulting in warnings. Comment these out so there are no warnings with
an unmodified sample config.</p>
<p>Resolves: #1552</p>
<h4>main/dial.c: Set channel hangup cause on timeout in handle_timeout_trip</h4>
<p>Author: sarangr7
Date: 2025-12-18</p>
<p>When dial attempts timeout in the core dialing API, the channel's hangup
cause was not being set before hanging up. Only the ast_dial_channel
structure's internal cause field was updated, but the actual ast_channel
hangup cause remained unset.</p>
<p>This resulted in incorrect or missing hangup cause information being
reported through CDRs, AMI events, and other mechanisms that read the
channel's hangup cause when dial timeouts occurred via applications
using the dialing API (FollowMe, Page, etc.).</p>
<p>The fix adds proper channel locking and sets AST_CAUSE_NO_ANSWER on
the channel before calling ast_hangup(), ensuring consistent hangup
cause reporting across all interfaces.</p>
<p>Resolves: #1660</p>
<h4>cel: Add missing manager documentation.</h4>
<p>Author: Sean Bright
Date: 2025-12-12</p>
<p>The LOCAL_OPTIMIZE_BEGIN, STREAM_BEGIN, STREAM_END, and DTMF CEL
events were not all documented in the CEL configuration file or the
manager documentation for the CEL event.</p>
<h4>res_odbc: Use SQL_SUCCEEDED() macro where applicable.</h4>
<p>Author: Sean Bright
Date: 2025-12-17</p>
<p>This is just a cleanup of some repetitive code.</p>
<h4>rtp/rtcp: Configure dual-stack behavior via IPV6_V6ONLY</h4>
<p>Author: Justin T. Gibbs
Date: 2025-12-21</p>
<p>Dual-stack behavior (simultaneous listening for IPV4 and IPV6
connections on a single socket) is required by Asterisk's ICE
implementation. On systems with the IPV6_V6ONLY sockopt, set
the option to 0 (dual-stack enabled) when binding to the IPV6
any address. This ensures correct behavior regardless of the
system's default dual-stack configuration.</p>
<h4>http.c: Include remote address in URI handler message.</h4>
<p>Author: Sean Bright
Date: 2025-12-22</p>
<p>Resolves: #1662</p>
<h4>pjsip: Move from threadpool to taskpool</h4>
<p>Author: Joshua C. Colp
Date: 2025-12-04</p>
<p>This change moves the PJSIP module from the threadpool API
to the taskpool API. PJSIP-specific implementations for
task usage have been removed and replaced with calls to
the optimized taskpool implementations instead. The need
for a pool of serializers has also been removed as
taskpool inherently provides this. The default settings
have also been changed to be more realistic for common
usage.</p>
<p>UpgradeNote: The threadpool_* options in pjsip.conf have now
been deprecated though they continue to be read and used.
They have been replaced with taskpool options that give greater
control over the underlying taskpool used for PJSIP. An alembic
upgrade script has been added to add these options to realtime
as well.</p>
<h4>Disable device state caching for ephemeral channels</h4>
<p>Author: phoneben
Date: 2025-12-09</p>
<p>chan_audiosocket/chan_rtp/res_stasis_snoop: Disable device state caching for ephemeral channels</p>
<p>Resolves: #1638</p>
<h4>chan_websocket: Add locking in send_event and check for NULL websocket handle.</h4>
<p>Author: George Joseph
Date: 2025-12-10</p>
<p>On an outbound websocket connection, when the triggering caller hangs up,
webchan_hangup() closes the outbound websocket session and sets the websocket
session handle to NULL. If the hangup happened in the tiny window between
opening the outbound websocket connection and before read_thread_handler()
was able to send the MEDIA_START message, it could segfault because the
websocket session handle was NULL. If it didn't actually segfault, there was
also the possibility that the websocket instance wouldn't get cleaned up which
could also cause the channel snapshot to not get cleaned up. That could
cause memory leaks and <code>core show channels</code> to list phantom WebSocket
channels.</p>
<p>To prevent the race, the send_event() macro now locks the websocket_pvt
instance and checks the websocket session handle before attempting to send
the MEDIA_START message.</p>
<p>Resolves: #1643
Resolves: #1645</p>
<h4>Fix false null-deref warning in channel_state</h4>
<p>Author: phoneben
Date: 2025-12-08</p>
<p>Resolve analyzer warning in channel_state by checking AST_FLAG_DEAD on snapshot, which is guaranteed non-NULL.</p>
<p>Resolves: #1430</p>
<h4>endpoint.c: Plug a memory leak in ast_endpoint_shutdown().</h4>
<p>Author: George Joseph
Date: 2025-12-08</p>
<p>Commit 26795be introduced a memory leak of ast_endpoint when
ast_endpoint_shutdown() was called. The leak occurs only if a configuration
change removes an endpoint and isn't related to call volume or the length of
time asterisk has been running. An ao2_ref(-1) has been added to
ast_endpoint_shutdown() to plug the leak.</p>
<p>Resolves: #1635</p>
<h4>Revert "func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()"</h4>
<h4>configs: rename phoneprov_users.conf to .sample so make installs it</h4>
<p>Author: Paul Donald
Date: 2025-12-03</p>
<p>This conf file should be suffixed .sample so that make installs it
at compile time. Otherwise res_phoneprov complains at runtime as to
its absence and refuses to start.</p>
<p>Fixes: #1626</p>
<h4>cel_manager.c: Correct manager event mask for CEL events.</h4>
<p>Author: Sean Bright
Date: 2025-12-05</p>
<p>There is no EVENT_FLAG_CEL and these events are raised with as
EVENT_FLAG_CALL.</p>
<h4>app_queue.c: Update docs to correct QueueMemberPause event name.</h4>
<p>Author: Sean Bright
Date: 2025-12-04</p>
<h4>taskprocessors: Improve logging and add new cli options</h4>
<p>Author: Mike Bradeen
Date: 2025-10-28</p>
<p>This change makes some small changes to improve log readability in
addition to the following changes:</p>
<p>Modified 'core show taskprocessors' to now show Low time and High time
for task execution.</p>
<p>New command 'core show taskprocessor name <taskprocessor-name>' to dump
taskprocessor info and current queue.</p>
<p>Addionally, a new test was added to demonstrate the 'show taskprocessor
name' functionality:
test execute category /main/taskprocessor/ name taskprocessor_cli_show</p>
<p>Setting 'core set debug 3 taskprocessor.c' will now log pushed tasks.
(Warning this is will cause extremely high levels of logging at even
low traffic levels.)</p>
<p>Resolves: #1566</p>
<p>UserNote: New CLI command has been added -
core show taskprocessor name <taskprocessor-name></p>
<h4>manager: fix double free of criteria variable when adding filter</h4>
<p>Author: Michal Hajek
Date: 2025-10-13</p>
<p>Signed-off-by: Michal Hajek <ahref="mailto:michal.hajek@daktela.com">michal.hajek@daktela.com</a></p>
<p>Fixes: #1531</p>
<h4>app_stream_echo.c: Check that stream is non-NULL before dereferencing.</h4>
<p>Author: Sean Bright
Date: 2025-12-01</p>
<p>Also re-order and rename the arguments of <code>stream_echo_write_error</code> to
match those of <code>ast_write_stream</code> for consistency.</p>
<p>Resolves: #1427</p>
<h4>abstract_jb.c: Remove redundant timer check per static analysis.</h4>
<p>Author: Sean Bright
Date: 2025-12-01</p>
<p>While this check is technically unnecessary, it also was not harmful.</p>
<p>The 2 other items mentioned in the linked issue are false positives
and require no action.</p>
<p>Resolves: #1417</p>
<h4>channelstorage_cpp: Fix fallback return value in channelstorage callback</h4>
<p>Author: phoneben
Date: 2025-11-26</p>
<p>callback returned the last iterated channel when no match existed, causing invalid channel references and potential double frees. Updated to correctly return NULL when there is no match.</p>
<p>Resolves: #1609</p>
<h4>ccss: Add option to ccss.conf to globally disable it.</h4>
<p>Author: George Joseph
Date: 2025-11-19</p>
<p>The Call Completion Supplementary Service feature is rarely used but many of
it's functions are called by app_dial and channel.c "just in case". These
functions lock and unlock the channel just to see if CCSS is enabled on it,
which it isn't 99.99% of the time.</p>
<p>UserNote: A new "enabled" parameter has been added to ccss.conf. It defaults
to "yes" to preserve backwards compatibility but CCSS is rarely used so
setting "enabled = no" in the "general" section can save some unneeded channel
locking operations and log message spam. Disabling ccss will also prevent
the func_callcompletion and chan_dahdi modules from loading.</p>
<p>DeveloperNote: A new API ast_is_cc_enabled() has been added. It should be
used to ensure that CCSS is enabled before making any other ast_cc_* calls.</p>
<h4>app_directed_pickup.c: Change some log messages from NOTICE to VERBOSE.</h4>
<p>Author: George Joseph
Date: 2025-11-20</p>
<p>UpgradeNote: In an effort to reduce log spam, two normal progress
"pickup attempted" log messages from app_directed_pickup have been changed
from NOTICE to VERBOSE(3). This puts them on par with other normal
dialplan progress messages.</p>
<h4>chan_websocket: Fix crash on DTMF_END event.</h4>
<p>Author: Sean Bright
Date: 2025-11-20</p>
<p>Resolves: #1604</p>
<h4>chan_websocket.c: Tolerate other frame types</h4>
<p>Author: Joe Garlick
Date: 2025-11-12</p>
<p>Currently, if chan_websocket receives an un supported frame like comfort noise it will exit the websocket. The proposed change is to tolerate the other frames by not sending them down the websocket but instead just ignoring them.</p>
<p>Resolves: #1587</p>
<h4>app_reload: Fix Reload() without arguments.</h4>
<p>Author: Naveen Albert
Date: 2025-11-17</p>
<p>Calling Reload() without any arguments is supposed to reload
everything (equivalent to a 'core reload'), but actually does
nothing. This is because it was calling ast_module_reload with
an empty string, and the argument needs to explicitly be NULL.</p>
<p>Resolves: #1597</p>
<h4>pbx.c: Print new context count when reloading dialplan.</h4>
<p>Author: Naveen Albert
Date: 2025-11-17</p>
<p>When running "dialplan reload", the number of contexts reported
is initially wrong, as it is the old context count. Running
"dialplan reload" a second time returns the correct number of
contexts that are loaded. This can confuse users into thinking
that the reload didn't work successfully the first time.</p>
<p>This counter is currently only incremented when iterating the
old contexts prior to the context merge; at the very end, get
the current number of elements in the context hash table and
report that instead. This way, the count is correct immediately
whenever a reload occurs.</p>
<p>Resolves: #1599</p>
<h4>Makefile: Add module-list-* targets.</h4>
<p>Author: C. Maj
Date: 2025-11-17</p>
<p>Convenience wrappers for showing modules at various support levels.</p>
<ul>
<li>module-list-core</li>
<li>module-list-extended</li>
<li>module-list-deprecated</li>
</ul>
<p>Resolves: #1572</p>
<p>UserNote: Try "make module-list-deprecated" to see what modules
are on their way out the door.</p>
<h4>app_disa: Avoid use of removed ResetCDR() option.</h4>
<p>Author: Naveen Albert
Date: 2025-11-14</p>
<p>Commit a46d5f9b760f84b9f27f594b62507c1443aa661b removed the deprecated
'e' option to ResetCDR; this now causes DISA() to emit a warning
if attempting to call ResetCDR() with the deprecated option (in
all cases except when the no answer option is provided). Rewrite
the code to do this the current way.</p>
<p>Resolves: #1592</p>
<h4>core_unreal.c: Use ast instead of p->chan to get the DIALSTATUS variable</h4>
<p>Author: Tinet-mucw
Date: 2025-11-13</p>
<p>After p->chan = NULL, ast still points to the valid channel object,
using ast safely accesses the channel's DIALSTATUS variable before it's fully destroyed</p>
<p>Resolves: #1590</p>
<h4>ast_coredumper: Fix multiple issues</h4>
<p>Author: George Joseph
Date: 2025-11-07</p>
<ul>
<li>
<p>Fixed an issue with tarball-coredumps when asterisk was invoked without an
absolute path.</p>
</li>
<li>
<p>Fixed an issue with gdb itself segfaulting when trying to get symbols from
separate debuginfo files. The command line arguments needed to be altered
such that the gdbinit files is loaded before anything else but the
<code>dump-asterisk</code> command is run after full initialization.</p>
</li>
</ul>
<p>In the embedded gdbinit script:</p>
<ul>
<li>
<p>The extract_string_symbol function needed a <code>char *</code> cast to work properly.</p>
</li>
<li>
<p>The s_strip function needed to be updated to continue to work with the
cpp_map_name_id channel storage backend.</p>
</li>
<li>
<p>A new function was added to dump the channels when cpp_map_name_id was
used.</p>
</li>
<li>
<p>The Channel object was updated to account for the new channel storage
backends</p>
</li>
<li>
<p>The show_locks function was refactored to work correctly.</p>
</li>
</ul>
<h4>app_mixmonitor: Add 's' (skip) option to delay recording.</h4>
<p>Author: Daouda Taha
Date: 2025-10-28</p>
<p>The 's' (skip) option delays MixMonitor recording until the specified number of seconds
(can be fractional) have elapsed since MixMonitor was invoked.</p>
<p>No audio is written to the recording file during this time. If the call ends before this
period, no audio will be saved. This is useful for avoiding early audio such as
announcements, ringback tones, or other non-essential sounds.</p>
<p>UserNote: This change introduces a new 's(<seconds>)' (skip) option to the MixMonitor
application. Example:
MixMonitor(${UNIQUEID}.wav,s(3))</p>
<p>This skips recording for the first 3 seconds before writing audio to the file.
Existing MixMonitor behavior remains unchanged when the 's' option is not used.</p>
<h4>stasis: switch stasis show topics temporary container from list - RBtree</h4>
<p>Author: phoneben
Date: 2025-11-11</p>
<p>switch stasis show topics temporary container from list to RB-tree
minimizing lock time</p>
<p>Resolves: #1585</p>
<h4>app_dtmfstore: Avoid a potential buffer overflow.</h4>
<p>Author: Sean Bright
Date: 2025-11-07</p>
<p>Prefer snprintf() so we can readily detect if our output was
truncated.</p>
<p>Resolves: #1421</p>
<h4>main: Explicitly mark case statement fallthrough as such.</h4>
<p>Author: Sean Bright
Date: 2025-11-07</p>
<p>Resolves: #1442</p>
<h4>bridge_softmix: Return early on topology allocation failure.</h4>
<p>Author: Sean Bright
Date: 2025-11-07</p>
<p>Resolves: #1446</p>
<h4>bridge_simple: Increase code verbosity for clarity.</h4>
<p>Author: Sean Bright
Date: 2025-11-07</p>
<p>There's no actual problem here, but I can see how it might by
confusing.</p>
<p>Resolves: #1444</p>
<h4>app_queue.c: Only announce to head caller if announce_to_first_user</h4>
<p>Author: Kristian F. Høgh
Date: 2025-10-30</p>
<p>Only make announcements to head caller if announce_to_first_user is true</p>
<p>Fixes: #1568</p>
<p>UserNote: When announce_to_first_user is false, no announcements are played to the head caller</p>
<h4>chan_websocket: Add ability to place a MARK in the media stream.</h4>
<p>Author: George Joseph
Date: 2025-11-05</p>
<p>Also cleaned up a few unused #if blocks, and started sending a few ERROR
events back to the apps.</p>
<p>Resolves: #1574</p>
<p>DeveloperNote: Apps can now send a <code>MARK_MEDIA</code> command with an optional
<code>correlation_id</code> parameter to chan_websocket which will be placed in the
media frame queue. When that frame is dequeued after all intervening media
has been played to the core, chan_websocket will send a
<code>MEDIA_MARK_PROCESSED</code> event to the app with the same correlation_id
(if any).</p>
<h4>chan_websocket: Add capability for JSON control messages and events.</h4>
<p>Author: George Joseph
Date: 2025-10-22</p>
<p>With recent enhancements to chan_websocket, the original plain-text
implementation of control messages and events is now too limiting. We
probably should have used JSON initially but better late than never. Going
forward, enhancements that require control message or event changes will
only be done to the JSON variants and the plain-text variants are now
deprecated but not yet removed.</p>
<ul>
<li>
<p>Added the chan_websocket.conf config file that allows setting which control
message format to use globally: "json" or "plain-text". "plain-text" is the
default for now to preserve existing behavior.</p>
</li>
<li>
<p>Added a dialstring option <code>f(json|plain-text)</code> to allow the format to be
overridden on a call-by-call basis. Again, 'plain-text' is the default for
now to preserve existing behavior.</p>
</li>
</ul>
<p>The JSON for commands sent by the app to Asterisk must be...
<code>{ "command": "<command>" ... }</code> where <code><command></code> is one of <code>ANSWER</code>, <code>HANGUP</code>,
<code>START_MEDIA_BUFFERING</code>, etc. The <code>STOP_MEDIA_BUFFERING</code> command takes an
additional, optional parameter to be returned in the corresponding