Skip to content

Commit

Permalink
ensure that ossl_obj_nid_lock is allocated before use
Browse files Browse the repository at this point in the history
external calls to OBJ_new_nid will fail on an attempt to lock the
ossl_obj_nid_lock as it won't have been initalized yet.

Bifurcate OBJ_new_nid into an external and internal variant, in which
the former calls ossl_obj_write_lock (ensuring that the nid_lock is
initalized), while OBJ_create (the sole internal caller) uses the latter
to avoid having to drop and re-acquire the lock

Fixes openssl#22337

Reviewed-by: Matt Caswell <[email protected]>
Reviewed-by: Tomas Mraz <[email protected]>
(Merged from openssl#22350)
  • Loading branch information
nhorman authored and t8m committed Oct 18, 2023
1 parent bd16091 commit cd920f8
Showing 1 changed file with 28 additions and 7 deletions.
35 changes: 28 additions & 7 deletions crypto/objects/obj_dat.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,25 +221,45 @@ void ossl_obj_cleanup_int(void)
objs_free_locks();
}

int OBJ_new_nid(int num)
/*
* Requires that the ossl_obj_lock be held
* if TSAN_REQUIRES_LOCKING defined
*/
static int obj_new_nid_unlocked(int num)
{
static TSAN_QUALIFIER int new_nid = NUM_NID;
#ifdef TSAN_REQUIRES_LOCKING
int i;

if (!CRYPTO_THREAD_write_lock(ossl_obj_nid_lock)) {
ERR_raise(ERR_LIB_OBJ, ERR_R_UNABLE_TO_GET_WRITE_LOCK);
return NID_undef;
}
i = new_nid;
new_nid += num;
CRYPTO_THREAD_unlock(ossl_obj_nid_lock);

return i;
#else
return tsan_add(&new_nid, num);
#endif
}

int OBJ_new_nid(int num)
{
#ifdef TSAN_REQUIRES_LOCKING
int i;

if (!ossl_obj_write_lock(1)) {
ERR_raise(ERR_LIB_OBJ, ERR_R_UNABLE_TO_GET_WRITE_LOCK);
return NID_undef;
}

i = obj_new_nid_unlocked(num);

ossl_obj_unlock(1);

return i;
#else
return obj_new_nid_unlocked(num);
#endif
}

static int ossl_obj_add_object(const ASN1_OBJECT *obj, int lock)
{
ASN1_OBJECT *o = NULL;
Expand Down Expand Up @@ -785,7 +805,8 @@ int OBJ_create(const char *oid, const char *sn, const char *ln)
goto err;
}

tmpoid->nid = OBJ_new_nid(1);
tmpoid->nid = obj_new_nid_unlocked(1);

if (tmpoid->nid == NID_undef)
goto err;

Expand Down

0 comments on commit cd920f8

Please sign in to comment.