[SR-Dev] git:ser_core_cvs: dns: minor fixes: long lines, unlikely(), end of msg checks

Andrei Pelinescu-Onciul andrei at iptel.org
Mon Mar 30 20:50:42 CEST 2009


Module: sip-router
Branch: ser_core_cvs
Commit: ca4ceef32cb4149efc14cdd8c25c8cd2348d653c
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ca4ceef32cb4149efc14cdd8c25c8cd2348d653c

Author: Andrei Pelinescu-Onciul <andrei at iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei at 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;
 	}




More information about the sr-dev mailing list