Преглед на файлове

- fixed a segfault bug in parse msg (printing of via even if via==null)

Andrei Pelinescu-Onciul преди 24 години
родител
ревизия
350c5a1616
променени са 4 файла, в които са добавени 34 реда и са изтрити 6 реда
  1. 21 6
      msg_parser.c
  2. 6 0
      test/bad_via1.sip
  3. 4 0
      test/bad_via2.sip
  4. 3 0
      test/bad_via3.sip

+ 21 - 6
msg_parser.c

@@ -142,6 +142,11 @@ char* get_hdr_field(char *buffer, unsigned int len, struct hdr_field*  hdr_f)
 	char* body;
 	char* body;
 	int offset;
 	int offset;
 
 
+	
+	/* init content to the empty string */
+	hdr_f->name="";
+	hdr_f->body="";
+	
 	if ((*buffer=='\n')||(*buffer=='\r')){
 	if ((*buffer=='\n')||(*buffer=='\r')){
 		/* double crlf */
 		/* double crlf */
 		tmp=eat_line(buffer,len);
 		tmp=eat_line(buffer,len);
@@ -169,7 +174,7 @@ char* get_hdr_field(char *buffer, unsigned int len, struct hdr_field*  hdr_f)
 	}while( (*tmp==' ' ||  *tmp=='\t') && (offset<len) );
 	}while( (*tmp==' ' ||  *tmp=='\t') && (offset<len) );
 	if (offset==len){
 	if (offset==len){
 		hdr_f->type=HDR_ERROR;
 		hdr_f->type=HDR_ERROR;
-		LOG(L_INFO, "ERROR: het_hdr_field: field body too  long\n");
+		LOG(L_INFO, "ERROR: get_hdr_field: field body too  long\n");
 		goto error;
 		goto error;
 	}
 	}
 	*(tmp-1)=0; /* should be an LF */
 	*(tmp-1)=0; /* should be an LF */
@@ -354,6 +359,14 @@ int parse_msg(char* buf, unsigned int len, struct sip_msg* msg)
 	int offset;
 	int offset;
 
 
 	
 	
+	/* init vb1 & vb2 to the null string */
+	vb1.error=VIA_PARSE_ERROR;
+	vb1.hdr=vb1.name=vb1.version=vb1.transport=vb1.host=0;
+	vb1.params=vb1.comment=0;
+	vb1.next=0;
+	vb1.size=0;
+	memcpy(&vb2, &vb1, sizeof(struct via_body));
+
 	/* eat crlf from the beginning */
 	/* eat crlf from the beginning */
 	for (tmp=buf; (*tmp=='\n' || *tmp=='\r')&&
 	for (tmp=buf; (*tmp=='\n' || *tmp=='\r')&&
 			tmp-buf < len ; tmp++);
 			tmp-buf < len ; tmp++);
@@ -457,11 +470,13 @@ skip:
 
 
 #ifdef DEBUG
 #ifdef DEBUG
 	/* dump parsed data */
 	/* dump parsed data */
-	DBG(" first  via: <%s/%s/%s> <%s:%d>",
-			vb1.name, vb1.version, vb1.transport, vb1.host, vb1.port);
-	if (vb1.params)  DBG(";<%s>", vb1.params);
-	if (vb1.comment) DBG(" <%s>", vb1.comment);
-	DBG ("\n");
+	if (first_via){
+		DBG(" first  via: <%s/%s/%s> <%s:%d>",
+				vb1.name, vb1.version, vb1.transport, vb1.host, vb1.port);
+		if (vb1.params)  DBG(";<%s>", vb1.params);
+		if (vb1.comment) DBG(" <%s>", vb1.comment);
+		DBG ("\n");
+	}
 	if (second_via){
 	if (second_via){
 		DBG(" second via: <%s/%s/%s> <%s:%d>",
 		DBG(" second via: <%s/%s/%s> <%s:%d>",
 				vb2.name, vb2.version, vb2.transport, vb2.host, vb2.port);
 				vb2.name, vb2.version, vb2.transport, vb2.host, vb2.port);

+ 6 - 0
test/bad_via1.sip

@@ -0,0 +1,6 @@
+INVITE sip:[email protected] SIP/2.0/UDP
+Via  : SIP  /   2.0
+ /UDP
+    193.175.133.193
+
+

+ 4 - 0
test/bad_via2.sip

@@ -0,0 +1,4 @@
+INVITE sip:[email protected] SIP/2.0/UDP
+V: SIP/2.0/UDP 193.175.133.193
+
+

+ 3 - 0
test/bad_via3.sip

@@ -0,0 +1,3 @@
+INVITE sip:[email protected] SIP/2.0/UDP
+
+