• Bug#1033661: marked as done (unblock: samba/2:4.17.7+dfsg-1) (8/12)

    From Debian Bug Tracking System@21:1/5 to All on Thu Mar 30 17:00:01 2023
    [continued from previous message]

    + .num_values = 1,
    + .values = &value_1
    + },
    + {
    + .name = "bar",
    + .num_values = 1,
    + .values = &value_2
    + }
    + };
    +
    + assert_non_null(msg);
    + msg->dn = ldb_dn_new(ctx, ctx->ldb, "dc=samba,dc=org");
    + msg->num_elements = 2;
    + msg->elements = elements;
    +
    + assert_non_null(msg->dn);
    + msg_add_dn(msg);
    +
    + ret = ldb_filter_attrs_in_place(msg, attrs);
    +
    + /* Both elements match the filter */
    + assert_int_equal(ret, LDB_SUCCESS);
    + assert_int_equal(msg->num_elements, 2);
    +
    + assert_non_null(msg->dn);
    +
    + /* Assert that DB order is preserved */
    + assert_string_equal(msg->elements[0].name, "bar");
    + assert_int_equal(msg->elements[0].num_values, 1);
    + assert_int_equal(msg->elements[0].values[0].length,
    + strlen(value1));
    + assert_memory_equal(msg->elements[0].values[0].data,
    + value1, strlen(value1));
    +
    + assert_string_equal(msg->elements[1].name, "bar");
    + assert_int_equal(msg->elements[1].num_values, 1);
    + assert_int_equal(msg->elements[1].values[0].length,
    + strlen(value2));
    + assert_memory_equal(msg->elements[1].values[0].data,
    + value2, strlen(value2));
    +}
    +
    +/*
    + * Test against a record with two attributes, both matching the one
    + * specified attribute in the list (a corrupt record)
    + */
    +static void test_filter_attrs_in_place_two_dup_attr_matched_dup(void **state) +{
    + struct ldbtest_ctx *ctx = *state;
    + int ret;
    +
    + struct ldb_message *msg = ldb_msg_new(ctx);
    +
    + const char *attrs[] = {"bar", "bar", NULL};
    +
    + char value1[] = "The value.......end";
    + char value2[] = "The value..MUST.end";
    + struct ldb_val value_1 = {
    + .data = (uint8_t *)value1,
    + .length = strlen(value1)
    + };
    + struct ldb_val value_2 = {
    + .data = (uint8_t *)value2,
    + .length = strlen(value2)
    + };
    +
    + struct ldb_message_element elements[] = {
    + {
    + .name = "bar",
    + .num_values = 1,
    + .values = &value_1
    + },
    + {
    + .name = "bar",
    + .num_values = 1,
    + .values = &value_2
    + }
    + };
    +
    + assert_non_null(msg);
    + msg->dn = ldb_dn_new(ctx, ctx->ldb, "dc=samba,dc=org");
    + msg->num_elements = 2;
    + msg->elements = elements;
    +
    + assert_non_null(msg->dn);
    + msg_add_dn(msg);
    +
    + ret = ldb_filter_attrs_in_place(msg, attrs);
    +
    + /* This does not fail the pidgenhole test */
    + assert_int_equal(ret, LDB_SUCCESS);
    + assert_int_equal(msg->num_elements, 2);
    +
    + /* Assert that DB order is preserved */
    + assert_string_equal(msg->elements[0].name, "bar");
    + assert_int_equal(msg->elements[0].num_values, 1);
    + assert_int_equal(msg->elements[0].values[0].length,
    + strlen(value1));
    + assert_memory_equal(msg->elements[0].values[0].data,
    + value1, strlen(value1));
    + assert_string_equal(msg->elements[1].name, "bar");
    + assert_int_equal(msg->elements[1].num_values, 1);
    + assert_int_equal(msg->elements[1].values[0].length,
    + strlen(value2));
    + assert_memory_equal(msg->elements[1].values[0].data,
    + value2, strlen(value2));
    +}
    +
    +/*
    + * Test against a record with two attributes, both matching one of the
    + * specified attributes in the list (a corrupt record)
    + */
    +static void test_filter_attrs_in_place_two_dup_attr_matched_one_of_two(void **state)
    +{
    + struct ldbtest_ctx *ctx = *state;
    + int ret;
    +
    + struct ldb_message *msg = ldb_msg_new(ctx);
    +
    + const char *attrs[] = {"bar", "foo", NULL};
    +
    + char value1[] = "The value.......end";
    + char value2[] = "The value..MUST.end";
    + struct ldb_val value_1 = {
    + .data = (uint8_t *)value1,
    + .length = strlen(value1)
    + };
    + struct ldb_val value_2 = {
    + .data = (uint8_t *)value2,
    + .length = strlen(value2)
    + };
    +
    + struct ldb_message_element elements[] = {
    + {
    + .name = "bar",
    + .num_values = 1,
    + .values = &value_1
    + },
    + {
    + .name = "bar",
    + .num_values = 1,
    + .values = &value_2
    + }
    + };
    +
    + assert_non_null(msg);
    + msg->dn = ldb_dn_new(ctx, ctx->ldb, "dc=samba,dc=org");
    + msg->num_elements = 2;
    + msg->elements = elements;
    +
    + assert_non_null(msg->dn);
    + msg_add_dn(msg);
    +
    + ret = ldb_filter_attrs_in_place(msg, attrs);
    +
    + /* This does not fail the pidgenhole test */
    + assert_int_equal(ret, LDB_SUCCESS);
    + assert_int_equal(msg->num_elements, 2);
    +
    + /* Assert that DB order is preserved */
    + assert_string_equal(msg->elements[0].name, "bar");
    + assert_int_equal(msg->elements[0].num_values, 1);
    + assert_int_equal(msg->elements[0].values[0].length,
    + strlen(value1));
    + assert_memory_equal(msg->elements[0].values[0].data,
    + value1, strlen(value1));
    + assert_string_equal(msg->elements[1].name, "bar");
    + assert_int_equal(msg->elements[1].num_values, 1);
    + assert_int_equal(msg->elements[1].values[0].length,
    + strlen(value2));
    + assert_memory_equal(msg->elements[1].values[0].data,
    + value2, strlen(value2));
    +}
    +
    +/*
    + * Test against a record with two attributes against * (but not the
    + * other named attribute) (a corrupt record)
    + */
    +static void test_filter_attrs_in_place_two_dup_attr_matched_star(void **state) +{
    + struct ldbtest_ctx *ctx = *state;
    + int ret;
    +
    + struct ldb_message *msg = ldb_msg_new(ctx);
    +
    + const char *attrs[] = {"*", "foo", NULL};
    +
    + char value1[] = "The value.......end";
    + char value2[] = "The value..MUST.end";
    + struct ldb_val value_1 = {
    + .data = (uint8_t *)value1,
    + .length = strlen(value1)
    + };
    + struct ldb_val value_2 = {
    + .data = (uint8_t *)value2,
    + .length = strlen(value2)
    + };
    +
    + struct ldb_message_element elements[] = {
    + {
    + .name = "bar",
    + .num_values = 1,
    + .values = &value_1
    + },
    + {
    + .name = "bar",
    + .num_values = 1,
    + .values = &value_2
    + }
    + };
    +
    + assert_non_null(msg);
    + msg->dn = ldb_dn_new(ctx, ctx->ldb, "dc=samba,dc=org");
    + msg->num_elements = 2;
    + msg->elements = elements;
    +
    + assert_non_null(msg->dn);
    + msg_add_dn(msg);
    +
    + ret = ldb_filter_attrs_in_place(msg, attrs);
    +
    + /* This does not fail the pidgenhole test */
    + assert_int_equal(ret, LDB_SUCCESS);
    + assert_int_equal(msg->num_elements, 3);
    +
    + /* Assert that DB order is preserved */
    + assert_string_equal(msg->elements[0].name, "bar");
    + assert_int_equal(msg->elements[0].num_values, 1);
    + assert_int_equal(msg->elements[0].values[0].length,
    + strlen(value1));
    + assert_memory_equal(msg->elements[0].values[0].data,
    + value1, strlen(value1));
    + assert_string_equal(msg->elements[1].name, "bar");
    + assert_int_equal(msg->elements[1].num_values, 1);
    + assert_int_equal(msg->elements[1].values[0].length,
    + strlen(value2));
    + assert_memory_equal(msg->elements[1].values[0].data,
    + value2, strlen(value2));
    +
    + assert_non_null(msg->dn);
    + assert_string_equal(ldb_msg_find_attr_as_string(msg,
    + "distinguishedName",
    + NULL),
    + ldb_dn_get_linearized(msg->dn));
    +}
    +
    +/*
    + * Test against a record with only one attribute, matching the * in
    + * the list
    + */
    +static void test_filter_attrs_in_place_one_attr_matched_star(void **state)
    +{
    + struct ldbtest_ctx *ctx = *state;
    + int ret;
    +
    + struct ldb_message *msg = ldb_msg_new(ctx);
    +
    + const char *attrs[] = {"*", NULL};
    +
    + char value[] = "The value.......end";
    + struct ldb_val value_1 = {
    + .data = (uint8_t *)value,
    + .length = strlen(value)
    + };
    + struct ldb_message_element element_1 = {
    + .name = "foo",
    + .num_values = 1,
    + .values = &value_1
    + };
    +
    + assert_non_null(msg);
    + msg->dn = ldb_dn_new(ctx, ctx->ldb, "dc=samba,dc=org");
    + msg->num_elements = 1;
    + msg->elements = &element_1;
    +
    + assert_non_null(msg->dn);
    + msg_add_dn(msg);
    +
    + ret = ldb_filter_attrs_in_place(msg, attrs);
    + assert_int_equal(ret, LDB_SUCCESS);
    + assert_int_equal(msg->num_elements, 2);
    +
    + assert_non_null(msg->dn);
    + assert_string_equal(ldb_msg_find_attr_as_string(msg,
    + "distinguishedName",
    + NULL),
    + ldb_dn_get_linearized(msg->dn));
    + assert_string_equal(ldb_msg_find_attr_as_string(msg,
    + "foo",
    + NULL),
    + value);
    +}
    +
    +/*
    + * Test against a record with two attributes, matching the * in
    + * the list
    + */
    +static void test_filter_attrs_in_place_two_attr_matched_star(void **state)
    +{
    + struct ldbtest_ctx *ctx = *state;
    + int ret;
    +
    + struct ldb_message *msg = ldb_msg_new(ctx);
    +
    + const char *attrs[] = {"*", NULL};
    +
    + char value1[] = "The value.......end";
    + char value2[] = "The value..MUST.end";
    + struct ldb_val value_1 = {
    + .data = (uint8_t *)value1,
    + .length = strlen(value1)
    + };
    + struct ldb_val value_2 = {
    + .data = (uint8_t *)value2,
    + .length = strlen(value2)
    + };
    + struct ldb_message_element elements[] = {
    + {
    + .name = "foo",
    + .num_values = 1,
    + .values = &value_1
    + },
    + {
    + .name = "bar",
    + .num_values = 1,
    + .values = &value_2
    + }
    + };
    +
    + assert_non_null(msg);
    + msg->dn = ldb_dn_new(ctx, ctx->ldb, "dc=samba,dc=org");
    + msg->num_elements = 2;
    + msg->elements = elements;
    +
    + assert_non_null(msg->dn);
    + msg_add_dn(msg);
    +
    + ret = ldb_filter_attrs_in_place(msg, attrs);
    + assert_int_equal(ret, LDB_SUCCESS);
    + assert_int_equal(msg->num_elements, 3);
    +
    + assert_non_null(msg->dn);
    + assert_string_equal(ldb_msg_find_attr_as_string(msg,
    + "distinguishedName",
    + NULL),
    + ldb_dn_get_linearized(msg->dn));
    + assert_string_equal(ldb_msg_find_attr_as_string(msg,
    + "foo",
    + NULL),
    + value1);
    + assert_string_equal(ldb_msg_find_attr_as_string(msg,
    + "bar",
    + NULL),
    + value2);
    +}
    +
    +/*
    + * Test against a record with only one attribute, matching the * in
    + * the list, but without the DN being pre-filled. Succeeds, but the
    + * distinguishedName is not added.
    + */
    +static void test_filter_attrs_in_place_one_attr_matched_star_no_dn(void **state)
    +{
    + struct ldbtest_ctx *ctx = *state;
    + int ret;
    +
    + struct ldb_message *msg = ldb_msg_new(ctx);
    +
    + const char *attrs[] = {"*", NULL};
    +
    + char value[] = "The value.......end";
    + struct ldb_val value_1 = {
    + .data = (uint8_t *)value,
    + .length = strlen(value)
    + };
    + struct ldb_message_element element_1 = {
    + .name = "foo",
    + .num_values = 1,
    + .values = &value_1
    + };
    +
    + assert_non_null(msg);
    + msg->dn = NULL;
    + msg->num_elements = 1;
    + msg->elements = &element_1;
    +
    + assert_null(msg->dn);
    +
    + ret = ldb_filter_attrs_in_place(msg, attrs);
    + assert_int_equal(ret, LDB_SUCCESS);
    + assert_int_equal(msg->num_elements, 1);
    +}
    +
    +/*
    + * Test against a record with only one attribute, matching the * in
    + * the list plus requsesting distinguishedName
    + */
    +static void test_filter_attrs_in_place_one_attr_matched_star_dn(void **state) +{
    + struct ldbtest_ctx *ctx = *state;
    + int ret;
    +
    + struct ldb_message *msg = ldb_msg_new(ctx);
    +
    + const char *attrs[] = {"*", "distinguishedName", NULL};
    +
    + char value[] = "The value.......end";
    + struct ldb_val value_1 = {
    + .data = (uint8_t *)value,
    + .length = strlen(value)
    + };
    + struct ldb_message_element element_1 = {
    + .name = "foo",
    + .num_values = 1,
    + .values = &value_1
    + };
    +
    + assert_non_null(msg);
    + msg->dn = ldb_dn_new(ctx, ctx->ldb, "dc=samba,dc=org");
    + msg->num_elements = 1;
    + msg->elements = &element_1;
    +
    + assert_non_null(msg->dn);
    + msg_add_dn(msg);
    +
    + ret = ldb_filter_attrs_in_place(msg, attrs);
    + assert_int_equal(ret, LDB_SUCCESS);
    + assert_int_equal(msg->num_elements, 2);
    +
    + assert_non_null(msg->dn);
    +
    + assert_string_equal(ldb_msg_find_attr_as_string(msg,
    + "distinguishedName",
    + NULL),
    + ldb_dn_get_linearized(msg->dn));
    + assert_string_equal(ldb_msg_find_attr_as_string(msg,
    + "foo",
    + NULL),
    + value);
    +}
    +
    +/*
    + * Test against a record with only one attribute, but returning
    + * distinguishedName from the list (only)
    + */
    +static void test_filter_attrs_in_place_one_attr_matched_dn(void **state)
    +{
    + struct ldbtest_ctx *ctx = *state;
    + int ret;
    +
    + struct ldb_message *msg = ldb_msg_new(ctx);
    +
    + const char *attrs[] = {"distinguishedName", NULL};
    +
    + char value[] = "The value.......end";
    + struct ldb_val value_1 = {
    + .data = (uint8_t *)value,
    + .length = strlen(value)
    + };
    + struct ldb_message_element element_1 = {
    + .name = "foo",
    + .num_values = 1,
    + .values = &value_1
    + };
    +
    + assert_non_null(msg);
    + msg->dn = ldb_dn_new(ctx, ctx->ldb, "dc=samba,dc=org");
    + msg->num_elements = 1;
    + msg->elements = &element_1;
    +
    + assert_non_null(msg->dn);
    + msg_add_dn(msg);
    +
    + ret = ldb_filter_attrs_in_place(msg, attrs);
    + assert_int_equal(ret, LDB_SUCCESS);
    + assert_int_equal(msg->num_elements, 1);
    +
    + assert_non_null(msg->dn);
    + assert_string_equal(msg->elements[0].name, "distinguishedName");
    + assert_int_equal(msg->elements[0].num_values, 1);
    + assert_string_equal(msg->elements[0].values[0].data,
    + ldb_dn_get_linearized(msg->dn));
    +}
    +
    +/*
    + * Test against a record with only one attribute, not matching the
    + * empty attribute list
    + */
    +static void test_filter_attrs_in_place_one_attr_empty_list(void **state)
    +{
    + struct ldbtest_ctx *ctx = *state;
    + int ret;
    +
    + struct ldb_message *msg = ldb_msg_new(ctx);
    +
    + const char *attrs[] = {NULL};
    +
    + char value[] = "The value.......end";
    + struct ldb_val value_1 = {
    + .data = (uint8_t *)value,
    + .length = strlen(value)
    + };
    + struct ldb_message_element element_1 = {
    + .name = "foo",
    + .num_values = 1,
    + .values = &value_1
    + };
    +
    + assert_non_null(msg);
    + msg->dn = ldb_dn_new(ctx, ctx->ldb, "dc=samba,dc=org");
    + msg->num_elements = 1;
    + msg->elements = &element_1;
    +
    + assert_non_null(msg->dn);
    + msg_add_dn(msg);
    +
    + ret = ldb_filter_attrs_in_place(msg, attrs);
    + assert_int_equal(ret, LDB_SUCCESS);
    + assert_int_equal(msg->num_elements, 0);
    + assert_non_null(msg->dn);
    +}
    +
    +int main(int argc, const char **argv)
    +{
    + const struct CMUnitTest tests[] = {
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_one_attr_matched,
    + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_one_attr_matched_of_many,
    + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_two_attr_matched_attrs,
    + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_two_attr_matched_one_attr,
    + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_two_dup_attr_matched_one_attr,
    + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_two_dup_attr_matched_dup,
    + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_two_dup_attr_matched_one_of_two,
    + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_two_dup_attr_matched_star,
    + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_one_attr_matched_star,
    + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_two_attr_matched_star,
    + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_one_attr_matched_star_no_dn, + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_one_attr_matched_star_dn,
    + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_one_attr_matched_dn,
    + setup,
    + teardown),
    + cmocka_unit_test_setup_teardown(
    + test_filter_attrs_in_place_one_attr_empty_list,
    + setup,
    + teardown),
    + };
    +
    + return cmocka_run_group_tests(tests, NULL, NULL);
    +}
    diff -Nru samba-4.17.6+dfsg/lib/ldb/tests/ldb_filter_attrs_test.c samba-4.17.7+dfsg/lib/ldb/tests/ldb_filter_attrs_test.c
    --- samba-4.17.6+dfsg/lib/ldb/tests/ldb_filter_attrs_test.c 2022-08-08 17:15:39.108190000 +0300
    +++ samba-4.17.7+dfsg/lib/ldb/tests/ldb_filter_attrs_test.c 2023-03-20 12:03:44.559649700 +0300
    @@ -36,6 +36,7 @@
    #include <stdarg.h>
    #include <stddef.h>
    #include <stdint.h>
    +#include <string.h>
    #include <setjmp.h>
    #include <cmocka.h>

    @@ -96,10 +97,10 @@

    const char *attrs[] = {"foo", NULL};

    - uint8_t value[] = "The value.......end";
    + char value[] = "The value.......end";
    struct ldb_val value_1 = {
    - .data = value,
    - .length = (sizeof(value))
    + .data = (uint8_t *)value,
    + .length = strlen(value)
    };
    struct ldb_message_element element_1 = {
    .name = "foo",
    @@ -130,9 +131,9 @@
    assert_string_equal(filtered_msg->elements[0].name, "foo");
    assert_int_equal(filtered_msg->elements[0].num_values, 1);
    assert_int_equal(filtered_msg->elements[0].values[0].length,
    - sizeof(value));
    + strlen(value));
    assert_memory_equal(filtered_msg->elements[0].values[0].data,