Check rng return value when generating libfast session COOKIEs

This commit is contained in:
Martin Willi
2012-07-16 14:53:37 +02:00
parent 71c41410fc
commit 76a98ee2a1
3 changed files with 28 additions and 7 deletions
+13 -1
View File
@@ -179,10 +179,16 @@ static session_entry_t *session_entry_create(private_dispatcher_t *this,
char *host)
{
session_entry_t *entry;
session_t *session;
session = load_session(this);
if (!session)
{
return NULL;
}
INIT(entry,
.cond = condvar_create(CONDVAR_TYPE_DEFAULT),
.session = load_session(this),
.session = session,
.host = strdup(host),
.used = time_monotonic(NULL),
);
@@ -324,6 +330,12 @@ static void dispatch(private_dispatcher_t *this)
else
{ /* create a new session if not found */
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);
this->sessions->put(this->sessions, sid, found);
}
+14 -6
View File
@@ -78,20 +78,24 @@ METHOD(session_t, add_filter, void,
/**
* 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];
rng_t *rng;
memset(buf, 0, sizeof(buf));
memset(this->sid, 0, sizeof(this->sid));
rng = lib->crypto->create_rng(lib->crypto, RNG_WEAK);
if (rng)
{
rng->get_bytes(rng, sizeof(buf), buf);
rng->destroy(rng);
return FALSE;
}
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);
return TRUE;
}
/**
@@ -212,7 +216,11 @@ session_t *session_create(context_t *context)
.filters = linked_list_create(),
.context = context,
);
create_sid(this);
if (!create_sid(this))
{
destroy(this);
return NULL;
}
return &this->public;
}
+1
View File
@@ -70,6 +70,7 @@ struct session_t {
* Create a session new session.
*
* @param context user defined session context instance
* @return client session, NULL on error
*/
session_t *session_create(context_t *context);