Module: sems
Branch: master
Commit: 5f9f47917eb8ea126cf23956dd20b90b32d620f4
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=5f9f47917eb8ea126cf23956dd20b90b32d620f4

Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date:   Fri Jun 24 14:19:35 2011 +0200

b/f: fix small mem leak with telev payload

spotted by Emil Kroymann

---

 core/AmRtpStream.cpp |   24 +++++++++++-------------
 core/AmRtpStream.h   |    4 ++--
 2 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/core/AmRtpStream.cpp b/core/AmRtpStream.cpp
index 5c28b1f..8d6fd04 100644
--- a/core/AmRtpStream.cpp
+++ b/core/AmRtpStream.cpp
@@ -211,7 +211,7 @@ void AmRtpStream::sendDtmfPacket(unsigned int ts) {
     case DTMF_SEND_SENDING: {
       if (ts_less()(ts, current_send_dtmf_ts + current_send_dtmf.second)) {
        // send packet
-       if (!remote_telephone_event_pt) 
+       if (!remote_telephone_event_pt.get())
          return;
 
        dtmf_payload_t dtmf;
@@ -242,7 +242,7 @@ void AmRtpStream::sendDtmfPacket(unsigned int ts) {
       } else {
        send_dtmf_end_repeat++;
        // send packet with end bit set, duration = event duration
-       if (!remote_telephone_event_pt) 
+       if (!remote_telephone_event_pt.get())
          return;
 
        dtmf_payload_t dtmf;
@@ -379,7 +379,7 @@ int AmRtpStream::receive( unsigned char* buffer, unsigned 
int size,
     return RTP_EMPTY;
   }
 
-  if (local_telephone_event_pt && 
+  if (local_telephone_event_pt.get() &&
       rp->payload == local_telephone_event_pt->payload_type)
     {
       dtmf_payload_t* dpl = (dtmf_payload_t*)rp->getData();
@@ -420,8 +420,6 @@ AmRtpStream::AmRtpStream(AmSession* _s, int _if)
     receiving(true),
     monitor_rtp_timeout(true),
     dtmf_sending_state(DTMF_SEND_NONE),
-    remote_telephone_event_pt(NULL),
-    local_telephone_event_pt(NULL),
     relay_stream(NULL),
     relay_enabled(false)
 {
@@ -642,14 +640,15 @@ int AmRtpStream::init(AmPayloadProviderInterface* 
payload_provider,
   payload = local_media.payloads[0].payload_type;
   last_payload = payload;
 
-  if((remote_telephone_event_pt = remote.telephoneEventPayload())) {
+  remote_telephone_event_pt.reset(remote.telephoneEventPayload());
+  if (remote_telephone_event_pt.get()) {
       DBG("remote party supports telephone events (pt=%i)\n",
          remote_telephone_event_pt->payload_type);
   } else {
     DBG("remote party doesn't support telephone events\n");
   }
 
-  local_telephone_event_pt = local.telephoneEventPayload();
+  local_telephone_event_pt.reset(local.telephoneEventPayload());
 
   resume();
 
@@ -712,7 +711,7 @@ void AmRtpStream::bufferPacket(AmRtpPacket* p)
 
   receive_mut.lock();
   // free packet on double packet for TS received
-  if(!(local_telephone_event_pt && 
+  if(!(local_telephone_event_pt.get() &&
        (p->payload == local_telephone_event_pt->payload_type))) {
     if (receive_buf.find(p->timestamp) != receive_buf.end()) {
       mem.freePacket(receive_buf[p->timestamp]);
@@ -765,7 +764,7 @@ void AmRtpStream::bufferPacket(AmRtpPacket* p)
   } else {
 #endif // WITH_ZRTP
 
-    if(local_telephone_event_pt && 
+    if(local_telephone_event_pt.get() &&
        (p->payload == local_telephone_event_pt->payload_type)) {
       rtp_ev_qu.push(p);
     } else {
@@ -846,10 +845,9 @@ void AmRtpStream::relay(AmRtpPacket* p) {
 
 int AmRtpStream::getLocalTelephoneEventRate()
 {
-  int retval = 0;
-  if (local_telephone_event_pt)
-    retval = local_telephone_event_pt->clock_rate;
-  return retval;
+  if (local_telephone_event_pt.get())
+    return local_telephone_event_pt->clock_rate;
+  return 0;
 }
 
 void AmRtpStream::sendDtmf(int event, unsigned int duration_ms) {
diff --git a/core/AmRtpStream.h b/core/AmRtpStream.h
index 95982a0..22129a5 100644
--- a/core/AmRtpStream.h
+++ b/core/AmRtpStream.h
@@ -154,8 +154,8 @@ protected:
   bool           passive;      // passive mode ?
 
   /** Payload type for telephone event */
-  const SdpPayload* remote_telephone_event_pt;
-  const SdpPayload* local_telephone_event_pt;
+  auto_ptr<const SdpPayload> remote_telephone_event_pt;
+  auto_ptr<const SdpPayload> local_telephone_event_pt;
 
   PacketMem       mem;
   ReceiveBuffer   receive_buf;

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to