The branch, master has been updated
via f7812173e40 lib:ldb:tests: Fix memory leaks in
ldb_lmdb_free_list_test
via b6bcd39986b lib:ldb:tests: Avoid memory leaks in ldb_kv_ops test
from 4de3c7b42fc WHATSNEW: Mention MR 4212
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit f7812173e40b7c5a019ddfd6cc331a5c5d473611
Author: Andreas Schneider <[email protected]>
Date: Mon Oct 14 15:52:53 2024 +0200
lib:ldb:tests: Fix memory leaks in ldb_lmdb_free_list_test
Found by Leak Sanitizer
Signed-off-by: Andreas Schneider <[email protected]>
Reviewed-by: Douglas Bagnall <[email protected]>
Reviewed-by: Anoop C S <[email protected]>
Autobuild-User(master): Anoop C S <[email protected]>
Autobuild-Date(master): Wed Oct 29 12:18:43 UTC 2025 on atb-devel-224
commit b6bcd39986b6332569335de4bbcfa3a66b4ac559
Author: Andreas Schneider <[email protected]>
Date: Mon Oct 14 15:33:29 2024 +0200
lib:ldb:tests: Avoid memory leaks in ldb_kv_ops test
Detected by Leak Sanitizer.
Signed-off-by: Andreas Schneider <[email protected]>
Reviewed-by: Douglas Bagnall <[email protected]>
Reviewed-by: Anoop C S <[email protected]>
-----------------------------------------------------------------------
Summary of changes:
lib/ldb/tests/ldb_kv_ops_test.c | 42 +++++++++++++++++++++++++++------
lib/ldb/tests/ldb_lmdb_free_list_test.c | 20 ++++++++++------
2 files changed, 48 insertions(+), 14 deletions(-)
Changeset truncated at 500 lines:
diff --git a/lib/ldb/tests/ldb_kv_ops_test.c b/lib/ldb/tests/ldb_kv_ops_test.c
index 6badff98cfb..6e011701ecd 100644
--- a/lib/ldb/tests/ldb_kv_ops_test.c
+++ b/lib/ldb/tests/ldb_kv_ops_test.c
@@ -196,7 +196,9 @@ static int parse(struct ldb_val key,
{
struct ldb_val* read = private_data;
- /* Yes, we leak this. That is OK */
+ /*
+ * This should not leak if possible, please check with Leak Sanitizer.
+ */
read->data = talloc_size(NULL,
data.length);
assert_non_null(read->data);
@@ -238,7 +240,7 @@ static void test_add_get(void **state)
.length = sizeof(value)
};
- struct ldb_val read;
+ struct ldb_val read = {};
int rcode;
int flags = 0;
@@ -276,6 +278,7 @@ static void test_add_get(void **state)
assert_int_equal(sizeof(value), read.length);
assert_memory_equal(value, read.data, sizeof(value));
+ TALLOC_FREE(read.data);
/*
* Now check that the error code we return in the
@@ -314,7 +317,7 @@ static void test_read_outside_transaction(void **state)
.length = sizeof(value)
};
- struct ldb_val read;
+ struct ldb_val read = {};
int flags = 0;
TALLOC_CTX *tmp_ctx;
@@ -346,6 +349,7 @@ static void test_read_outside_transaction(void **state)
*/
ret = ldb_kv->kv_ops->fetch_and_parse(ldb_kv, key, parse, &read);
assert_int_equal(ret, LDB_ERR_PROTOCOL_ERROR);
+ TALLOC_FREE(read.data);
talloc_free(tmp_ctx);
}
@@ -371,7 +375,7 @@ static void test_delete(void **state)
.length = sizeof(value)
};
- struct ldb_val read;
+ struct ldb_val read = {};
int flags = 0;
TALLOC_CTX *tmp_ctx;
@@ -406,6 +410,7 @@ static void test_delete(void **state)
assert_int_equal(ret, 0);
assert_int_equal(sizeof(value), read.length);
assert_memory_equal(value, read.data, sizeof(value));
+ TALLOC_FREE(read.data);
ret = ldb_kv->kv_ops->unlock_read(test_ctx->ldb->modules);
assert_int_equal(ret, 0);
@@ -434,6 +439,7 @@ static void test_delete(void **state)
assert_int_equal(ret, 0);
ret = ldb_kv->kv_ops->fetch_and_parse(ldb_kv, key, parse, &read);
assert_int_equal(ret, LDB_ERR_NO_SUCH_OBJECT);
+ TALLOC_FREE(read.data);
ret = ldb_kv->kv_ops->unlock_read(test_ctx->ldb->modules);
assert_int_equal(ret, 0);
@@ -462,7 +468,7 @@ static void test_transaction_abort_write(void **state)
.length = sizeof(value)
};
- struct ldb_val read;
+ struct ldb_val read = {};
int flags = 0;
TALLOC_CTX *tmp_ctx;
@@ -489,6 +495,7 @@ static void test_transaction_abort_write(void **state)
assert_int_equal(ret, 0);
assert_int_equal(sizeof(value), read.length);
assert_memory_equal(value, read.data, sizeof(value));
+ TALLOC_FREE(read.data);
/*
@@ -504,6 +511,7 @@ static void test_transaction_abort_write(void **state)
assert_int_equal(ret, 0);
ret = ldb_kv->kv_ops->fetch_and_parse(ldb_kv, key, parse, &read);
assert_int_equal(ret, LDB_ERR_NO_SUCH_OBJECT);
+ TALLOC_FREE(read.data);
ret = ldb_kv->kv_ops->unlock_read(test_ctx->ldb->modules);
assert_int_equal(ret, 0);
@@ -532,7 +540,7 @@ static void test_transaction_abort_delete(void **state)
.length = sizeof(value)
};
- struct ldb_val read;
+ struct ldb_val read = {};
int flags = 0;
TALLOC_CTX *tmp_ctx;
@@ -567,6 +575,7 @@ static void test_transaction_abort_delete(void **state)
assert_int_equal(ret, 0);
assert_int_equal(sizeof(value), read.length);
assert_memory_equal(value, read.data, sizeof(value));
+ TALLOC_FREE(read.data);
ret = ldb_kv->kv_ops->unlock_read(test_ctx->ldb->modules);
assert_int_equal(ret, 0);
@@ -587,6 +596,7 @@ static void test_transaction_abort_delete(void **state)
*/
ret = ldb_kv->kv_ops->fetch_and_parse(ldb_kv, key, parse, &read);
assert_int_equal(ret, LDB_ERR_NO_SUCH_OBJECT);
+ TALLOC_FREE(read.data);
/*
* Abort the transaction
@@ -603,6 +613,7 @@ static void test_transaction_abort_delete(void **state)
assert_int_equal(ret, 0);
assert_int_equal(sizeof(value), read.length);
assert_memory_equal(value, read.data, sizeof(value));
+ TALLOC_FREE(read.data);
ret = ldb_kv->kv_ops->unlock_read(test_ctx->ldb->modules);
assert_int_equal(ret, 0);
@@ -667,7 +678,7 @@ static void test_delete_outside_transaction(void **state)
.length = sizeof(value)
};
- struct ldb_val read;
+ struct ldb_val read = {};
int flags = 0;
TALLOC_CTX *tmp_ctx;
@@ -702,6 +713,7 @@ static void test_delete_outside_transaction(void **state)
assert_int_equal(ret, 0);
assert_int_equal(sizeof(value), read.length);
assert_memory_equal(value, read.data, sizeof(value));
+ TALLOC_FREE(read.data);
ret = ldb_kv->kv_ops->unlock_read(test_ctx->ldb->modules);
assert_int_equal(ret, 0);
@@ -720,6 +732,7 @@ static void test_delete_outside_transaction(void **state)
assert_int_equal(ret, 0);
assert_int_equal(sizeof(value), read.length);
assert_memory_equal(value, read.data, sizeof(value));
+ TALLOC_FREE(read.data);
ret = ldb_kv->kv_ops->unlock_read(test_ctx->ldb->modules);
assert_int_equal(ret, 0);
@@ -1163,6 +1176,7 @@ static void test_write_transaction_isolation(void **state)
}
if ((strlen(VAL1) + 1) != val.length) {
+ TALLOC_FREE(val.data);
print_error(__location__": KEY1 value lengths different"
", expected (%d) actual(%d)\n",
(int)(strlen(VAL1) + 1), (int)val.length);
@@ -1173,8 +1187,10 @@ static void test_write_transaction_isolation(void
**state)
"expected (%s) actual(%s)\n",
VAL1,
val.data);
+ TALLOC_FREE(val.data);
exit(LDB_ERR_OPERATIONS_ERROR);
}
+ TALLOC_FREE(val.data);
ret = ldb_kv->kv_ops->unlock_read(ldb->modules);
if (ret != LDB_SUCCESS) {
@@ -1197,6 +1213,7 @@ static void test_write_transaction_isolation(void **state)
}
ret = ldb_kv->kv_ops->fetch_and_parse(ldb_kv, key, parse, &val);
+ TALLOC_FREE(val.data);
if (ret != LDB_ERR_NO_SUCH_OBJECT) {
print_error(__location__": fetch_and_parse returned "
"(%d)\n",
@@ -1252,6 +1269,7 @@ static void test_write_transaction_isolation(void **state)
}
if ((strlen(VAL1) + 1) != val.length) {
+ TALLOC_FREE(val.data);
print_error(__location__": KEY1 value lengths different"
", expected (%d) actual(%d)\n",
(int)(strlen(VAL1) + 1), (int)val.length);
@@ -1262,8 +1280,10 @@ static void test_write_transaction_isolation(void
**state)
"expected (%s) actual(%s)\n",
VAL1,
val.data);
+ TALLOC_FREE(val.data);
exit(LDB_ERR_OPERATIONS_ERROR);
}
+ TALLOC_FREE(val.data);
ret = ldb_kv->kv_ops->unlock_read(ldb->modules);
if (ret != LDB_SUCCESS) {
@@ -1298,6 +1318,7 @@ static void test_write_transaction_isolation(void **state)
print_error(__location__": KEY2 value lengths different"
", expected (%d) actual(%d)\n",
(int)(strlen(VAL2) + 1), (int)val.length);
+ TALLOC_FREE(val.data);
exit(LDB_ERR_OPERATIONS_ERROR);
}
if (memcmp(VAL2, val.data, strlen(VAL2)) != 0) {
@@ -1305,8 +1326,10 @@ static void test_write_transaction_isolation(void
**state)
"expected (%s) actual(%s)\n",
VAL2,
val.data);
+ TALLOC_FREE(val.data);
exit(LDB_ERR_OPERATIONS_ERROR);
}
+ TALLOC_FREE(val.data);
ret = ldb_kv->kv_ops->unlock_read(ldb->modules);
if (ret != LDB_SUCCESS) {
@@ -1490,6 +1513,7 @@ static void test_delete_transaction_isolation(void
**state)
}
if ((strlen(VAL1) + 1) != val.length) {
+ TALLOC_FREE(val.data);
print_error(__location__": KEY1 value lengths different"
", expected (%d) actual(%d)\n",
(int)(strlen(VAL1) + 1), (int)val.length);
@@ -1502,6 +1526,7 @@ static void test_delete_transaction_isolation(void
**state)
val.data);
exit(LDB_ERR_OPERATIONS_ERROR);
}
+ TALLOC_FREE(val.data);
/*
* Check that KEY2 is there
@@ -1519,6 +1544,7 @@ static void test_delete_transaction_isolation(void
**state)
}
if ((strlen(VAL2) + 1) != val.length) {
+ TALLOC_FREE(val.data);
print_error(__location__": KEY2 value lengths different"
", expected (%d) actual(%d)\n",
(int)(strlen(VAL2) + 1), (int)val.length);
@@ -1531,6 +1557,7 @@ static void test_delete_transaction_isolation(void
**state)
val.data);
exit(LDB_ERR_OPERATIONS_ERROR);
}
+ TALLOC_FREE(val.data);
ret = ldb_kv->kv_ops->unlock_read(ldb->modules);
if (ret != LDB_SUCCESS) {
@@ -1613,6 +1640,7 @@ static void test_delete_transaction_isolation(void
**state)
}
ret = ldb_kv->kv_ops->fetch_and_parse(ldb_kv, key, parse, &val);
+ TALLOC_FREE(val.data);
if (ret != LDB_ERR_NO_SUCH_OBJECT) {
print_error(__location__": fetch_and_parse returned "
"(%d)\n",
diff --git a/lib/ldb/tests/ldb_lmdb_free_list_test.c
b/lib/ldb/tests/ldb_lmdb_free_list_test.c
index 87451837583..27bfa7dd029 100644
--- a/lib/ldb/tests/ldb_lmdb_free_list_test.c
+++ b/lib/ldb/tests/ldb_lmdb_free_list_test.c
@@ -198,7 +198,9 @@ static int parse(struct ldb_val key, struct ldb_val data,
void *private_data)
{
struct ldb_val *read = private_data;
- /* Yes, we leak this. That is OK */
+ /*
+ * This should not leak if possible, please check with Leak Sanitizer.
+ */
read->data = talloc_size(NULL, data.length);
assert_non_null(read->data);
@@ -218,8 +220,8 @@ static void test_free_list_no_read_lock(void **state)
struct test_ctx *test_ctx =
talloc_get_type_abort(*state, struct test_ctx);
struct ldb_kv_private *ldb_kv = get_ldb_kv(test_ctx->ldb);
- struct ldb_val key;
- struct ldb_val val;
+ struct ldb_val key = {};
+ struct ldb_val val = {};
const char *KEY1 = "KEY01";
@@ -341,6 +343,7 @@ static void test_free_list_no_read_lock(void **state)
ret = ldb_kv->kv_ops->fetch_and_parse(ldb_kv, key, parse, &val);
assert_int_equal(ret, LDB_SUCCESS);
+ TALLOC_FREE(val.data);
ret = ldb_kv->kv_ops->unlock_read(test_ctx->ldb->modules);
assert_int_equal(ret, LDB_SUCCESS);
@@ -361,8 +364,8 @@ static void test_free_list_read_lock(void **state)
struct test_ctx *test_ctx =
talloc_get_type_abort(*state, struct test_ctx);
struct ldb_kv_private *ldb_kv = get_ldb_kv(test_ctx->ldb);
- struct ldb_val key;
- struct ldb_val val;
+ struct ldb_val key = {};
+ struct ldb_val val = {};
const char *KEY1 = "KEY01";
@@ -450,6 +453,7 @@ static void test_free_list_read_lock(void **state)
ret = ldb_kv->kv_ops->fetch_and_parse(ldb_kv, key, parse, &val);
assert_int_equal(ret, LDB_SUCCESS);
+ TALLOC_FREE(val.data);
ret = ldb_kv->kv_ops->unlock_read(ldb->modules);
assert_int_equal(ret, LDB_SUCCESS);
@@ -492,6 +496,7 @@ static void test_free_list_read_lock(void **state)
ret = ldb_kv->kv_ops->fetch_and_parse(ldb_kv, key, parse, &val);
assert_int_equal(ret, LDB_ERR_NO_SUCH_OBJECT);
+ TALLOC_FREE(val.data);
ret = ldb_kv->kv_ops->unlock_read(test_ctx->ldb->modules);
assert_int_equal(ret, 0);
@@ -510,8 +515,8 @@ static void test_free_list_stale_reader(void **state)
struct test_ctx *test_ctx =
talloc_get_type_abort(*state, struct test_ctx);
struct ldb_kv_private *ldb_kv = get_ldb_kv(test_ctx->ldb);
- struct ldb_val key;
- struct ldb_val val;
+ struct ldb_val key = {};
+ struct ldb_val val = {};
const char *KEY1 = "KEY01";
@@ -639,6 +644,7 @@ static void test_free_list_stale_reader(void **state)
ret = ldb_kv->kv_ops->fetch_and_parse(ldb_kv, key, parse, &val);
assert_int_equal(ret, LDB_SUCCESS);
+ TALLOC_FREE(val.data);
ret = ldb_kv->kv_ops->unlock_read(test_ctx->ldb->modules);
assert_int_equal(ret, LDB_SUCCESS);
--
Samba Shared Repository