]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_session: Added new function calls to avoid ABI issues.
authorBen Ford <bford@digium.com>
Mon, 5 Jun 2023 19:13:16 +0000 (14:13 -0500)
committerasterisk-org-access-app[bot] <120671045+asterisk-org-access-app[bot]@users.noreply.github.com>
Tue, 13 Jun 2023 17:59:05 +0000 (17:59 +0000)
Added two new functions (ast_sip_session_get_dialog and
ast_sip_session_get_pjsip_inv_state) that retrieve the dialog and the
pjsip_inv_state respectively from the pjsip_inv_session on the
ast_sip_session struct. This is due to pjproject adding a new field to
the pjsip_inv_session struct that caused crashes when trying to access
fields that were no longer where they were expected to be if a module
was compiled against a different version of pjproject.

Resolves: #145

include/asterisk/res_pjsip_session.h
res/res_pjsip_session.c

index a21ac4b066301ff509a110f92f781613910951bd..c3b93c37519921585bb0e1237640ef440b051936 100644 (file)
@@ -798,6 +798,26 @@ void ast_sip_session_send_request_with_cb(struct ast_sip_session *session, pjsip
  */
 struct ast_sip_session *ast_sip_dialog_get_session(pjsip_dialog *dlg);
 
+/*!
+ * \brief Retrieves a dialog from a session
+ *
+ * \param session The session to retrieve the dialog from
+ *
+ * \retval non-NULL if dialog exists
+ * \retval NULL if no dialog
+ */
+pjsip_dialog *ast_sip_session_get_dialog(const struct ast_sip_session *session);
+
+/*!
+ * \brief Retrieves the pjsip_inv_state from a session
+ *
+ * \param session The session to retrieve the state from
+ *
+ * \retval state if inv_session exists
+ * \retval PJSIP_INV_STATE_NULL if inv_session is NULL
+ */
+pjsip_inv_state ast_sip_session_get_pjsip_inv_state(const struct ast_sip_session *session);
+
 /*!
  * \brief Resumes processing of a deferred incoming re-invite
  *
index 63177e1aac09ea783fcd3430850d3beb37258446..de51b680f9e54739979796f72edd7ae32855773c 100644 (file)
@@ -3641,6 +3641,28 @@ struct ast_sip_session *ast_sip_dialog_get_session(pjsip_dialog *dlg)
        return session;
 }
 
+pjsip_dialog *ast_sip_session_get_dialog(const struct ast_sip_session *session)
+{
+       pjsip_inv_session *inv_session = session->inv_session;
+
+       if (!inv_session) {
+               return NULL;
+       }
+
+       return inv_session->dlg;
+}
+
+pjsip_inv_state ast_sip_session_get_pjsip_inv_state(const struct ast_sip_session *session)
+{
+       pjsip_inv_session *inv_session = session->inv_session;
+
+       if (!inv_session) {
+               return PJSIP_INV_STATE_NULL;
+       }
+
+       return inv_session->state;
+}
+
 /*! \brief Fetch just the Caller ID number in order of PAI, RPID, From */
 static int fetch_callerid_num(struct ast_sip_session *session, pjsip_rx_data *rdata, char *buf, size_t len)
 {