Hello,
the data lumps system is critically affected if content-length is wrong
for UDP. The anchor_lump() calls abort() in the case content-length is
higher than actually body length. This can be prevented by called sanity
module to check the content length, however, I consider being too
drastic to have abort in such case, it would be better to return an
error and let the sip router process other messages. Opinions?
Checking sip-router sources, it faces same issue.
Another option would be to correct the C-L value locally, but the right
one is that phone vendor fixes its side.
Cheers,
Daniel
--
Daniel-Constantin Mierla
SIP Router Masterclass - Kamailio (OpenSER) Training
http://www.asipto.com/index.php/sip-router-masterclass/
Hello,
it became a trend to add anchors to each header used by some module to
sip_msg structure. While the average is 15 headers per SIP message (some
without anchors in the sip_msg), sip_msg has over 35.
Many of these are used only once, e.g., presence related headers are
used by router as endpoint, not as a proxy. Intended to endpoint are
subject, supported, unsupported, and perhaps others... Keeping them and
cloning in TM when proxying makes no sense. They are not used for routing.
I think would be good to replace some anchors or at least for future the
addition of anchors with functions like:
get_hdr_xyz(sip_msg) - that will take care of parsing and return the
right hdr_field structure.
On another hand I propose to add sortcut to body (start and length) - in
this case if there is a correction done by the parser, will be in effect
everywhere. Looking now in the code, there are functions that extract
body in different ways, some correcting the length by skipping \r, \n at
the end.
Cheers,
Daniel
--
Daniel-Constantin Mierla
Hi,
attached patch fixes the compilation for the usrloc module. It adapts it to
the different parse_phostport syntax, and fixes a missing #define. Patch
against kamailio-3.0 branch.
The other (tiny) patchs introduces a ALL_METHODS #define to the parser of sr,
which is also necessary for usrloc and a few more modules. Patch against sr
master branch.
Please apply, thanks
Henning
Hello,
some time ago, during an IRC devel meeting, it was proposed to migrate K
source repository to GIT (IIRC Ovidiu Sas). At that time SF.net didn't
provide git support but does it now..
Probably many know that most of the modules were updated to compile with
sip-router core (last of them being worked out):
http://sip-router.org/wiki/devel/kamailio-integration#module_integration_st…
Now I am asking the K devels if they feel comfortable with git, so that
we move our repository to git. It will easy synchronization with
sip-router core which is kept in git.
Cheers,
Daniel
--
Daniel-Constantin Mierla
Module: sip-router
Branch: master
Commit: fac5c2fdcb13526c90b88ae1eaf528e7e104602f
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=fac5c2f…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Mon Mar 30 20:55:25 2009 +0200
Merge branch 'ser_core_cvs' of ssh://git.sip-router.org/sip-router
* 'ser_core_cvs' of ssh://git.sip-router.org/sip-router:
dns: more strict record end checking
dns: minor fixes: long lines, unlikely(), end of msg checks
Adding missing reset_static_buffer()
Conflicts:
modules/tm/t_reply.c
---
Module: sip-router
Branch: ser_core_cvs
Commit: ca4ceef32cb4149efc14cdd8c25c8cd2348d653c
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ca4ceef…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Mon Mar 30 13:50:36 2009 +0000
dns: minor fixes: long lines, unlikely(), end of msg checks
- check if the rdlength is valid (points inside the answer),
before skipping over a record
- added unlikely() for error checks
- cosmetic: broken some long lines
---
resolve.c | 70 ++++++++++++++++++++++++++++++++++---------------------------
1 files changed, 39 insertions(+), 31 deletions(-)
diff --git a/resolve.c b/resolve.c
index 740ea87..b007918 100644
--- a/resolve.c
+++ b/resolve.c
@@ -523,22 +523,22 @@ struct rdata* get_record(char* name, int type, int flags)
fullname_rd=0;
size=res_search(name, C_IN, type, buff.buff, sizeof(buff));
- if (size<0) {
+ if (unlikely(size<0)) {
DBG("get_record: lookup(%s, %d) failed\n", name, type);
goto not_found;
}
- else if (size > sizeof(buff)) size=sizeof(buff);
+ else if (unlikely(size > sizeof(buff))) size=sizeof(buff);
head=rd=0;
last=crt=&head;
p=buff.buff+DNS_HDR_SIZE;
end=buff.buff+size;
- if (p>=end) goto error_boundary;
+ if (unlikely(p>=end)) goto error_boundary;
qno=ntohs((unsigned short)buff.hdr.qdcount);
for (r=0; r<qno; r++){
/* skip the name of the question */
- if ((p=dns_skipname(p, end))==0) {
+ if (unlikely((p=dns_skipname(p, end))==0)) {
LOG(L_ERR, "ERROR: get_record: skipname==0\n");
goto error;
}
@@ -547,7 +547,7 @@ struct rdata* get_record(char* name, int type, int flags)
for (;(p<end && (*p)); p++);
p+=1+2+2; /* skip the ending '\0, QCODE and QCLASS */
#endif
- if (p>end) {
+ if (unlikely(p>end)) {
LOG(L_ERR, "ERROR: get_record: p>=end\n");
goto error;
}
@@ -562,20 +562,21 @@ again:
goto error;
}
#else
- if ((skip=dn_expand(buff.buff, end, p, rec_name, MAX_DNS_NAME-1))==-1){
+ if (unlikely((skip=dn_expand(buff.buff, end, p, rec_name,
+ MAX_DNS_NAME-1))==-1)){
LOG(L_ERR, "ERROR: get_record: dn_expand(rec_name) failed\n");
goto error;
}
#endif
p+=skip;
rec_name_len=strlen(rec_name);
- if (rec_name_len>255){
+ if (unlikely(rec_name_len>255)){
LOG(L_ERR, "ERROR: get_record: dn_expand(rec_name): name too"
" long (%d)\n", rec_name_len);
goto error;
}
/* check if enough space is left for type, class, ttl & size */
- if ((p+2+2+4+2)>end) goto error_boundary;
+ if (unlikely((p+2+2+4+2)>end)) goto error_boundary;
/* get type */
memcpy((void*) &rtype, (void*)p, 2);
rtype=ntohs(rtype);
@@ -592,6 +593,7 @@ again:
memcpy((void*)&rdlength, (void*)p, 2);
rdlength=ntohs(rdlength);
p+=2;
+ if (unlikely((p+rdlength)>end)) goto error_boundary;
if ((flags & RES_ONLY_TYPE) && (rtype!=type)){
/* skip */
p+=rdlength;
@@ -599,7 +601,8 @@ again:
}
/* expand the "type" record (rdata)*/
- rd=(struct rdata*) local_malloc(sizeof(struct rdata)+rec_name_len+1-1);
+ rd=(struct rdata*) local_malloc(sizeof(struct rdata)+rec_name_len+
+ 1-1);
if (rd==0){
LOG(L_ERR, "ERROR: get_record: out of memory\n");
goto error;
@@ -615,13 +618,13 @@ again:
if ((search_list_used==1)&&(fullname_rd==0)&&
(rec_name_len>=name_len)&&
(strncasecmp(rec_name, name, name_len)==0)) {
- /* now we have record which's name is the same (up-to the name_len
- * with the searched one
- * if the length is the same - we found full match, no fake cname
- * needed, just clear the flag
- * if the length of the name differs - it has matched using search list
- * remember the rd, so we can create fake CNAME record when all answers
- * are used and no better match found
+ /* now we have record whose name is the same (up-to the
+ * name_len with the searched one):
+ * if the length is the same - we found full match, no fake
+ * cname needed, just clear the flag
+ * if the length of the name differs - it has matched using
+ * search list remember the rd, so we can create fake CNAME
+ * record when all answers are used and no better match found
*/
if (rec_name_len==name_len)
search_list_used=0;
@@ -638,7 +641,7 @@ again:
case T_SRV:
srv_rd= dns_srv_parser(buff.buff, end, p);
rd->rdata=(void*)srv_rd;
- if (srv_rd==0) goto error_parse;
+ if (unlikely(srv_rd==0)) goto error_parse;
/* insert sorted into the list */
for (crt=&head; *crt; crt= &((*crt)->next)){
@@ -652,34 +655,35 @@ again:
goto skip;
}
}
- last=&(rd->next); /*end of for => this will be the last elem*/
+ last=&(rd->next); /*end of for => this will be the last
+ element*/
skip:
/* insert here */
rd->next=*crt;
*crt=rd;
-
break;
case T_A:
rd->rdata=(void*) dns_a_parser(p,end);
- if (rd->rdata==0) goto error_parse;
- *last=rd; /* last points to the last "next" or the list head*/
+ if (unlikely(rd->rdata==0)) goto error_parse;
+ *last=rd; /* last points to the last "next" or the list
+ head*/
last=&(rd->next);
break;
case T_AAAA:
rd->rdata=(void*) dns_aaaa_parser(p,end);
- if (rd->rdata==0) goto error_parse;
+ if (unlikely(rd->rdata==0)) goto error_parse;
*last=rd;
last=&(rd->next);
break;
case T_CNAME:
rd->rdata=(void*) dns_cname_parser(buff.buff, end, p);
- if(rd->rdata==0) goto error_parse;
+ if(unlikely(rd->rdata==0)) goto error_parse;
*last=rd;
last=&(rd->next);
break;
case T_NAPTR:
rd->rdata=(void*) dns_naptr_parser(buff.buff, end, p);
- if(rd->rdata==0) goto error_parse;
+ if(unlikely(rd->rdata==0)) goto error_parse;
*last=rd;
last=&(rd->next);
break;
@@ -697,7 +701,8 @@ again:
flags&=~RES_AR;
answers_no=ntohs((unsigned short)buff.hdr.nscount);
#ifdef RESOLVE_DBG
- DBG("get_record: skipping %d NS (p=%p, end=%p)\n", answers_no, p, end);
+ DBG("get_record: skipping %d NS (p=%p, end=%p)\n", answers_no, p,
+ end);
#endif
for (r=0; (r<answers_no) && (p<end); r++){
/* skip over the ns records */
@@ -706,13 +711,14 @@ again:
goto error;
}
/* check if enough space is left for type, class, ttl & size */
- if ((p+2+2+4+2)>end) goto error_boundary;
+ if (unlikely((p+2+2+4+2)>end)) goto error_boundary;
memcpy((void*)&rdlength, (void*)p+2+2+4, 2);
p+=2+2+4+2+ntohs(rdlength);
}
answers_no=ntohs((unsigned short)buff.hdr.arcount);
#ifdef RESOLVE_DBG
- DBG("get_record: parsing %d ARs (p=%p, end=%p)\n", answers_no, p, end);
+ DBG("get_record: parsing %d ARs (p=%p, end=%p)\n", answers_no, p,
+ end);
#endif
goto again; /* add also the additional records */
}
@@ -723,7 +729,7 @@ again:
*/
if ((search_list_used==1)&&(fullname_rd!=0)) {
rd=(struct rdata*) local_malloc(sizeof(struct rdata)+name_len+1-1);
- if (rd==0){
+ if (unlikely(rd==0)){
LOG(L_ERR, "ERROR: get_record: out of memory\n");
goto error;
}
@@ -735,13 +741,15 @@ again:
rd->name[name_len]=0;
rd->name_len=name_len;
/* alloc sizeof struct + space for the null terminated name */
- rd->rdata=(void*)local_malloc(sizeof(struct cname_rdata)-1+head->name_len+1);
- if(rd->rdata==0){
+ rd->rdata=(void*)local_malloc(sizeof(struct cname_rdata)-1+
+ head->name_len+1);
+ if(unlikely(rd->rdata==0)){
LOG(L_ERR, "ERROR: get_record: out of memory\n");
goto error_rd;
}
((struct cname_rdata*)(rd->rdata))->name_len=fullname_rd->name_len;
- memcpy(((struct cname_rdata*)(rd->rdata))->name, fullname_rd->name, fullname_rd->name_len);
+ memcpy(((struct cname_rdata*)(rd->rdata))->name, fullname_rd->name,
+ fullname_rd->name_len);
((struct cname_rdata*)(rd->rdata))->name[head->name_len]=0;
head=rd;
}