# HG changeset patch # User Sebastien Decugis # Date 1243572631 -32400 # Node ID 0bd2a40ca008f17fb67ae14505228e3f53bc3299 # Parent 1a4902b216f8041e358630ab459df19bc32571c2 Fix bad handling of session creation diff -r 1a4902b216f8 -r 0bd2a40ca008 extensions/radius_gw/rgw_extensions.c --- 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) ); diff -r 1a4902b216f8 -r 0bd2a40ca008 extensions/radius_gw/rgw_msg.c --- 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 ) ); diff -r 1a4902b216f8 -r 0bd2a40ca008 extensions/radius_gw/rgw_work.c --- 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) {