I recently came across a problem that manifested only on Fedora 20 and Mint 
(not on Ubunto or Centos 6.x).  When using SIPTAG_PAYLOAD_STR to add a body to 
an outgoing SIP message, the message goes out without any body; i.e., it's as 
if that tag was silently ignored.  My program would also subsquently crash.  
Again, this problem was only experienced on certain Linux distros

I eventually tracked it to this code in the msg_hclass_offset function in 
msg_parser.c.

  else
    /* Header has no name. */
    for (i = 0; i <= 6; i++)
      if (hc->hc_hash == mc->mc_request[i].hr_class->hc_hash)
        return (msg_header_t **)((char *)mo + mc->mc_request[i].hr_offset);


Something in that non-standard way of iterating through the msg_href_t elements 
in the msg_mclass_s structure was causing weird results.  When I stepped 
through the code, which is supposed to iterate across the bolded elements in 
the struct below (you can see that I call it "non-standard" because it is 
incrementing across an array that has only one member, but using that as a 
device to check each of the 6 members) what I saw was that an incorrect match 
was returned, and thus the offset to the sip_payload_t member which this 
function returns was incorrect.  Hence the bad things happened.  

struct msg_mclass_s
{
  struct msg_hclass_s
                mc_hclass[1];     /**< Recursive header class */
  char const   *mc_name;     /**< Protocol name, e.g., "SIP/2.0" */
  void         *mc_tag;          /**< Protocol-specific tag */
  unsigned      mc_flags;     /**< Default flags */
  unsigned      mc_msize;     /**< Size of public message structure */
  /** Function extracting the message contents. */
  issize_t    (*mc_extract_body)(msg_t *msg, msg_pub_t *pub,
                     char b[], isize_t bsiz, int eos);

  msg_href_t    mc_request[1];     /**< Request line reference */
  msg_href_t    mc_status[1];     /**< Status line reference */
  msg_href_t    mc_separator[1];/**< Separator line reference */
  msg_href_t    mc_payload[1];     /**< Message body reference */
  msg_href_t    mc_unknown[1];     /**< Reference for unknown headers */
  msg_href_t    mc_error[1];     /**< Reference for erroneous header */
  msg_href_t    mc_multipart[1];/**< Multipart body reference */
  msg_href_t const *
                mc_short;     /**< Short forms (or NULL) */
  short         mc_hash_size;     /**< Size of parsing table  */
  short         mc_hash_used;     /**< Number of headers in parsing table */
  /** Hash table for parsing containing reference for each header. */
  msg_href_t    mc_hash[MC_HASH_SIZE];
};

Here is my commit that fixed things in my public repo: 
https://github.com/davehorton/sofia-sip/commit/51bb86448d952a5997a8d7e38c545c164fa112a2

Dave
------------------------------------------------------------------------------
Start Your Social Network Today - Download eXo Platform
Build your Enterprise Intranet with eXo Platform Software
Java Based Open Source Intranet - Social, Extensible, Cloud Ready
Get Started Now And Turn Your Intranet Into A Collaboration Platform
http://p.sf.net/sfu/ExoPlatform
_______________________________________________
Sofia-sip-devel mailing list
Sofia-sip-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sofia-sip-devel

Reply via email to