2
0
Эх сурвалжийг харах

- 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 жил өмнө
parent
commit
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)
 int w_parse_select(char**p, select_t* sel)
 {
 {
 	str name;
 	str name;
+	char* select_name;
 	
 	
 	if (**p=='@') (*p)++;
 	if (**p=='@') (*p)++;
+	select_name=*p;
 	sel->n=0;
 	sel->n=0;
 	while (isalpha((unsigned char)*(*p))) {
 	while (isalpha((unsigned char)*(*p))) {
 		if (sel->n > MAX_SELECT_PARAMS -2) {
 		if (sel->n > MAX_SELECT_PARAMS -2) {
@@ -132,12 +134,12 @@ int w_parse_select(char**p, select_t* sel)
 		(*p)++;
 		(*p)++;
 	};
 	};
 	if (sel->n==0) {
 	if (sel->n==0) {
-		ERR("parse_select: invalid select\n");
+		ERR("parse_select: invalid select '%s'\n", select_name);
 		goto error;
 		goto error;
 	};
 	};
 	DBG("parse_select: end, total elements: %d, calling resolve_select\n", sel->n);
 	DBG("parse_select: end, total elements: %d, calling resolve_select\n", sel->n);
 	if (resolve_select(sel)<0) {
 	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;
 		goto error;
 	}
 	}
 	return 0;
 	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;
 	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;
 	int ret;
-	struct hdr_field* hdr;
 	str realm;
 	str realm;
 	hdr_types_t hdr_type;
 	hdr_types_t hdr_type;
 
 
+	*hdr = NULL;
+
 	if (!msg) {
 	if (!msg) {
 		/* fix-up call check domain for fparam conversion */
 		/* fix-up call check domain for fparam conversion */
-		int ret;
 		void * ptr;
 		void * ptr;
 		char chr;
 		char chr;
 		ptr=(void *)(s->params[1].v.s.s);
 		ptr=(void *)(s->params[1].v.s.s);
 		chr=s->params[1].v.s.s[s->params[1].v.s.len];
 		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;
 		s->params[1].v.s.s[s->params[1].v.s.len]=0;
 		ret=fixup_var_str_12(&ptr,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 (s->params[1].type==SEL_PARAM_PTR) {
 		if (get_str_fparam(&realm, msg, s->params[1].v.p)<0)
 		if (get_str_fparam(&realm, msg, s->params[1].v.p)<0)
-			return 0;
+			return -1;
 	} else {
 	} else {
 		realm = s->params[1].v.s;
 		realm = s->params[1].v.s;
 	}
 	}
@@ -928,23 +930,17 @@ static struct hdr_field* get_credentials(struct sip_msg* msg, select_t* s)
 
 
 	default:
 	default:
 		BUG("Unexpected parameter value \"%d\"\n", s->params[0].v.i);
 		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 select_auth(str* res, select_t* s, struct sip_msg* msg)
 {
 {
+	int ret;
 	struct hdr_field* hdr;
 	struct hdr_field* hdr;
 
 
 	if (s->n != 2 && s->params[1].type != SEL_PARAM_STR
 	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;
 		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);
 	RETURN0_res(hdr->body);
 }
 }
 
 
 int select_auth_param(str* res, select_t* s, struct sip_msg* msg)
 int select_auth_param(str* res, select_t* s, struct sip_msg* msg)
 {
 {
+	int ret;
 	struct hdr_field* hdr;
 	struct hdr_field* hdr;
 	dig_cred_t* cred;
 	dig_cred_t* cred;
 
 
 	if ((s->n != 3 && s->n != 4) || (s->params[s->n - 1].type != SEL_PARAM_DIV)) return -1;
 	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;
 	cred = &((auth_body_t*)hdr->parsed)->digest;
 
 
 	switch(s->params[s->n - 1].v.i) {
 	switch(s->params[s->n - 1].v.i) {