[sr-dev] git:3.1: permissions(k): changed params from PVAR to SPVE type

Daniel-Constantin Mierla miconda at gmail.com
Fri Nov 26 13:29:54 CET 2010


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

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Thu Nov 25 22:25:01 2010 +0100

permissions(k): changed params from PVAR to SPVE type

- type of fixup params for allow_trusted() updated from PVAR to SPVE
- PVAR can be non-zero terminated string
- SPVE accepts also static string or combination of PVs
- adapted patch submitted by Alex Hermann for crash related to static
  protocol value, FS#102
(cherry picked from commit 18e67ca2d125f87b85c00eb74b057b9c010a8a26)

---

 modules_k/permissions/permissions.c |    4 +-
 modules_k/permissions/trusted.c     |   77 +++++++++++++++++------------------
 2 files changed, 39 insertions(+), 42 deletions(-)

diff --git a/modules_k/permissions/permissions.c b/modules_k/permissions/permissions.c
index 4d41817..5beb016 100644
--- a/modules_k/permissions/permissions.c
+++ b/modules_k/permissions/permissions.c
@@ -129,8 +129,8 @@ static cmd_export_t cmds[] = {
 		REQUEST_ROUTE | FAILURE_ROUTE},
 	{"allow_trusted",  (cmd_function)allow_trusted_0,  0, 0, 0,
 		REQUEST_ROUTE | FAILURE_ROUTE},
-	{"allow_trusted",  (cmd_function)allow_trusted_2,  2, fixup_pvar_pvar,
-	        fixup_free_pvar_pvar, REQUEST_ROUTE | FAILURE_ROUTE},
+	{"allow_trusted",  (cmd_function)allow_trusted_2,  2, fixup_spve_spve,
+	        fixup_free_spve_spve, REQUEST_ROUTE | FAILURE_ROUTE},
 	{"allow_uri",      (cmd_function)allow_uri, 2, double_fixup, 0,
 		REQUEST_ROUTE | FAILURE_ROUTE|LOCAL_ROUTE},
 	{"allow_address",  (cmd_function)allow_address, 3, fixup_igp_pvar_pvar,
diff --git a/modules_k/permissions/trusted.c b/modules_k/permissions/trusted.c
index 77545ad..33cae33 100644
--- a/modules_k/permissions/trusted.c
+++ b/modules_k/permissions/trusted.c
@@ -35,6 +35,7 @@
 #include "../../config.h"
 #include "../../lib/srdb1/db.h"
 #include "../../ip_addr.h"
+#include "../../mod_fix.h"
 #include "../../mem/shm_mem.h"
 #include "../../parser/msg_parser.h"
 #include "../../parser/parse_from.h"
@@ -462,51 +463,47 @@ int allow_trusted_0(struct sip_msg* _msg, char* str1, char* str2)
  */
 int allow_trusted_2(struct sip_msg* _msg, char* _src_ip_sp, char* _proto_sp) 
 {
-    pv_spec_t *src_ip_sp, *proto_sp;
-    pv_value_t pv_val;
-    char *src_ip, *proto;
+    str src_ip, proto;
     int proto_int;
 
-    src_ip_sp = (pv_spec_t *)_src_ip_sp;
-    proto_sp = (pv_spec_t *)_proto_sp;
-    
-    if (src_ip_sp && (pv_get_spec_value(_msg, src_ip_sp, &pv_val) == 0)) {
-	if (pv_val.flags & PV_VAL_STR) {
-	    src_ip = pv_val.rs.s;
-	} else {
-	    LM_ERR("src_ip pvar value is not string\n");
-	    return -1;
-	}
-    } else {
-	LM_ERR("src_ip pvar does not exist or has no value\n");
-	return -1;
+    if (_src_ip_sp==NULL
+			|| (fixup_get_svalue(_msg, (gparam_p)_src_ip_sp, &src_ip) != 0)) {
+		LM_ERR("src_ip param does not exist or has no value\n");
+		return -1;
     }
     
-    if (proto_sp && (pv_get_spec_value(_msg, proto_sp, &pv_val) == 0)) {
-	if (pv_val.flags & PV_VAL_STR) {
-	    strlower(&(pv_val.rs));
-	    proto = pv_val.rs.s;
-	} else {
-	    LM_ERR("proto pvar value is not string\n");
-	    return -1;
-	}
-    } else {
-	LM_ERR("proto pvar does not exist or has no value\n");
-	return -1;
+    if (_proto_sp==NULL
+			|| (fixup_get_svalue(_msg, (gparam_p)_proto_sp, &proto) != 0)) {
+		LM_ERR("proto param does not exist or has no value\n");
+		return -1;
     }
-
-    if (strcmp(proto, "udp") == 0) {
-	proto_int = PROTO_UDP;
-    } else if (strcmp(proto, "tcp") == 0) {
-	proto_int = PROTO_TCP;
-    } else if (strcmp(proto, "tls") == 0) {
-	proto_int = PROTO_TLS;
-    } else if (strcmp(proto, "sctp") == 0) {
-	proto_int = PROTO_SCTP;
-    } else {
-	LM_ERR("unknown protocol %s\n", proto);
-	return -1;
+	if(proto.len!=3 && proto.len!=4)
+		goto error;
+
+	switch(proto.s[0]) {
+		case 'u': case 'U':
+			if (proto.len==3 && strncasecmp(proto.s, "udp", 3) == 0) {
+				proto_int = PROTO_UDP;
+			} else goto error;
+		break;
+		case 't': case 'T':
+			if (proto.len==3 && strncasecmp(proto.s, "tcp", 3) == 0) {
+				proto_int = PROTO_TCP;
+			} else if (proto.len==3 && strncasecmp(proto.s, "tls", 3) == 0) {
+				proto_int = PROTO_TLS;
+			} else goto error;
+		break;
+		case 's': case 'S':
+			if (proto.len==4 && strncasecmp(proto.s, "sctp", 4) == 0) {
+				proto_int = PROTO_SCTP;
+			} else goto error;
+		break;
+		default:
+			goto error;
     }
 
-    return allow_trusted(_msg, src_ip, proto_int);
+    return allow_trusted(_msg, src_ip.s, proto_int);
+error:
+	LM_ERR("unknown protocol %.*s\n", proto.len, proto.s);
+	return -1;
 }




More information about the sr-dev mailing list