Change Log for Release asterisk-23.0.0-rc1

Links:

Summary:

User Notes:

Upgrade Notes:

Developer Notes:

Commit Authors:

Issue and Commit Detail:

Closed Issues:

Commits By Author:

Commit List:

Commit Details:

Prepare for Asterisk 23

Author: Mike Bradeen Date: 2024-08-14

config.c Make ast_variable_update update last match.

Author: Naveen Albert Date: 2024-10-23

ast_variable_update currently sets the first match for a variable, as opposed to the last one. This issue is complementary to that raised in #244.

This is incorrect and results in the wrong (or no) action being taken in cases where a section inherits from a template section. When the traversal occurs to update the setting, the existing code erroneously would use the first of possibly multiple matches in its update logic, which is wrong. Now, explicitly use the last match in the traversal, which will ensure that the actual setting is updated properly, and not skipped or ignored because a template from which the setting's section inherits was used for comparison.

Resolves: #960

UpgradeNote: Config variables, when set/updated, such as via AMI, will now have the corresponding setting updated, even if their sections inherit from template sections.

config.c: Make ast_variable_retrieve return last match.

Author: Naveen Albert Date: 2023-08-09

ast_variable_retrieve currently returns the first match for a variable, as opposed to the last one. This is problematic because modules that load config settings by explicitly calling ast_variable_retrieve on a variable name (as opposed to iterating through all the directives as specified) will end up taking the first specified value, such as the default value from the template rather than the actual effective value in an individual config section, leading to the wrong config.

This fixes this by making ast_variable_retrieve return the last match, or the most recently overridden one, as the effective setting. This is similar to what the -1 index in the AST_CONFIG function does.

There is another function, ast_variable_find_last_in_list, that does something similar. However, it's a slightly different API, and it sees virtually no usage in Asterisk. ast_variable_retrieve is what most things use so this is currently the relevant point of breakage.

In practice, this is unlikely to cause any breakage, since there would be no logical reason to use an inherited value rather than an explicitly overridden value when loading a config.

ASTERISK-30370 #close

Resolves: #244

UpgradeNote: Config variables retrieved explicitly by name now return the most recently overriding value as opposed to the base value (e.g. from a template). This is equivalent to retrieving a config setting using the -1 index to the AST_CONFIG function. The major implication of this is that modules processing configs by explicitly retrieving variables by name will now get the effective value of a variable as overridden in a config rather than the first-set value (from a template), which is consistent with how other modules load config settings.

utils: Remove libdb and astdb conversion scripts.

Author: Sean Bright Date: 2025-01-29

These were included with Asterisk 10 when we switched astdb from libdb to sqlite3.

config.c: Fix inconsistent pointer logic in ast_variable_update.

Author: Naveen Albert Date: 2025-03-06

Commit 3cab4e7ab4a3ae483430d5f5e8fa167d02a8128c introduced a regression by causing the wrong pointers to be used in certain (more complex) cases. We now take care to ensure the exact same pointers are used as before that commit, and simplify by eliminating the unnecessary second for loop.

Resolves: #1147

channel: Deprecate ast_moh_cleanup(...).

Author: Sean Bright Date: 2025-04-08

We don't want anyone calling it but the channel destructor.

func_callerid: Always format ANI2 as two digits.

Author: Naveen Albert Date: 2025-04-26

ANI II is always supposed to be formatted as two digits, so zero pad when formatting it if necessary.

Resolves: #1222

users.conf: Remove deprecated users.conf integration.

Author: Naveen Albert Date: 2025-07-09

users.conf was deprecated in Asterisk 21 and is now being removed for Asterisk 23, in accordance with the Asterisk deprecation policy.

This consists of: * Removing integration with app_directory, app_voicemail, chan_dahdi, chan_iax2, and AMI. * users.conf was also partially used for res_phoneprov, and this remaining functionality is consolidated to a separate phoneprov_users.conf, used only by res_phoneprov.

Resolves: #1292

