Module: sip-router Branch: master Commit: cd1ff5364786f8b32058921be6f3216b48e34792 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=cd1ff536...
Author: Anca Vamanu anca.vamanu@1and1.ro Committer: Anca Vamanu anca.vamanu@1and1.ro Date: Wed May 2 18:42:55 2012 +0300
modules_k/presence Fixed wrong cseq and wrong expires bugs
1. Wrong cseq bug: happened in subs_db_mode!= DB_ONLY when generating Notify with expires=0 that was not triggered by a received Subscribe
2. Problem with expires raported in Notify message. There was a static buffer used twice when building the extra headers for Notify leading to expires parameter value always having last digits '70' (the value of Max-Forwards).
---
modules_k/presence/notify.c | 116 ++++++++++++++-------------------------- modules_k/presence/presence.c | 4 +- modules_k/presence/subscribe.c | 2 + 3 files changed, 45 insertions(+), 77 deletions(-)
diff --git a/modules_k/presence/notify.c b/modules_k/presence/notify.c index 4f8d68b..f778511 100644 --- a/modules_k/presence/notify.c +++ b/modules_k/presence/notify.c @@ -134,18 +134,17 @@ int build_str_hdr(subs_t* subs, int is_body, str* hdr) pres_ev_t* event= subs->event; str expires = {0, 0}; str status = {0, 0}; - str tmp = {0, 0}; + char* p; str trans = {";transport=", 11};
- if(hdr == NULL) - { + if(hdr == NULL) { LM_ERR("bad parameter\n"); return -1; } expires.s = int2str(subs->expires, &expires.len); + status.s= get_status_str(subs->status); - if(status.s == NULL) - { + if(status.s == NULL) { LM_ERR("bad status %d\n", subs->status); return -1; } @@ -161,104 +160,71 @@ int build_str_hdr(subs_t* subs, int is_body, str* hdr) (14 /*Content-Type: */+subs->event->content_type.len + CRLF_LEN):0) + 1;
hdr->s = (char*)pkg_malloc(hdr->len); - if(hdr->s == NULL) - { - LM_ERR("no more pkg\n"); + if(hdr->s == NULL) { + LM_ERR("no more pkg memory\n"); return -1; }
- strncpy(hdr->s, "Max-Forwards: ", 14); - tmp.s = int2str((unsigned long)MAX_FORWARD, &tmp.len); - strncpy(hdr->s+14, tmp.s, tmp.len); - tmp.s = hdr->s + tmp.len + 14; - strncpy(tmp.s, CRLF, CRLF_LEN); - tmp.s += CRLF_LEN; - - strncpy(tmp.s ,"Event: ", 7); - tmp.s += 7; - strncpy(tmp.s, event->name.s, event->name.len); - tmp.s += event->name.len; - if(subs->event_id.len && subs->event_id.s) - { - strncpy(tmp.s, ";id=", 4); - tmp.s += 4; - strncpy(tmp.s, subs->event_id.s, subs->event_id.len); - tmp.s += subs->event_id.len; - } - strncpy(tmp.s, CRLF, CRLF_LEN); - tmp.s += CRLF_LEN; - - strncpy(tmp.s, "Contact: <", 10); - tmp.s += 10; - strncpy(tmp.s, subs->local_contact.s, subs->local_contact.len); - tmp.s += subs->local_contact.len; + p = hdr->s; + p += sprintf(p, "Max-Forwards: %d\r\n", MAX_FORWARD); + + p += sprintf(p ,"Event: %.*s", event->name.len, event->name.s); + if(subs->event_id.len && subs->event_id.s) { + p += sprintf(p, ";id=%.*s", subs->event_id.len, subs->event_id.s); + } + memcpy(p, CRLF, CRLF_LEN); + p += CRLF_LEN; + + p += sprintf(p, "Contact: <%.*s", subs->local_contact.len, subs->local_contact.s); if(subs->sockinfo_str.s!=NULL - && str_search(&subs->local_contact, &trans)==0) - { + && str_search(&subs->local_contact, &trans)==0) { /* fix me */ switch(subs->sockinfo_str.s[0]) { case 's': case 'S': - strncpy(tmp.s, ";transport=sctp", 15); - tmp.s += 15; + memcpy(p, ";transport=sctp", 15); + p += 15; break; case 't': case 'T': switch(subs->sockinfo_str.s[1]) { case 'c': case 'C': - strncpy(tmp.s, ";transport=tcp", 14); - tmp.s += 14; + memcpy(p, ";transport=tcp", 14); + p += 14; break; case 'l': case 'L': - strncpy(tmp.s, ";transport=tls", 14); - tmp.s += 14; + memcpy(p, ";transport=tls", 14); + p += 14; break; } break; } } - *tmp.s = '>'; - tmp.s++; - strncpy(tmp.s, CRLF, CRLF_LEN); - tmp.s += CRLF_LEN; - - strncpy(tmp.s, "Subscription-State: ", 20); - tmp.s += 20; - strncpy(tmp.s, status.s, status.len); - tmp.s += status.len; - - if(subs->status == TERMINATED_STATUS) - { + *p = '>'; + p++; + memcpy(p, CRLF, CRLF_LEN); + p += CRLF_LEN; + + p += sprintf(p, "Subscription-State: %.*s", status.len, status.s); + + if(subs->status == TERMINATED_STATUS) { LM_DBG("state = terminated\n"); - - strncpy(tmp.s, ";reason=", 8); - tmp.s += 8; - strncpy(tmp.s, subs->reason.s, subs->reason.len); - tmp.s += subs->reason.len; - } else { - strncpy(tmp.s, ";expires=", 9); - tmp.s += 9; - LM_DBG("expires = %d\n", subs->expires); - strncpy(tmp.s, expires.s, expires.len); - tmp.s += expires.len; - } - strncpy(tmp.s, CRLF, CRLF_LEN); - tmp.s += CRLF_LEN; - - if(is_body) - { - strncpy(tmp.s,"Content-Type: ", 14); - tmp.s += 14; - strncpy(tmp.s, event->content_type.s, event->content_type.len); - tmp.s += event->content_type.len; - strncpy(tmp.s, CRLF, CRLF_LEN); - tmp.s += CRLF_LEN; + p += sprintf(p, ";reason=%.*s", subs->reason.len, subs->reason.s); + } else { + p += sprintf(p, ";expires=%.*s", expires.len, expires.s); + } + memcpy(p, CRLF, CRLF_LEN); + p += CRLF_LEN; + + if(is_body) { + p += sprintf(p,"Content-Type: %.*s\r\n", event->content_type.len, + event->content_type.s); } - *tmp.s = '\0'; - hdr->len = tmp.s - hdr->s; + *p = '\0'; + hdr->len = p - hdr->s;
return 0; } diff --git a/modules_k/presence/presence.c b/modules_k/presence/presence.c index 1580942..e9b5681 100644 --- a/modules_k/presence/presence.c +++ b/modules_k/presence/presence.c @@ -1143,7 +1143,6 @@ send_notify:
while(s) { - if(notify(s, NULL, NULL, 0)< 0) { LM_ERR( "sending Notify request\n"); @@ -1376,7 +1375,7 @@ static int update_pw_dialogs_dbonlymode(subs_t* subs, subs_t** subs_array) pa_dbf.free_result(pa_db, result); return(-1); } - + cs->local_cseq++; cs->next= (*subs_array); (*subs_array)= cs;
@@ -1458,6 +1457,7 @@ static int update_pw_dialogs(subs_t* subs, unsigned int hash_code, subs_t** subs lock_release(&subs_htable[hash_code].lock); return -1; } + cs->local_cseq++; cs->expires-= (int)time(NULL); cs->next= (*subs_array); (*subs_array)= cs; diff --git a/modules_k/presence/subscribe.c b/modules_k/presence/subscribe.c index 161a2a0..add1581 100644 --- a/modules_k/presence/subscribe.c +++ b/modules_k/presence/subscribe.c @@ -1472,6 +1472,7 @@ int handle_expired_subs(subs_t* s) s->reason.s= "timeout"; s->reason.len= 7; s->expires= 0; + s->local_cseq++;
if(send_notify_request(s, NULL, NULL, 1)< 0) { @@ -2270,6 +2271,7 @@ int refresh_watcher(str* pres_uri, str* watcher_uri, str* event, return -1; } lock_release(&subs_htable[hash_code].lock); + s_copy->local_cseq++; if(notify(s_copy, NULL, NULL, 0)< 0) { LM_ERR("in notify function\n");