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
This commit is contained in:
Michael Jerris 2008-08-12 17:06:57 +00:00
parent b489249f60
commit 8eaf59b7f3
2 changed files with 37 additions and 5 deletions

View File

@ -1 +1 @@
Tue Aug 12 13:06:30 EDT 2008
Tue Aug 12 13:06:53 EDT 2008

View File

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