UpgradeNote: users.conf has been removed and all channel drivers must be configured using their specific configuration files. The functionality previously in users.conf for res_phoneprov is now in phoneprov_users.conf.

res_agi: Remove deprecated DeadAGI application.

Author: Naveen Albert Date: 2023-08-11

DeadAGI was deprecated 7 years ago, in Asterisk 15, as it duplicates functionality in the AGI app. This removes the application.

Resolves: #258

UpgradeNote: The DeadAGI application, which was deprecated in Asterisk 15, has now been removed. The same functionality is available in the AGI app.

res_musiconhold: Remove options that were deprecated in Asterisk 14.

Author: Naveen Albert Date: 2025-07-09

Commit 9c1f34c7e904b26bb550f426020635894cb805ac added dedicated options for random sorting functionality and deprecated older options that now duplicated these capabilities. Remove these deprecated options.

Resolves: #1296

UpgradeNote: The deprecated random and application=r options have been removed; use sort=random instead.

app_voicemail: Remove deprecated options.

Author: Naveen Albert Date: 2025-07-10

Remove the deprecated maxmessage and minmessage options, which have been superseded by maxsecs and minsecs since 1.6. Also remove the deprecated 'cz' language option (deprecated since 1.8.)

Resolves: #1298

UpgradeNote: The deprecated maxmessage and minmessage options have been removed; use maxsecs and minsecs instead. The deprecated 'cz' language has also been removed; use 'cs' instead.

app_queue: Remove redundant/deprecated function.

Author: Naveen Albert Date: 2025-08-07

QUEUE_MEMBER_COUNT has been deprecated since at least 1.6, for fully duplicating functionality available in the QUEUE_MEMBER function; remove it now.

Resolves: #1341

UpgradeNote: The deprecated QUEUE_MEMBER_COUNT function has been removed; use QUEUE_MEMBER(,logged) instead.

cli.c: Remove deprecated and redundant CLI command.

Author: Naveen Albert Date: 2025-08-07

The "no debug channel" command has been deprecated since 1.6 (commit 691363656fbdc83edf04b125317aebae6525c9e7), as it is replaced by "core set debug channel", which also supports tab-completion on channels. Remove the redundant command.

Resolves: #1343

UpgradeNote: The deprecated "no debug channel" command has now been removed; use "core set debug channel" instead.

logger.c: Remove deprecated/redundant configuration option.

Author: Naveen Albert Date: 2025-08-07

Remove the deprecated 'rotatetimestamp' config option, as this was deprecated by 'rotatestrategy' in 1.6 by commit f5a14167f3ef090f8576da3070ed5c452fa01e44.

Resolves: #1345

UpgradeNote: The deprecated rotatetimestamp option has been removed. Use rotatestrategy instead.

func_dialplan: Remove deprecated/redundant function.

Author: Naveen Albert Date: 2025-08-07

Remove VALID_EXTEN, which was deprecated/superseded by DIALPLAN_EXISTS in Asterisk 11 (commit 8017b65bb97c4226ca7a3c7c944a9811484e0305), as DIALPLAN_EXISTS does the same thing and is more flexible.

Resolves: #1347

UpgradeNote: The deprecated VALID_EXTEN function has been removed. Use DIALPLAN_EXISTS instead.

Update version for Asterisk 23

Author: Ben Ford Date: 2025-08-13

chan_websocket.c: Add DTMF messages

Author: Joe Garlick Date: 2025-09-04

Added DTMF messages to the chan_websocket feature.

When a user presses DTMF during a call over chan_websocket it will send a message like: "DTMF_END digit:1"

Resolves: https://github.com/asterisk/asterisk-feature-requests/issues/70

app_queue.c: Add new global 'log_unpause_on_reason_change'

Author: Igor Goncharovsky Date: 2025-09-02

In many asterisk-based systems, the pause reason is used to separate pauses by type,and logically, changing the reason defines two intervals that should be accounted for separately. The introduction of a new option allows me to separate the intervals of operator inactivity in the log by the event of unpausing.

