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) 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
View File
@@ -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;
} }
+1
View File
@@ -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);