Fix locking in nm_creds_t.create_shared_enumerator.

This commit is contained in:
Tobias Brunner
2011-10-03 19:32:14 +02:00
parent 65a071568c
commit 8107d9f480
+11 -6
View File
@@ -270,24 +270,26 @@ METHOD(credential_set_t, create_shared_enumerator, enumerator_t*,
shared_enumerator_t *enumerator; shared_enumerator_t *enumerator;
chunk_t key; chunk_t key;
this->lock->read_lock(this->lock);
switch (type) switch (type)
{ {
case SHARED_EAP: case SHARED_EAP:
case SHARED_IKE: case SHARED_IKE:
if (!this->pass || !this->user) if (!this->pass || !this->user)
{ {
return NULL; goto no_secret;
} }
if (me && !me->equals(me, this->user)) if (me && !me->equals(me, this->user))
{ {
return NULL; goto no_secret;
} }
key = chunk_create(this->pass, strlen(this->pass)); key = chunk_create(this->pass, strlen(this->pass));
break; break;
case SHARED_PRIVATE_KEY_PASS: case SHARED_PRIVATE_KEY_PASS:
if (!this->keypass) if (!this->keypass)
{ {
return NULL; goto no_secret;
} }
key = chunk_create(this->keypass, strlen(this->keypass)); key = chunk_create(this->keypass, strlen(this->keypass));
break; break;
@@ -295,12 +297,12 @@ METHOD(credential_set_t, create_shared_enumerator, enumerator_t*,
if (!this->keypass || !me || if (!this->keypass || !me ||
!chunk_equals(me->get_encoding(me), this->keyid)) !chunk_equals(me->get_encoding(me), this->keyid))
{ {
return NULL; goto no_secret;
} }
key = chunk_create(this->keypass, strlen(this->keypass)); key = chunk_create(this->keypass, strlen(this->keypass));
break; break;
default: default:
return NULL; goto no_secret;
} }
INIT(enumerator, INIT(enumerator,
@@ -310,9 +312,12 @@ METHOD(credential_set_t, create_shared_enumerator, enumerator_t*,
}, },
.this = this, .this = this,
); );
this->lock->read_lock(this->lock);
enumerator->key = shared_key_create(type, chunk_clone(key)); enumerator->key = shared_key_create(type, chunk_clone(key));
return &enumerator->public; return &enumerator->public;
no_secret:
this->lock->unlock(this->lock);
return NULL;
} }
METHOD(nm_creds_t, add_certificate, void, METHOD(nm_creds_t, add_certificate, void,