UserNote: Add new global option 'log_unpause_on_reason_change' that is default disabled. When enabled cause addition of UNPAUSE event on every re-PAUSE with reason changed.

app_waitforsilence.c: Use milliseconds to calculate timeout time

Author: Igor Goncharovsky Date: 2025-09-04

The functions WaitForNoise() and WaitForSilence() use the time() functions to calculate elapsed time, which causes the timer to fire on a whole second boundary, and the actual function execution time to fire the timer may be 1 second less than expected. This fix replaces time() with ast_tvnow().

Fixes: #1401

res_rtp_asterisk: Don't send RTP before DTLS has negotiated.

Author: Ben Ford Date: 2025-08-04

There was no check in __rtp_sendto that prevented Asterisk from sending RTP before DTLS had finished negotiating. This patch adds logic to do so.

Fixes: #1260

Fix missing ast_test_flag64 in extconf.c

Author: Artem Umerov Date: 2025-08-29

Fix missing ast_test_flag64 after https://github.com/asterisk/asterisk/commit/43bf8a4ded7a65203b766b91eaf8331a600e9d8d

pbx_builtins: Allow custom tone for WaitExten.

Author: Naveen Albert Date: 2025-08-25

Currently, the 'd' option will play dial tone while waiting for digits. Allow it to accept an argument for any tone from indications.conf.

Resolves: #1396

UserNote: The tone used while waiting for digits in WaitExten can now be overridden by specifying an argument for the 'd' option.

res_tonedetect: Add option for TONE_DETECT detection to auto stop.

Author: Naveen Albert Date: 2025-08-22

One of the problems with TONE_DETECT as it was originally written is that if a tone is detected multiple times, it can trigger the redirect logic multiple times as well. For example, if we do an async goto in the dialplan after detecting a tone, because the detector is still active until explicitly disabled, if we detect the tone again, we will branch again and start executing that dialplan a second time. This is rarely ever desired behavior, and can happen if the detector is not removed quickly enough.

Add a new option, 'e', which automatically disables the detector once the desired number of matches have been heard. This eliminates the potential race condition where previously the detector would need to be disabled immediately, but doing so quickly enough was not guaranteed. This also allows match criteria to be retained longer if needed, so the detector does not need to be destroyed prematurely.

Resolves: #1390

UserNote: The 'e' option for TONE_DETECT now allows detection to be disabled automatically once the desired number of matches have been fulfilled, which can help prevent race conditions in the dialplan, since TONE_DETECT does not need to be disabled after a hit.

app_queue: fix comparison for announce-position-only-up

Author: Stuart Henderson Date: 2025-08-21

Numerically comparing that the current queue position is less than last_pos_said can only be done after at least one announcement has been made, otherwise last_pos_said is at the default (0).

Fixes: #1386

res_pjsip_authenticator_digest: Fix SEGV if get_authorization_hdr returns NULL.

Author: George Joseph Date: 2025-08-28

In the highly-unlikely event that get_authorization_hdr() couldn't find an Authorization header in a request, trying to get the digest algorithm would cauase a SEGV. We now check that we have an auth header that matches the realm before trying to get the algorithm from it.

Resolves: #GHSA-64qc-9x89-rx5j

sorcery: Prevent duplicate objects and ensure missing objects are created on u..

Author: Alexei Gradinari Date: 2025-07-07

This patch resolves two issues in Sorcery objectset handling with multiple backends:

  1. Prevent duplicate objects: When an object exists in more than one backend (e.g., a contact in both 'astdb' and 'realtime'), the objectset previously returned multiple instances of the same logical object. This caused logic failures in components like the PJSIP registrar, where duplicate contact entries led to overcounting and incorrect deletions, when max_contacts=1 and remove_existing=yes.

    This patch ensures only one instance of an object with a given key is added to the objectset, avoiding these duplicate-related side effects.

  2. Ensure missing objects are created: When using multiple writable backends, a temporary backend failure can lead to objects missing permanently from that backend. Currently, .update() silently fails if the object is not present, and no .create() is attempted. This results in inconsistent state across backends (e.g. astdb vs. realtime).

    This patch introduces a new global option in sorcery.conf: [general] update_or_create_on_update_miss = yes|no

    Default: no (preserves existing behavior).

    When enabled: if .update() fails with no data found, .create() is attempted in that backend. This ensures that objects missing due to temporary backend outages are re-synchronized once the backend is available again.

    Added a new CLI command: sorcery show settings Displays global Sorcery settings, including the current value of update_or_create_on_update_miss.

    Updated tests to validate both flag enabled/disabled behavior.

