Skip to content

Commit

Permalink
res_pjsip_pubsub: Prevent removing subscriptions.
Browse files Browse the repository at this point in the history
pjproject does not provide any mechanism of removing
event packages, which means that once a subscription
handler is registered, it is effectively permanent.

pjproject will assert if the same event package is
ever registered again, so currently unloading and
loading any Asterisk modules that use subscriptions
will cause a crash that is beyond our control.

For that reason, we now prevent users from being
able to unload these modules, to prevent them
from ever being loaded twice.

ASTERISK-30264 #close

Change-Id: I7fdcb1a5e44d38b7ba10c44259fe98f0ae9bc12c
  • Loading branch information
InterLinked1 authored and gtjoseph committed Oct 26, 2022
1 parent 0825d26 commit f66f77f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
13 changes: 13 additions & 0 deletions res/res_pjsip_exten_state.c
Expand Up @@ -973,6 +973,7 @@ static int publisher_stop(struct ast_sip_outbound_publish_client *client)

static int unload_module(void)
{
#if 0
ast_sip_unregister_event_publisher_handler(&dialog_publisher);
ast_sip_unregister_subscription_handler(&dialog_handler);
ast_sip_unregister_event_publisher_handler(&presence_publisher);
Expand All @@ -987,6 +988,18 @@ static int unload_module(void)
publishers = NULL;

return 0;
#else
/* If we were allowed to unload, the above is what we would do.
* pjsip_evsub_register_pkg is called by ast_sip_register_subscription_handler
* but there is no corresponding unregister function, so unloading
* a module does not remove the event package. If this module is ever
* loaded again, then pjproject will assert and cause a crash.
* For that reason, we must not be allowed to unload, but if
* a pjsip_evsub_unregister_pkg API is added in the future
* then we should go back to unloading the module as intended.
*/
return -1;
#endif
}

static int load_module(void)
Expand Down
13 changes: 13 additions & 0 deletions res/res_pjsip_mwi.c
Expand Up @@ -1524,6 +1524,7 @@ static int reload(void)

static int unload_module(void)
{
#if 0
struct ao2_container *unsolicited_mwi;

ast_sorcery_observer_remove(ast_sip_get_sorcery(), "global", &global_observer);
Expand All @@ -1548,6 +1549,18 @@ static int unload_module(void)
ast_free(default_voicemail_extension);
default_voicemail_extension = NULL;
return 0;
#else
/* If we were allowed to unload, the above is what we would do.
* pjsip_evsub_register_pkg is called by ast_sip_register_subscription_handler
* but there is no corresponding unregister function, so unloading
* a module does not remove the event package. If this module is ever
* loaded again, then pjproject will assert and cause a crash.
* For that reason, we must not be allowed to unload, but if
* a pjsip_evsub_unregister_pkg API is added in the future
* then we should go back to unloading the module as intended.
*/
return -1;
#endif
}

static int load_module(void)
Expand Down

0 comments on commit f66f77f

Please sign in to comment.