فهرست منبع

- fix (redesign) how credentials realm is extracted from msg / fixed at startup
reported by Alfred E. Heggestad
When compiling with gcc-3.4.3 on solaris/sparc I get some warnings:
select_core.c: In function `get_credentials':
select_core.c:896: warning: cast to pointer from integer of different size
select_core.c: In function `select_auth':
select_core.c:950: warning: cast from pointer to integer of different size
select_core.c: In function `select_auth_param':
select_core.c:963: warning: cast from pointer to integer of different size

- when select is unresolvable during fixing print its name in the error message to easily correct script

Michal Matyska 17 سال پیش
والد
کامیت
8aa67e4da0
2فایلهای تغییر یافته به همراه27 افزوده شده و 30 حذف شده
  1. 4 2
      select.c
  2. 23 28
      select_core.c

+ 4 - 2
select.c

@@ -74,8 +74,10 @@ int select_level = 0;
 int w_parse_select(char**p, select_t* sel)
 {
 	str name;
+	char* select_name;
 	
 	if (**p=='@') (*p)++;
+	select_name=*p;
 	sel->n=0;
 	while (isalpha((unsigned char)*(*p))) {
 		if (sel->n > MAX_SELECT_PARAMS -2) {
@@ -132,12 +134,12 @@ int w_parse_select(char**p, select_t* sel)
 		(*p)++;
 	};
 	if (sel->n==0) {
-		ERR("parse_select: invalid select\n");
+		ERR("parse_select: invalid select '%s'\n", select_name);
 		goto error;
 	};
 	DBG("parse_select: end, total elements: %d, calling resolve_select\n", sel->n);
 	if (resolve_select(sel)<0) {
-		ERR("parse_select: error while resolve_select\n");
+		ERR("parse_select: error while resolve_select '%s'\n", select_name);
 		goto error;
 	}
 	return 0;

+ 23 - 28
select_core.c

@@ -883,36 +883,38 @@ int select_cseq_method(str* res, select_t* s, struct sip_msg* msg)
 	return 0;
 }
 
-static struct hdr_field* get_credentials(struct sip_msg* msg, select_t* s)
+int get_credentials(struct sip_msg* msg, select_t* s, struct hdr_field** hdr)
 {
 	int ret;
-	struct hdr_field* hdr;
 	str realm;
 	hdr_types_t hdr_type;
 
+	*hdr = NULL;
+
 	if (!msg) {
 		/* fix-up call check domain for fparam conversion */
-		int ret;
 		void * ptr;
 		char chr;
 		ptr=(void *)(s->params[1].v.s.s);
 		chr=s->params[1].v.s.s[s->params[1].v.s.len];
 		s->params[1].v.s.s[s->params[1].v.s.len]=0;
 		ret=fixup_var_str_12(&ptr,0);
-		s->params[1].v.s.s[s->params[1].v.s.len]=chr;
-		s->params[1].v.p=ptr;
-		s->params[1].type=SEL_PARAM_PTR;
-		return (void*)ret;
+		if (ret>=0) {
+			s->params[1].v.s.s[s->params[1].v.s.len]=chr;
+			s->params[1].v.p=ptr;
+			s->params[1].type=SEL_PARAM_PTR;
+		}
+		return ret;
 	}
 	
 
-	     /* Try to find credentials with corresponding realm
-	      * in the message, parse them and return pointer to
-	      * parsed structure
-	      */
+	/* Try to find credentials with corresponding realm
+	 * in the message, parse them and return pointer to
+	 * parsed structure
+	 */
 	if (s->params[1].type==SEL_PARAM_PTR) {
 		if (get_str_fparam(&realm, msg, s->params[1].v.p)<0)
-			return 0;
+			return -1;
 	} else {
 		realm = s->params[1].v.s;
 	}
@@ -928,23 +930,17 @@ static struct hdr_field* get_credentials(struct sip_msg* msg, select_t* s)
 
 	default:
 		BUG("Unexpected parameter value \"%d\"\n", s->params[0].v.i);
-		return 0;
-	}
-
-	ret = find_credentials(msg, &realm, hdr_type, &hdr);
-	if (ret < 0) {
-		ERR("Error while looking for credentials\n");
-		return 0;
-	} else if (ret > 0) {
-		return 0;
+		return -1;
 	}
 
-	return hdr;
+	ret = find_credentials(msg, &realm, hdr_type, hdr);
+	return ret;
 }
 
 
 int select_auth(str* res, select_t* s, struct sip_msg* msg)
 {
+	int ret;
 	struct hdr_field* hdr;
 
 	if (s->n != 2 && s->params[1].type != SEL_PARAM_STR
@@ -955,22 +951,21 @@ int select_auth(str* res, select_t* s, struct sip_msg* msg)
 		return -1;
 	}
 
-	hdr = get_credentials(msg, s);
-	if (!msg && !res) return (int)hdr;
-	if (!hdr) return -1;
+	ret = get_credentials(msg, s, &hdr);
+	if (!hdr) return ret;
 	RETURN0_res(hdr->body);
 }
 
 int select_auth_param(str* res, select_t* s, struct sip_msg* msg)
 {
+	int ret;
 	struct hdr_field* hdr;
 	dig_cred_t* cred;
 
 	if ((s->n != 3 && s->n != 4) || (s->params[s->n - 1].type != SEL_PARAM_DIV)) return -1;
 
-	hdr = get_credentials(msg, s);
-	if (!msg && !res) return (int)hdr;
-	if (!hdr) return 1;
+	ret = get_credentials(msg, s, &hdr);
+	if (!hdr) return ret;
 	cred = &((auth_body_t*)hdr->parsed)->digest;
 
 	switch(s->params[s->n - 1].v.i) {