changeset 389:0bd2a40ca008

Fix bad handling of session creation
author Sebastien Decugis <sdecugis@nict.go.jp>
date Fri, 29 May 2009 13:50:31 +0900
parents 1a4902b216f8
children 9d9c37868957
files extensions/radius_gw/rgw_extensions.c extensions/radius_gw/rgw_msg.c extensions/radius_gw/rgw_work.c
diffstat 3 files changed, 36 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/extensions/radius_gw/rgw_extensions.c	Fri May 29 12:57:43 2009 +0900
+++ b/extensions/radius_gw/rgw_extensions.c	Fri May 29 13:50:31 2009 +0900
@@ -353,7 +353,7 @@
 	struct radius_msg * rad_ans = NULL;
 	
 	TRACE_ENTRY("%p %p %p %p", rad, session, diam_msg, cli);
-	CHECK_PARAMS( rad && *rad && session && *session && diam_msg && *diam_msg && cli);
+	CHECK_PARAMS( rad && *rad && session && diam_msg && *diam_msg && cli);
 	
 	/* First, get the list of extensions for this message */
 	CHECK_FCT( get_accelerator(&head, (*rad)->radius.hdr->code, (*rad)->serv_type) );
--- a/extensions/radius_gw/rgw_msg.c	Fri May 29 12:57:43 2009 +0900
+++ b/extensions/radius_gw/rgw_msg.c	Fri May 29 13:50:31 2009 +0900
@@ -164,6 +164,9 @@
 	size_t or_len = 0;
 	char * si = NULL;
 	size_t si_len = 0;
+	char * un = NULL;
+	size_t un_len = 0;
+	
 	
 	char * fqdn;
 	char * realm;
@@ -184,6 +187,14 @@
 		char * attr_val = (char *)(attr + 1);
 		size_t attr_len = attr->length - sizeof(struct radius_attr_hdr);
 		
+		if ((attr->type == RADIUS_ATTR_USER_NAME) 
+				&& attr_len) {
+			TRACE_DEBUG(ANNOYING, "Found a User-Name attribute: '%.*s'", attr_len, attr_val);
+			un = attr_val;
+			un_len = attr_len;
+			continue;
+		}
+		
 		if ((attr->type == RADIUS_ATTR_STATE) 
 				&& (attr_len > pref_len + 5 /* for the '/'s and non empty strings */ ) 
 				&& ! strncmp(attr_val, prefix, pref_len)) { /* should we make it strncasecmp? */
@@ -230,28 +241,34 @@
 	if (si_len) {
 		CHECK_FCT( sess_fromsid ( si, si_len, session, &idx) );
 	} else {
-		/* If not found, create a new Session-Id. The format is: {fqdn;hi32;lo32;gateway@localhost} */
-		const char * pfx = "gateway@";
-		CHECK_MALLOC( sess_str = malloc(strlen(fqdn) + 1 /* ';' */ + strlen(pfx) + strlen(g_pconf->diameter_identity) + 1 /* '\0' */) );
-		sprintf(sess_str, "%s;%s%s", fqdn, pfx, g_pconf->diameter_identity);
-		CHECK_FCT( sess_new(session, SESSION_NEW_OTHER, sess_str) );
-		free(sess_str);
-		idx = 1;
+		if (un) {
+			/* If not found, create a new Session-Id. The format is: {fqdn;hi32;lo32;username;diamid} */
+			CHECK_MALLOC( sess_str = malloc(strlen(fqdn) + 1 /* ';' */ + un_len + 1 /* ';' */ + strlen(g_pconf->diameter_identity) + 1 /* '\0' */) );
+			sprintf(sess_str, "%s;%.*s;%s", fqdn, un_len, un, g_pconf->diameter_identity);
+			CHECK_FCT( sess_new(session, SESSION_NEW_OTHER, sess_str) );
+			free(sess_str);
+			idx = 1;
+		}
 	}
 	
-	CHECK_FCT( sess_getsid(*session, &sess_str) );
-	TRACE_DEBUG(FULL, "Session '%s' has been successfully %s.", sess_str, idx ? "created" : "retrieved");
-	
 	/* Create an empty Diameter message so that extensions can store their AVPs */
 	CHECK_FCT(  msg_new ( NULL, MSGFL_ALLOW_ETEID, diam )  );
 	
-	/* Add the Session-Id AVP as first AVP */
-	CHECK_FCT( msg_avp_new ( rm_sess_id, 0, &avp ) );
-	memset(&avp_val, 0, sizeof(avp_val));
-	avp_val.os.data = (unsigned char *)sess_str;
-	avp_val.os.len = strlen(sess_str);
-	CHECK_FCT( msg_avp_setvalue ( avp, &avp_val ) );
-	CHECK_FCT( msg_avp_add ( *diam, MSG_BRW_FIRST_CHILD, avp) );
+	if (*session) {
+		CHECK_FCT( sess_getsid(*session, &sess_str) );
+		TRACE_DEBUG(FULL, "Session '%s' has been successfully %s.", sess_str, idx ? "created" : "retrieved");
+		
+		/* Add the Session-Id AVP as first AVP */
+		CHECK_FCT( msg_avp_new ( rm_sess_id, 0, &avp ) );
+		memset(&avp_val, 0, sizeof(avp_val));
+		avp_val.os.data = (unsigned char *)sess_str;
+		avp_val.os.len = strlen(sess_str);
+		CHECK_FCT( msg_avp_setvalue ( avp, &avp_val ) );
+		CHECK_FCT( msg_avp_add ( *diam, MSG_BRW_FIRST_CHILD, avp) );
+
+	} else {
+		TRACE_DEBUG(FULL, "No session has been created for this message");
+	}
 	
 	/* Add the Origin-Host as next AVP */
 	CHECK_FCT( msg_avp_new ( rm_orig_host, 0, &avp ) );
--- a/extensions/radius_gw/rgw_work.c	Fri May 29 12:57:43 2009 +0900
+++ b/extensions/radius_gw/rgw_work.c	Fri May 29 13:50:31 2009 +0900
@@ -203,8 +203,7 @@
 		if (pb) {
 			/* Something went wrong during the conversion */
 			if (session) {
-				CHECK_FCT_DO( sess_unlink(session), );
-				session = NULL;
+				CHECK_FCT_DO( sess_unlink(&session), );
 			}
 			
 			if (diam_msg) {
"Welcome to our mercurial repository"