64 lines
2.6 KiB
Diff
64 lines
2.6 KiB
Diff
From 574a5295e13cf01c34226d676104057468198616 Mon Sep 17 00:00:00 2001
|
|
From: Simon Pichugin <spichugi@redhat.com>
|
|
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
|
|
|