Looks about right.. i had something very similar from the FreeSWITCH tree:

diff --git a/libs/sofia-sip/libsofia-sip-ua/msg/msg_parser.c 
b/libs/sofia-sip/libsofia-sip-ua/msg/msg_parser.c
index d75b975..c312445 100644
--- a/libs/sofia-sip/libsofia-sip-ua/msg/msg_parser.c
+++ b/libs/sofia-sip/libsofia-sip-ua/msg/msg_parser.c
@@ -2470,8 +2470,6 @@ int msg_header_prepend(msg_t *msg,
 msg_header_t **
 msg_hclass_offset(msg_mclass_t const *mc, msg_pub_t const *mo, msg_hclass_t 
*hc)
 {
-  int i;
-
   assert(mc && hc);
 
   if (mc == NULL || hc == NULL)
@@ -2483,12 +2481,16 @@ msg_hclass_offset(msg_mclass_t const *mc, msg_pub_t 
const *mo, msg_hclass_t *hc)
       if (mc->mc_hash[j].hr_class == hc) {
        return (msg_header_t **)((char *)mo + mc->mc_hash[j].hr_offset);
       }
-  }
-  else
+  } 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);
+    if (hc->hc_hash == mc->mc_request[0].hr_class->hc_hash) return 
(msg_header_t **)((char *)mo + mc->mc_request[0].hr_offset);
+    if (hc->hc_hash == mc->mc_status[0].hr_class->hc_hash) return 
(msg_header_t **)((char *)mo + mc->mc_status[0].hr_offset);
+    if (hc->hc_hash == mc->mc_separator[0].hr_class->hc_hash) return 
(msg_header_t **)((char *)mo + mc->mc_separator[0].hr_offset);
+    if (hc->hc_hash == mc->mc_payload[0].hr_class->hc_hash) return 
(msg_header_t **)((char *)mo + mc->mc_payload[0].hr_offset);
+    if (hc->hc_hash == mc->mc_unknown[0].hr_class->hc_hash) return 
(msg_header_t **)((char *)mo + mc->mc_unknown[0].hr_offset);
+    if (hc->hc_hash == mc->mc_error[0].hr_class->hc_hash) return (msg_header_t 
**)((char *)mo + mc->mc_error[0].hr_offset);
+    if (hc->hc_hash == mc->mc_multipart[0].hr_class->hc_hash) return 
(msg_header_t **)((char *)mo + mc->mc_multipart[0].hr_offset);
+  }
 
   return NULL;
 }


On Apr 24, 2014, at 10:26 AM, Dave Horton <d...@dchorton.com> wrote:

> 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

------------------------------------------------------------------------------
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