From 574a5295e13cf01c34226d676104057468198616 Mon Sep 17 00:00:00 2001 From: Simon Pichugin Date: Fri, 4 Oct 2024 08:55:11 -0700 Subject: [PATCH] Issue 6339 - Address Coverity scan issues in memberof and bdb_layer (#6353) Description: Add null check for memberof attribute in memberof.c Fix memory leak by freeing 'cookie' in memberof.c Add null check for database environment in bdb_layer.c Fix race condition by adding mutex lock/unlock in bdb_layer.c Fixes: https://github.com/389ds/389-ds-base/issues/6339 Reviewed by: @progier389, @tbordaz (Thanks!) --- ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c index b04cd68e2..4f069197e 100644 --- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c +++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c @@ -6987,6 +6987,7 @@ bdb_public_private_open(backend *be, const char *db_filename, int rw, dbi_env_t bdb_config *conf = (bdb_config *)li->li_dblayer_config; bdb_db_env **ppEnv = (bdb_db_env**)&priv->dblayer_env; char dbhome[MAXPATHLEN]; + bdb_db_env *pEnv = NULL; DB_ENV *bdb_env = NULL; DB *bdb_db = NULL; struct stat st = {0}; @@ -7036,7 +7037,13 @@ bdb_public_private_open(backend *be, const char *db_filename, int rw, dbi_env_t conf->bdb_tx_max = 50; rc = bdb_start(li, DBLAYER_NORMAL_MODE); if (rc == 0) { - bdb_env = ((struct bdb_db_env*)(priv->dblayer_env))->bdb_DB_ENV; + pEnv = (bdb_db_env *)priv->dblayer_env; + if (pEnv == NULL) { + fprintf(stderr, "bdb_public_private_open: dbenv is not available (0x%p) for database %s\n", + (void *)pEnv, db_filename ? db_filename : "unknown"); + return EINVAL; + } + bdb_env = pEnv->bdb_DB_ENV; } } else { /* Setup minimal environment */ @@ -7080,8 +7087,12 @@ bdb_public_private_close(struct ldbminfo *li, dbi_env_t **env, dbi_db_t **db) if (priv) { /* Detect if db is fully set up in read write mode */ bdb_db_env *pEnv = (bdb_db_env *)priv->dblayer_env; - if (pEnv && pEnv->bdb_thread_count>0) { - rw = 1; + if (pEnv) { + pthread_mutex_lock(&pEnv->bdb_thread_count_lock); + if (pEnv->bdb_thread_count > 0) { + rw = 1; + } + pthread_mutex_unlock(&pEnv->bdb_thread_count_lock); } } if (rw == 0) { -- 2.49.0