Interestingly, I ran into the same problem earlier this week trying out my 
application on Ubuntu 13. The root cause of the problem is in the gcc version, 
more specifically 4.8 and probably above, which introduces aggressive loop 
optimization "techniques".

Searching the net, you may find many other applications affected by the same 
gcc improvement. This problem can be circumvented by disabling loop 
optimizations via the new gcc options. However, it'd be better to fix the code 
as it has been done in FreeSWITCH.

Arsen
www.unimrcp.org

On Thursday, April 24, 2014 8:32 AM, Michael Jerris <m...@jerris.com> wrote:
 
Our full history is:

http://fisheye.freeswitch.org/changelog/FreeSWITCH/libs/sofia-sip?max=30&view=fe

or just pull directly from freeswitch git tree... the issue is, some of our 
fixes change behavior statically instead of having a tag to change behavior, so 
all the patches may not be appropriate.. Its on my list to start moving the 
good patches back into the sofia-sip tree, but i never seem to find the time.  
That being said, if you want to put some time in to that, I'd be happy to do 
the actual pushes to gitorious tree, just let me know.

Mike



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

Thanks, that looks exactly like the same bug (and fix). Just out of interest, 
what kind of problem and what platform did you see problems manifest that led 
you to make this fix ?  

I haven't looked closely at the freeswitch fixes that haven't been ported back 
anywhere, but now I think I should.  Can you send me a link to a commit history?

Dave

On Apr 24, 2014, at 10:52 AM, Michael Jerris <m...@jerris.com> wrote:

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