]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FreeTDM: Stop using raw_data for FTDM_SIGEVENT_SIGSTATUS_CHANGED events.
authorStefan Knoblich <s.knoblich@axsentis.de>
Sun, 19 Dec 2010 20:09:50 +0000 (21:09 +0100)
committerStefan Knoblich <s.knoblich@axsentis.de>
Sun, 19 Dec 2010 20:09:50 +0000 (21:09 +0100)
The raw_data member is used for passing heap allocated data with an event,
(e.g. strings of dtmf data) the memory is freed after the event has been processed.

Recent changes in the event structure added a way to pass sig status changes inline,
so remove the raw_data usage for FTDM_SIGEVENT_SIGSTATUS_CHANGED events.

NOTE: This (finally) fixes a bug in ftmod_libpri that was caused by
      the event handling changes (stack corruption due to using free()
      on a variable on the stack, which turned into a NULL ptr deref
      caused by some compat code in ftdm_io.c:ftdm_span_send_signal().

Compiles and tested on my BRI setup, i did a quick audit of all
places that generate FTDM_SIGEVENT_SIGSTATUS_CHANGED events and
except for the sangoma_boost module there's nothing else that left
using raw_data for this event.

Signed-off-by: Stefan Knoblich <s.knoblich@axsentis.de>
libs/freetdm/mod_freetdm/mod_freetdm.c
libs/freetdm/src/ftdm_io.c
libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c

index 7637932b792c5ff4223bf9c4a004338cc633544f..80006f1ae53aef36647b94dc8b9f0d3c3d3c60fc 100755 (executable)
@@ -2086,7 +2086,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
 
                case FTDM_SIGEVENT_SIGSTATUS_CHANGED:
                {
-                       ftdm_signaling_status_t sigstatus = sigmsg->raw_data ? *((ftdm_signaling_status_t*)(sigmsg->raw_data)) : sigmsg->ev_data.sigstatus.status;
+                       ftdm_signaling_status_t sigstatus = sigmsg->ev_data.sigstatus.status;
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%d:%d signalling changed to: %s\n",
                                        spanid, chanid, ftdm_signaling_status2str(sigstatus));
                }
index 94a01aa7bafe769546e800f809ee58cd044c0d60..297c08e5eabdcd700fd6194ca035c9aff2cc15fc 100644 (file)
@@ -5403,8 +5403,7 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t
 
        case FTDM_SIGEVENT_SIGSTATUS_CHANGED:
                {
-                       ftdm_signaling_status_t sigstatus = ftdm_test_flag(span, FTDM_SPAN_USE_SIGNALS_QUEUE) ? sigmsg->ev_data.sigstatus.status : *((ftdm_signaling_status_t*)(sigmsg->raw_data));
-                       if (sigstatus == FTDM_SIG_STATE_UP) {
+                       if (sigmsg->ev_data.sigstatus.status == FTDM_SIG_STATE_UP) {
                                ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
                        } else {
                                ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
index f59b3b8c4f4b6537e92b1c46920d8d21af5290a9..97e242dacb3b9fba24aa6923f49006e073700d35 100644 (file)
@@ -2478,7 +2478,7 @@ static BOOST_SIG_STATUS_CB_FUNCTION(ftdm_boost_sig_status_change)
        sig.span_id = ftdmchan->span_id;
        sig.channel = ftdmchan;
        sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-       sig.raw_data = &status;
+       sig.ev_data.sigstatus.status = status;
        ftdm_span_send_signal(ftdmchan->span, &sig);
        return;
 }