Fixes: #1289

UserNote: Users relying on Sorcery multiple writable backends configurations (e.g., astdb + realtime) may now enable update_or_create_on_update_miss = yes in sorcery.conf to ensure missing objects are recreated after temporary backend failures. Default behavior remains unchanged unless explicitly enabled.

sig_analog: Skip Caller ID spill if usecallerid=no.

Author: Naveen Albert Date: 2025-08-25

If Caller ID is disabled for an FXS port, then we should not send any Caller ID spill on the line, as we have no Caller ID information that we can/should be sending.

Resolves: #1394

chan_dahdi: Fix erroneously persistent dialmode.

Author: Naveen Albert Date: 2025-08-18

It is possible to modify the dialmode setting in the chan_dahdi/sig_analog private using the CHANNEL function, to modify it during calls. However, it was not being reset between calls, meaning that if, for example, tone dialing was disabled, it would never work again unless explicitly enabled.

This fixes the setting by pairing it with a "perm" version of the setting, as a few other features have, so that it can be reset to the permanent setting between calls. The documentation is also clarified to explain the interaction of this setting and the digitdetect setting more clearly.

Resolves: #1378

chan_websocket: Allow additional URI parameters to be added to the outgoing URI.

Author: George Joseph Date: 2025-08-13

Resolves: #1352

UserNote: A new WebSocket channel driver option v has been added to the Dial application that allows you to specify additional URI parameters on outgoing connections. Run core show application Dial from the Asterisk CLI to see how to use it.

chan_websocket: Fix buffer overrun when processing TEXT websocket frames.

Author: George Joseph Date: 2025-08-19

ast_websocket_read() receives data into a fixed 64K buffer then continually reallocates a final buffer that, after all continuation frames have been received, is the exact length of the data received and returns that to the caller. process_text_message() in chan_websocket was attempting to set a NULL terminator on the received payload assuming the payload buffer it received was the large 64K buffer. The assumption was incorrect so when it tried to set a NULL terminator on the payload, it could, depending on the state of the heap at the time, cause heap corruption.

process_text_message() now allocates its own payload_len + 1 sized buffer, copies the payload received from ast_websocket_read() into it then NULL terminates it prevent the possibility of the overrun and corruption.

Resolves: #1384

sig_analog: Fix SEGV due to calling strcmp on NULL.

Author: Naveen Albert Date: 2025-08-18

Add an additional check to guard against the channel application being NULL.

Resolves: #1380

ARI: Add command to indicate progress to a channel

Author: Sven Kube Date: 2025-07-30

Adds an ARI command to send a progress indication to a channel.

DeveloperNote: A new ARI endpoint is available at /channels/{channelId}/progress to indicate progress to a channel.

dsp.c: Improve debug logging in tone_detect().

Author: Naveen Albert Date: 2025-08-15

The debug logging during DSP processing has always been kind of overwhelming and annoying to troubleshoot. Simplify and improve the logging in a few ways to aid DSP debugging:

Resolves: #1375

res_stasis_device_state: Fix delete ARI Devicestates after asterisk restart.

Author: Jose Lopes Date: 2025-07-30

After an asterisk restart, the deletion of ARI Devicestates didn't return error, but the devicestate was not deleted. Found a typo on populate_cache function that created wrong cache for device states. This bug caused wrong assumption that devicestate didn't exist, since it was not in cache, so deletion didn't returned error.

