Bugs item #1878039, was opened at 2008-01-23 17:25
Message generated for change (Tracker Item Submitted) made by Item Submitter
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=756076&aid=1878039&group_id=143636

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: None
Group: None
Status: Open
Resolution: None
Priority: 5
Private: No
Submitted By: Tirthankar Saha (tirthankarsaha)
Assigned to: Nobody/Anonymous (nobody)
Summary: Memory leak in handling of incoming ACK request

Initial Comment:
Valgrind reports leaks in a simple UAS application written using Sofia-NUA 
library (1.12.7). One possible leak which has been noticed is in handling of 
incoming ACK request for 2xx response. 

Prelim analysis suggests that the memory home for the incoming ACK request is 
not un-ref-ed (since it is not stored as separate irq object in any saved list)

Adding the following code block (delimited by PATCH_START comment in code 
snippet below) at the end of nua_event() function in nua.c fixes the leak. This 
may not be the proper fix.



/*# Receive event from protocol machine and hand it over to application */
void nua_event(nua_t *root_magic, su_msg_r sumsg, event_t *e)
{
  nua_t *nua;
  nua_handle_t *nh = e->e_nh;
  enter;

  e->e_nh = NULL;

  if (nh) {
    if (!nh->nh_ref_by_user && nh->nh_valid) {
      nh->nh_ref_by_user = 1;
      nua_handle_ref(nh);
    }
  }

  if (!nh || !nh->nh_valid) {   /* Handle has been destroyed */
    if (nua_log->log_level >= 7) {
      char const *name = nua_event_name(e->e_event) + 4;
      SU_DEBUG_7(("nua(%p): event %s dropped\n", (void *)nh, name));
    }
    if (nh && !NH_IS_DEFAULT(nh) && nua_handle_unref(nh)) {
#if HAVE_NUA_HANDLE_DEBUG
      SU_DEBUG_0(("nua(%p): freed by application\n", (void *)nh));
#else
      SU_DEBUG_9(("nua(%p): freed by application\n", (void *)nh));
#endif
    }
    if (e->e_msg)
      msg_destroy(e->e_msg), e->e_msg = NULL;
    return;
  }

  nua = nh->nh_nua; assert(nua);

  if (NH_IS_DEFAULT(nh))
    nh = NULL;

  if (e->e_event == nua_r_shutdown && e->e_status >= 200)
    nua->nua_shutdown_final = 1;

  if (nua->nua_callback) {
    nua_event_frame_t frame[1];
    
    su_msg_remove_refs(sumsg);    /* Remove references to tasks */
    su_msg_save(frame->nf_saved, sumsg);
    frame->nf_nua = nua;
    frame->nf_next = nua->nua_current, nua->nua_current = frame;

    nua->nua_callback(e->e_event, e->e_status, e->e_phrase,
                      nua, nua->nua_magic,
                      nh, nh ? nh->nh_magic : NULL,
                      e->e_msg ? sip_object(e->e_msg) : NULL,
                      e->e_tags);

    su_msg_destroy(frame->nf_saved);

    if (frame->nf_nua == NULL)
      return;
    nua->nua_current = frame->nf_next;
  }

/* __PATCH_START__ */
  if (e && e->e_msg && e->e_event == nua_i_ack)
  {
     /*specific for ACK event*/
     su_home_unref(msg_home(e->e_msg));
  }
/* __PATCH_END__ */



  if (nh && nua_handle_unref(nh)) {
#if HAVE_NUA_HANDLE_DEBUG
    SU_DEBUG_0(("nua(%p): freed by application\n", (void *)nh));
#else
    SU_DEBUG_9(("nua(%p): freed by application\n", (void *)nh));
#endif
  }
}


----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=756076&aid=1878039&group_id=143636

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Sofia-sip-devel mailing list
Sofia-sip-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sofia-sip-devel

Reply via email to