Check rng return value when generating libfast session COOKIEs
This commit is contained in:
@@ -179,10 +179,16 @@ static session_entry_t *session_entry_create(private_dispatcher_t *this,
|
|||||||
char *host)
|
char *host)
|
||||||
{
|
{
|
||||||
session_entry_t *entry;
|
session_entry_t *entry;
|
||||||
|
session_t *session;
|
||||||
|
|
||||||
|
session = load_session(this);
|
||||||
|
if (!session)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
INIT(entry,
|
INIT(entry,
|
||||||
.cond = condvar_create(CONDVAR_TYPE_DEFAULT),
|
.cond = condvar_create(CONDVAR_TYPE_DEFAULT),
|
||||||
.session = load_session(this),
|
.session = session,
|
||||||
.host = strdup(host),
|
.host = strdup(host),
|
||||||
.used = time_monotonic(NULL),
|
.used = time_monotonic(NULL),
|
||||||
);
|
);
|
||||||
@@ -324,6 +330,12 @@ static void dispatch(private_dispatcher_t *this)
|
|||||||
else
|
else
|
||||||
{ /* create a new session if not found */
|
{ /* create a new session if not found */
|
||||||
found = session_entry_create(this, request->get_host(request));
|
found = session_entry_create(this, request->get_host(request));
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
request->destroy(request);
|
||||||
|
this->mutex->unlock(this->mutex);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
sid = found->session->get_sid(found->session);
|
sid = found->session->get_sid(found->session);
|
||||||
this->sessions->put(this->sessions, sid, found);
|
this->sessions->put(this->sessions, sid, found);
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-6
@@ -78,20 +78,24 @@ METHOD(session_t, add_filter, void,
|
|||||||
/**
|
/**
|
||||||
* Create a session ID and a cookie
|
* Create a session ID and a cookie
|
||||||
*/
|
*/
|
||||||
static void create_sid(private_session_t *this)
|
static bool create_sid(private_session_t *this)
|
||||||
{
|
{
|
||||||
char buf[COOKIE_LEN];
|
char buf[COOKIE_LEN];
|
||||||
rng_t *rng;
|
rng_t *rng;
|
||||||
|
|
||||||
memset(buf, 0, sizeof(buf));
|
|
||||||
memset(this->sid, 0, sizeof(this->sid));
|
|
||||||
rng = lib->crypto->create_rng(lib->crypto, RNG_WEAK);
|
rng = lib->crypto->create_rng(lib->crypto, RNG_WEAK);
|
||||||
if (rng)
|
if (rng)
|
||||||
{
|
{
|
||||||
rng->get_bytes(rng, sizeof(buf), buf);
|
return FALSE;
|
||||||
rng->destroy(rng);
|
|
||||||
}
|
}
|
||||||
|
if (!rng->get_bytes(rng, sizeof(buf), buf))
|
||||||
|
{
|
||||||
|
rng->destroy(rng);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
rng->destroy(rng);
|
||||||
chunk_to_hex(chunk_create(buf, sizeof(buf)), this->sid, FALSE);
|
chunk_to_hex(chunk_create(buf, sizeof(buf)), this->sid, FALSE);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -212,7 +216,11 @@ session_t *session_create(context_t *context)
|
|||||||
.filters = linked_list_create(),
|
.filters = linked_list_create(),
|
||||||
.context = context,
|
.context = context,
|
||||||
);
|
);
|
||||||
create_sid(this);
|
if (!create_sid(this))
|
||||||
|
{
|
||||||
|
destroy(this);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return &this->public;
|
return &this->public;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ struct session_t {
|
|||||||
* Create a session new session.
|
* Create a session new session.
|
||||||
*
|
*
|
||||||
* @param context user defined session context instance
|
* @param context user defined session context instance
|
||||||
|
* @return client session, NULL on error
|
||||||
*/
|
*/
|
||||||
session_t *session_create(context_t *context);
|
session_t *session_create(context_t *context);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user