diff options
author | Pavel Reichl <preichl@redhat.com> | 2016-01-22 08:34:14 -0500 |
---|---|---|
committer | Lukas Slebodnik <lslebodn@redhat.com> | 2016-02-15 10:06:31 +0100 |
commit | 9d17f436795a36b1b1126f444923aa847fd0f93a (patch) | |
tree | dd96d8abfc84936ef62ec477b1f5d0dee294b6d2 /src/tests | |
parent | a0c764a36f2f432e6063de84be6f6af7e96ec159 (diff) | |
download | sssd-9d17f436795a36b1b1126f444923aa847fd0f93a.tar.gz sssd-9d17f436795a36b1b1126f444923aa847fd0f93a.tar.xz sssd-9d17f436795a36b1b1126f444923aa847fd0f93a.zip |
IDMAP: Add test to validate off by one bug
Resolves:
https://fedorahosted.org/sssd/ticket/2922
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
Reviewed-by: Michal Židek <mzidek@redhat.com>
Diffstat (limited to 'src/tests')
-rw-r--r-- | src/tests/cmocka/test_sss_idmap.c | 113 |
1 files changed, 109 insertions, 4 deletions
diff --git a/src/tests/cmocka/test_sss_idmap.c b/src/tests/cmocka/test_sss_idmap.c index 00e03ffd9..f82e3dc51 100644 --- a/src/tests/cmocka/test_sss_idmap.c +++ b/src/tests/cmocka/test_sss_idmap.c @@ -43,6 +43,9 @@ #define TEST_OFFSET 1000000 #define TEST_OFFSET_STR "1000000" +const int TEST_2922_MIN_ID = 1842600000; +const int TEST_2922_MAX_ID = 1842799999; + struct test_ctx { TALLOC_CTX *mem_idmap; struct sss_idmap_ctx *idmap_ctx; @@ -128,7 +131,38 @@ static int setup_ranges(struct test_ctx *test_ctx, bool external_mapping, return 0; } -static int test_sss_idmap_setup_with_domains(void **state) { +static int setup_ranges_2922(struct test_ctx *test_ctx) +{ + const int TEST_2922_DFL_SLIDE = 9212; + struct sss_idmap_range range; + enum idmap_error_code err; + const char *name; + const char *sid; + /* Pick a new slice. */ + id_t slice_num = -1; + + assert_non_null(test_ctx); + + name = TEST_DOM_NAME; + sid = TEST_DOM_SID; + + err = sss_idmap_calculate_range(test_ctx->idmap_ctx, sid, &slice_num, + &range); + assert_int_equal(err, IDMAP_SUCCESS); + /* Range computation should be deterministic. Lets validate that. */ + assert_int_equal(range.min, TEST_2922_MIN_ID); + assert_int_equal(range.max, TEST_2922_MAX_ID); + assert_int_equal(slice_num, TEST_2922_DFL_SLIDE); + + err = sss_idmap_add_domain_ex(test_ctx->idmap_ctx, name, sid, &range, + NULL, 0, false /* No external mapping */); + assert_int_equal(err, IDMAP_SUCCESS); + + return 0; +} + +static int test_sss_idmap_setup_with_domains(void **state) +{ struct test_ctx *test_ctx; test_sss_idmap_setup(state); @@ -140,7 +174,21 @@ static int test_sss_idmap_setup_with_domains(void **state) { return 0; } -static int test_sss_idmap_setup_with_domains_sec_slices(void **state) { +static int test_sss_idmap_setup_with_domains_2922(void **state) +{ + struct test_ctx *test_ctx; + + test_sss_idmap_setup(state); + + test_ctx = talloc_get_type(*state, struct test_ctx); + assert_non_null(test_ctx); + + setup_ranges_2922(test_ctx); + return 0; +} + +static int test_sss_idmap_setup_with_domains_sec_slices(void **state) +{ struct test_ctx *test_ctx; test_sss_idmap_setup(state); @@ -152,7 +200,8 @@ static int test_sss_idmap_setup_with_domains_sec_slices(void **state) { return 0; } -static int test_sss_idmap_setup_with_external_mappings(void **state) { +static int test_sss_idmap_setup_with_external_mappings(void **state) +{ struct test_ctx *test_ctx; test_sss_idmap_setup(state); @@ -164,7 +213,8 @@ static int test_sss_idmap_setup_with_external_mappings(void **state) { return 0; } -static int test_sss_idmap_setup_with_both(void **state) { +static int test_sss_idmap_setup_with_both(void **state) +{ struct test_ctx *test_ctx; test_sss_idmap_setup(state); @@ -298,6 +348,58 @@ void test_map_id(void **state) sss_idmap_free_sid(test_ctx->idmap_ctx, sid); } +/* https://fedorahosted.org/sssd/ticket/2922 */ +/* ID mapping - bug in computing max id for slice range */ +void test_map_id_2922(void **state) +{ + const char* TEST_2922_FIRST_SID = TEST_DOM_SID"-0"; + /* Last SID = first SID + (default) rangesize -1 */ + const char* TEST_2922_LAST_SID = TEST_DOM_SID"-199999"; + /* Last SID = first SID + rangesize */ + const char* TEST_2922_LAST_SID_PLUS_ONE = TEST_DOM_SID"-200000"; + struct test_ctx *test_ctx; + enum idmap_error_code err; + uint32_t id; + char *sid = NULL; + + test_ctx = talloc_get_type(*state, struct test_ctx); + + assert_non_null(test_ctx); + + /* Min UNIX ID to SID */ + err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, TEST_2922_MIN_ID, &sid); + assert_int_equal(err, IDMAP_SUCCESS); + assert_string_equal(sid, TEST_2922_FIRST_SID); + sss_idmap_free_sid(test_ctx->idmap_ctx, sid); + + /* First SID to UNIX ID */ + err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_2922_FIRST_SID, &id); + assert_int_equal(err, IDMAP_SUCCESS); + assert_int_equal(id, TEST_2922_MIN_ID); + + /* Max UNIX ID to SID */ + err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, TEST_2922_MAX_ID, &sid); + assert_int_equal(err, IDMAP_SUCCESS); + assert_string_equal(sid, TEST_2922_LAST_SID); + sss_idmap_free_sid(test_ctx->idmap_ctx, sid); + + /* Last SID to UNIX ID */ + err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_2922_LAST_SID, &id); + assert_int_equal(err, IDMAP_SUCCESS); + assert_int_equal(id, TEST_2922_MAX_ID); + + /* Max UNIX ID + 1 to SID */ + err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, TEST_2922_MAX_ID + 1, + &sid); + assert_int_equal(err, IDMAP_NO_DOMAIN); + + /* Last SID + 1 to UNIX ID */ + err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, + TEST_2922_LAST_SID_PLUS_ONE, &id); + /* Auto adding new ranges is disable in this test. */ + assert_int_equal(err, IDMAP_NO_RANGE); +} + void test_map_id_sec_slices(void **state) { struct test_ctx *test_ctx; @@ -589,6 +691,9 @@ int main(int argc, const char *argv[]) cmocka_unit_test_setup_teardown(test_map_id, test_sss_idmap_setup_with_domains, test_sss_idmap_teardown), + cmocka_unit_test_setup_teardown(test_map_id_2922, + test_sss_idmap_setup_with_domains_2922, + test_sss_idmap_teardown), cmocka_unit_test_setup_teardown(test_map_id_sec_slices, test_sss_idmap_setup_with_domains_sec_slices, test_sss_idmap_teardown), |