summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Slebodnik <lslebodn@redhat.com>2014-02-28 23:42:19 +0100
committerJakub Hrozek <jhrozek@redhat.com>2014-06-03 12:57:00 +0200
commit99736adbc8da137e3ea061436e4d8baf3a015877 (patch)
treeb37654ad603944efbdd3e2ab0a81dc745b136de8
parentac10fd4b0b31ca539f6a2ef969185a084896e81a (diff)
downloadsssd-99736adbc8da137e3ea061436e4d8baf3a015877.tar.gz
sssd-99736adbc8da137e3ea061436e4d8baf3a015877.tar.xz
sssd-99736adbc8da137e3ea061436e4d8baf3a015877.zip
UTIL: Add function sss_parse_name_const
Variable with type 'const char *' can be used as output argument in function sss_parse_name, but there will be warning. warning: passing 'const char **' to parameter of type 'char **' discards qualifiers in nested pointer types [-Wincompatible-pointer-types-discards-qualifiers] Reviewed-by: Pavel Reichl <preichl@redhat.com>
-rw-r--r--src/tests/cmocka/test_fqnames.c86
-rw-r--r--src/util/usertools.c24
-rw-r--r--src/util/util.h4
3 files changed, 114 insertions, 0 deletions
diff --git a/src/tests/cmocka/test_fqnames.c b/src/tests/cmocka/test_fqnames.c
index 3b3dad2c0..cf80777b8 100644
--- a/src/tests/cmocka/test_fqnames.c
+++ b/src/tests/cmocka/test_fqnames.c
@@ -28,6 +28,7 @@
#define NAME "name"
#define DOMNAME "domname"
#define FLATNAME "flatname"
+#define SPECIALNAME "[]{}();:'|\",<.>/?!#$%^&*_+~`"
#define PROVIDER "local"
#define CONNNAME "conn"
@@ -344,11 +345,74 @@ void parse_name_test_teardown(void **state)
assert_true(leak_check_teardown());
}
+void sss_parse_name_check(struct parse_name_test_ctx *test_ctx,
+ const char *input_name,
+ const char exp_ret,
+ const char *exp_name,
+ const char *exp_domain)
+{
+ errno_t ret;
+ char *domain = NULL;
+ char *name = NULL;
+ const char *domain_const = NULL;
+ const char *name_const = NULL;
+
+
+ check_leaks_push(test_ctx);
+ ret = sss_parse_name(test_ctx, test_ctx->nctx, input_name,
+ &domain, &name);
+ assert_int_equal(ret, exp_ret);
+
+ if (exp_name) {
+ assert_non_null(name);
+ assert_string_equal(name, exp_name);
+ }
+
+ if (exp_domain) {
+ assert_non_null(domain);
+ assert_string_equal(domain, exp_domain);
+ }
+
+ talloc_zfree(name);
+ talloc_zfree(domain);
+
+ ret = sss_parse_name_const(test_ctx, test_ctx->nctx, input_name,
+ &domain_const, &name_const);
+ assert_int_equal(ret, exp_ret);
+
+ if (exp_name) {
+ assert_non_null(name_const);
+ assert_string_equal(name_const, exp_name);
+ }
+
+ if (exp_domain) {
+ assert_non_null(domain_const);
+ assert_string_equal(domain_const, exp_domain);
+ }
+
+ talloc_free(discard_const(name_const));
+ talloc_free(discard_const(domain_const));
+
+ assert_true(check_leaks_pop(test_ctx) == true);
+}
+
void parse_name_plain(void **state)
{
struct parse_name_test_ctx *test_ctx = talloc_get_type(*state,
struct parse_name_test_ctx);
+ int ret;
+
parse_name_check(test_ctx, NAME, NULL, EOK, NAME, NULL);
+
+ ret = sss_parse_name(test_ctx, test_ctx->nctx, NAME,
+ NULL, NULL);
+ assert_int_equal(ret, EOK);
+ ret = sss_parse_name_const(test_ctx, test_ctx->nctx, NAME,
+ NULL, NULL);
+ assert_int_equal(ret, EOK);
+
+ sss_parse_name_check(test_ctx, NAME, EOK, NAME, NULL);
+ sss_parse_name_check(test_ctx, SPECIALNAME, EOK, SPECIALNAME, NULL);
}
void parse_name_fqdn(void **state)
@@ -357,6 +421,11 @@ void parse_name_fqdn(void **state)
struct parse_name_test_ctx);
parse_name_check(test_ctx, NAME"@"DOMNAME, NULL, EOK, NAME, DOMNAME);
parse_name_check(test_ctx, NAME"@"DOMNAME2, NULL, EOK, NAME, DOMNAME2);
+
+ sss_parse_name_check(test_ctx, NAME"@"DOMNAME, EOK, NAME, DOMNAME);
+ sss_parse_name_check(test_ctx, NAME"@"DOMNAME2, EOK, NAME, DOMNAME2);
+ sss_parse_name_check(test_ctx, DOMNAME"\\"NAME, EOK, NAME, DOMNAME);
+ sss_parse_name_check(test_ctx, DOMNAME2"\\"NAME, EOK, NAME, DOMNAME2);
}
void parse_name_sub(void **state)
@@ -418,6 +487,20 @@ void test_init_nouser(void **state)
assert_int_not_equal(ret, EOK);
}
+void sss_parse_name_fail(void **state)
+{
+ struct parse_name_test_ctx *test_ctx = talloc_get_type(*state,
+ struct parse_name_test_ctx);
+
+ sss_parse_name_check(test_ctx, "", EINVAL, NULL, NULL);
+ sss_parse_name_check(test_ctx, "@", EINVAL, NULL, NULL);
+ sss_parse_name_check(test_ctx, "\\", EINVAL, NULL, NULL);
+ sss_parse_name_check(test_ctx, "\\"NAME, EINVAL, NULL, NULL);
+ sss_parse_name_check(test_ctx, "@"NAME, EINVAL, NULL, NULL);
+ sss_parse_name_check(test_ctx, NAME"@", EINVAL, NULL, NULL);
+ sss_parse_name_check(test_ctx, NAME"\\", EINVAL, NULL, NULL);
+}
+
int main(int argc, const char *argv[])
{
poptContext pc;
@@ -455,6 +538,9 @@ int main(int argc, const char *argv[])
unit_test_setup_teardown(parse_name_default,
parse_name_test_setup,
parse_name_test_teardown),
+ unit_test_setup_teardown(sss_parse_name_fail,
+ parse_name_test_setup,
+ parse_name_test_teardown),
};
/* Set debug level to invalid value so we can deside if -d 0 was used. */
diff --git a/src/util/usertools.c b/src/util/usertools.c
index 2b3612879..172095c27 100644
--- a/src/util/usertools.c
+++ b/src/util/usertools.c
@@ -385,6 +385,30 @@ int sss_parse_name(TALLOC_CTX *memctx,
return EOK;
}
+int sss_parse_name_const(TALLOC_CTX *memctx,
+ struct sss_names_ctx *snctx, const char *orig,
+ const char **_domain, const char **_name)
+{
+ char *domain;
+ char *name;
+ int ret;
+
+ ret = sss_parse_name(memctx, snctx, orig,
+ (_domain == NULL) ? NULL : &domain,
+ (_name == NULL) ? NULL : &name);
+ if (ret == EOK) {
+ if (_domain != NULL) {
+ *_domain = domain;
+ }
+
+ if (_name != NULL) {
+ *_name = name;
+ }
+ }
+
+ return ret;
+}
+
static struct sss_domain_info * match_any_domain_or_subdomain_name(
struct sss_domain_info *dom,
const char *dmatch)
diff --git a/src/util/util.h b/src/util/util.h
index cdbe0be95..35eea1153 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -277,6 +277,10 @@ int sss_parse_name(TALLOC_CTX *memctx,
struct sss_names_ctx *snctx,
const char *orig, char **_domain, char **_name);
+int sss_parse_name_const(TALLOC_CTX *memctx,
+ struct sss_names_ctx *snctx, const char *orig,
+ const char **_domain, const char **_name);
+
int sss_parse_name_for_domains(TALLOC_CTX *memctx,
struct sss_domain_info *domains,
const char *default_domain,