[OpenSER-Devel] is_privacy() and privacy parser bug

Bayan Towfiq bayan at flowroute.com
Fri Jul 11 10:39:55 CEST 2008


The privacy parser is case sensitive, only accepting lowercase privacy  
values which causes problems for headers such as:

"Privacy: Id"
or
"Privacy: ID"

only
"Privacy: id"
would be accepted.

I've attached a diff that fixes this for trunk.

Also see that in the parser strncmp is used in msg_parser and  
parse_uri at the following locations:

parser # grep strncmp *
msg_parser.h:	if ((len+2<=msg->len) && (strncmp(CRLF,msg- 
 >unparsed,CRLF_LEN)==0) )
parse_uri.c:				(strncmp(uri->user_param_val.s, "phone", 5) == 0)) {
parse_uri.c:				(strncmp(uri->user_param_val.s, "phone", 5) == 0)) {

I think this should be changed to strncasecmp as well. The diff  
doesn't included that.

--
Bayan Towfiq
www.flowroute.com

-- ../../openser-trunk/parser/parse_privacy.c	2008-06-23  
16:11:50.000000000 -0700
+++ parse_privacy.c	2008-07-11 01:24:54.000000000 -0700
@@ -49,9 +49,10 @@
      switch (start[0]) {

      case 'c':
+    case 'C':
  	if(max_len < 8)
  	    return 0;
-	if (strncmp(start, "critical", 8) == 0) {
+	if (strncasecmp(start, "critical", 8) == 0) {
  	    *value = PRIVACY_CRITICAL;
  	    len = 8;
  	    break;
@@ -60,16 +61,17 @@
  	}

      case 'h':
+    case 'H':
  	if (max_len < 6)
  	    return 0;
-	if (strncmp(start, "header", 6) == 0) {
+	if (strncasecmp(start, "header", 6) == 0) {
  	    *value = PRIVACY_HEADER;
  	    len = 6;
  	    break;
  	}
  	if (max_len < 7)
  	    return 0;
-	if (strncmp(start, "history", 7) == 0) {
+	if (strncasecmp(start, "history", 7) == 0) {
  	    *value = PRIVACY_HISTORY;
  	    len = 7;
  	    break;
@@ -78,9 +80,10 @@
  	}

      case 'i':
+    case 'I':
  	if(max_len < 2)
  	    return 0;
-	if (start[1] == 'd') {
+	if (start[1] == 'd' || start[1] == 'D') {
  	    *value = PRIVACY_ID;
  	    len = 2;
  	    break;
@@ -89,9 +92,10 @@
  	}

      case 'n':
+    case 'N':
  	if(max_len < 4)
  	    return 0;
-	if (strncmp(start, "none", 4) == 0) {
+	if (strncasecmp(start, "none", 4) == 0) {
  	    *value = PRIVACY_NONE;
  	    len = 4;
  	    break;
@@ -100,9 +104,10 @@
  	}

      case 's':
+    case 'S':
  	if(max_len < 7)
  	    return 0;
-	if (strncmp(start, "session", 7) == 0) {
+	if (strncasecmp(start, "session", 7) == 0) {
  	    *value = PRIVACY_SESSION;
  	    len = 7;
  	    break;
@@ -111,9 +116,10 @@
  	}

      case 'u':
+    case 'U':
  	if(max_len < 4)
  	    return 0;
-	if (strncmp(start, "user", 4) == 0) {
+	if (strncasecmp(start, "user", 4) == 0) {
  	    *value = PRIVACY_USER;
  	    len = 4;
  	    break;




More information about the Devel mailing list