From 8eaf59b7f3350077094f8c4bcd6fc0647907ee63 Mon Sep 17 00:00:00 2001
From: Michael Jerris <mike@jerris.com>
Date: Tue, 12 Aug 2008 17:06:57 +0000
Subject: [PATCH] Thu Aug  7 07:53:01 EDT 2008  Pekka Pessi
 <first.last@nokia.com>   * soa_static.c: increment version number in o= line
 only when generating offer or answer

  Bug reported by Timo Bruhn.



git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9276 d0543943-73ff-0310-b7d9-9358b9ac24b2
---
 libs/sofia-sip/.update                        |  2 +-
 .../libsofia-sip-ua/soa/soa_static.c          | 40 +++++++++++++++++--
 2 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update
index 89bf81e742..903b6b6c66 100644
--- a/libs/sofia-sip/.update
+++ b/libs/sofia-sip/.update
@@ -1 +1 @@
-Tue Aug 12 13:06:30 EDT 2008
+Tue Aug 12 13:06:53 EDT 2008
diff --git a/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c b/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c
index b73cfd52fa..38ce8b2a1b 100644
--- a/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c
+++ b/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c
@@ -87,6 +87,9 @@ typedef struct soa_static_session
   int  *sss_u2s;
   /** Mapping from session SDP m= lines to user SDP m= lines */
   int *sss_s2u;
+
+  /** Our latest offer or answer */
+  sdp_session_t *sss_latest;
 }
 soa_static_session_t;
 
@@ -1103,6 +1106,8 @@ static int offer_answer_step(soa_session_t *ss,
 
   int *u2s = NULL, *s2u = NULL, *tbf;
 
+  sdp_session_t *latest = NULL, *previous = NULL;
+
   char const *phrase = "Internal Media Error";
 
   su_home_t tmphome[SU_HOME_AUTO_SIZE(8192)];
@@ -1327,10 +1332,27 @@ static int offer_answer_step(soa_session_t *ss,
 
   if (ss->ss_local->ssd_sdp != local &&
       sdp_session_cmp(ss->ss_local->ssd_sdp, local)) {
-    /* We have modified local session: update origin-line */
-    if (local->sdp_origin != o)
-      *o = *local->sdp_origin, local->sdp_origin = o;
-    o->o_version++;
+    int bump;
+
+    switch (action) {
+    case generate_offer:
+      bump = sdp_session_cmp(local, sss->sss_latest);
+      break;
+    case generate_answer:
+      bump = 1;
+      break;
+    case process_answer:
+    default:
+      bump = 0;
+      break;
+    }
+
+    if (bump) {
+      /* Upgrade the version number */
+      if (local->sdp_origin != o)
+	*o = *local->sdp_origin, local->sdp_origin = o;
+      o->o_version++;
+    }
 
     /* Do sanity checks for the created SDP */
     if (!local->sdp_subject)	/* s= is mandatory */
@@ -1362,6 +1384,11 @@ static int offer_answer_step(soa_session_t *ss,
 
       goto internal_error;
     }
+
+    if (bump) {
+      latest = sdp_session_dup(ss->ss_home, ss->ss_local->ssd_sdp);
+      previous = sss->sss_latest;
+    }
   }
 
   if (u2s) {
@@ -1373,10 +1400,12 @@ static int offer_answer_step(soa_session_t *ss,
   switch (action) {
   case generate_offer:
     ss->ss_local_user_version = user_version;
+    sss->sss_latest = latest;
     break;
   case generate_answer:
     ss->ss_local_user_version = user_version;
     ss->ss_local_remote_version = remote_version;
+    sss->sss_latest = latest;
     break;
   case process_answer:
     ss->ss_local_remote_version = remote_version;
@@ -1384,6 +1413,9 @@ static int offer_answer_step(soa_session_t *ss,
     break;
   }
 
+  if (previous)
+    su_free(ss->ss_home, previous);
+
   su_home_deinit(tmphome);
   return 0;