Fixes: #1327

app_chanspy: Add option to not automatically answer channel.

Author: Naveen Albert Date: 2025-08-13

Add an option for ChanSpy and ExtenSpy to not answer the channel automatically. Most applications that auto-answer by default already have an option to disable this behavior if unwanted.

Resolves: #1358

UserNote: ChanSpy and ExtenSpy can now be configured to not automatically answer the channel by using the 'N' option.

xmldoc.c: Fix rendering of CLI output.

Author: George Joseph Date: 2025-08-14

If you do a core show application Dial, you'll see it's kind of a mess. Indents are wrong is some places, examples are printed in black which makes them invisible on most terminals, and the lack of line breaks in some cases makes it hard to follow.

Example from Dial before fixes: ``` Example: Dial 555-1212 on first available channel in group 1, searching from highest to lowest

  Example: Ringing FXS channel 4 with ring cadence 2

  Example: Dial 555-1212 on channel 3 and require answer confirmation

...

  O([mode]):
      mode - With <mode> either not specified or set to '1', the originator
      hanging up will cause the phone to ring back immediately.

After: ``` Example: Dial 555-1212 on first available channel in group 1, searching from highest to lowest

   same => n,Dial(DAHDI/g1/5551212)

  Example: Ringing FXS channel 4 with ring cadence 2

   same => n,Dial(DAHDI/4r2)

  Example: Dial 555-1212 on channel 3 and require answer confirmation

   same => n,Dial(DAHDI/3c/5551212)

...

  O([mode]):
      mode - With <mode> either not specified or set to '1', the originator
      hanging up will cause the phone to ring back immediately.
      With <mode> set to '2', when the operator flashes the trunk, it will
      ring their phone back.
      Enables *operator services* mode.  This option only works when bridging
      a DAHDI channel to another DAHDI channel only. If specified on
      non-DAHDI interfaces, it will be ignored. When the destination answers
      (presumably an operator services station), the originator no longer has
      control of their line. They may hang up, but the switch will not
      release their line until the destination party (the operator) hangs up.

  p:
      This option enables screening mode. This is basically Privacy mode
      without memory.

```

There are still things we can do to make this more readable but this is a start.

func_frame_drop: Add debug messages for dropped frames.

Author: Naveen Albert Date: 2025-08-14

Add debug messages in scenarios where frames that are usually processed are dropped or skipped.

Resolves: #1371

test_res_prometheus: Fix compilation failure on Debian 13.

Author: Naveen Albert Date: 2025-08-14

curl_easy_setopt expects long types, so be explicit.

Resolves: #1369

func_frame_drop: Handle allocation failure properly.

Author: Naveen Albert Date: 2025-08-14

Handle allocation failure and simplify the allocation using asprintf.

Resolves: #1366

pbx_lua.c: segfault when pass null data to term_color function

Author: Alexey Khabulyak Date: 2025-08-14

This can be reproduced under certain curcomstences. For example: call app.playback from lua with invalid data: app.playback({}). pbx_lua.c will try to get data for this playback using lua_tostring function. This function returs NULL for everything but strings and numbers. Then, it calls term_color with NULL data. term_color function can call(if we don't use vt100 compat term) ast_copy_string with NULL inbuf which cause segfault. bt example: ast_copy_string (size=8192, src=0x0, dst=0x7fe44b4be8b0) at /usr/src/asterisk/asterisk-20.11.0/include/asterisk/strings.h:412

Resolves: https://github.com/asterisk/asterisk/issues/1363

bridge.c: Obey BRIDGE_NOANSWER variable to skip answering channel.

Author: Naveen Albert Date: 2025-08-14

If the BRIDGE_NOANSWER variable is set on a channel, it is not supposed to answer when another channel bridges to it using Bridge(), and this is checked when ast_bridge_call* is called. However, another path exists (bridge_exec -> ast_bridge_add_channel) where this variable was not checked and channels would be answered. We now check the variable there.

Resolves: #401 Resolves: #1364