summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/responder/nss/nsssrv_cmd.c132
-rw-r--r--src/tests/cmocka/test_fqnames.c21
-rw-r--r--src/tests/cmocka/test_nss_srv.c21
-rw-r--r--src/tests/cmocka/test_utils.c6
-rw-r--r--src/util/usertools.c114
-rw-r--r--src/util/util.h12
6 files changed, 97 insertions, 209 deletions
diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c
index 715313f89..0b02bf6e8 100644
--- a/src/responder/nss/nsssrv_cmd.c
+++ b/src/responder/nss/nsssrv_cmd.c
@@ -298,20 +298,14 @@ static int fill_pwent(struct sss_packet *packet,
uint32_t uid;
uint32_t gid;
size_t rsize, rp, blen;
- size_t dom_len = 0;
- int delim = 0;
- int i, ret, num, t;
+ int fq_len = 0;
+ int i, ret, num;
bool add_domain = (!IS_SUBDOMAIN(dom) && dom->fqnames);
const char *domain = dom->name;
bool packet_initialized = false;
int ncret;
TALLOC_CTX *tmp_ctx = NULL;
- if (add_domain) {
- delim = 1;
- dom_len = sss_fqdom_len(dom->names, dom);
- }
-
to_sized_string(&pwfield, nctx->pwfield);
rp = 2*sizeof(uint32_t);
@@ -381,7 +375,17 @@ static int fill_pwent(struct sss_packet *packet,
rsize = 2 * sizeof(uint32_t) + name.len + gecos.len +
homedir.len + shell.len + pwfield.len;
- if (add_domain) rsize += delim + dom_len;
+
+ if (add_domain) {
+ fq_len = sss_fqname(NULL, 0, dom->names, dom, name.str);
+ if (fq_len >= 0) {
+ fq_len += 1;
+ rsize -= name.len;
+ rsize += fq_len;
+ } else {
+ fq_len = 0;
+ }
+ }
ret = sss_packet_grow(packet, rsize);
if (ret != EOK) {
@@ -394,25 +398,8 @@ static int fill_pwent(struct sss_packet *packet,
SAFEALIGN_SET_UINT32(&body[rp], gid, &rp);
if (add_domain) {
- ret = sss_fqname((char *) &body[rp], name.len + delim + dom_len,
- dom->names, dom, name.str);
- if (ret >= (name.len + delim + dom_len)) {
- /* need more space, got creative with the print format ? */
- t = ret - (name.len + delim + dom_len) + 1;
- ret = sss_packet_grow(packet, t);
- if (ret != EOK) {
- num = 0;
- goto done;
- }
- delim += t;
- sss_packet_get_body(packet, &body, &blen);
-
- /* retry */
- ret = sss_fqname((char *) &body[rp], name.len + delim + dom_len,
- dom->names, dom, name.str);
- }
-
- if (ret != name.len + delim + dom_len - 1) {
+ ret = sss_fqname((char *) &body[rp], fq_len, dom->names, dom, name.str);
+ if (ret < 0 || ret != fq_len - 1) {
DEBUG(1, ("Failed to generate a fully qualified name for user "
"[%s] in [%s]! Skipping user.\n", name.str, domain));
continue;
@@ -2281,8 +2268,7 @@ static int fill_members(struct sss_packet *packet,
struct sized_string name;
TALLOC_CTX *tmp_ctx = NULL;
- size_t delim = 0;
- size_t dom_len = 0;
+ int nlen = 0;
uint8_t *body;
size_t blen;
@@ -2319,9 +2305,6 @@ static int fill_members(struct sss_packet *packet,
}
}
- delim = 0;
- dom_len = 0;
-
ret = parse_member(tmp_ctx, dom, tmpstr, &member_dom, &name, &add_domain);
if (ret != EOK) {
DEBUG(SSSDBG_MINOR_FAILURE,
@@ -2330,44 +2313,33 @@ static int fill_members(struct sss_packet *packet,
}
if (add_domain) {
- delim = 1;
- dom_len = sss_fqdom_len(member_dom->names, member_dom);
+ nlen = sss_fqname(NULL, 0, dom->names, dom, name.str);
+ if (nlen >= 0) {
+ nlen += 1;
+ } else {
+ /* Other failures caught below */
+ nlen = 0;
+ }
+ } else {
+ nlen = name.len;
}
- ret = sss_packet_grow(packet, name.len + delim + dom_len);
+ ret = sss_packet_grow(packet, nlen);
if (ret != EOK) {
goto done;
}
sss_packet_get_body(packet, &body, &blen);
if (add_domain) {
- ret = sss_fqname((char *)&body[rzero + rsize],
- name.len + delim + dom_len,
+ ret = sss_fqname((char *)&body[rzero + rsize], nlen,
member_dom->names, member_dom, name.str);
- if (ret >= (name.len + delim + dom_len)) {
- /* need more space,
- * got creative with the print format ? */
- int t = ret - (name.len + delim + dom_len) + 1;
- ret = sss_packet_grow(packet, t);
- if (ret != EOK) {
- goto done;
- }
- sss_packet_get_body(packet, &body, &blen);
- delim += t;
-
- /* retry */
- ret = sss_fqname((char *)&body[rzero + rsize],
- name.len + delim + dom_len,
- member_dom->names, member_dom, name.str);
- }
-
- if (ret != name.len + delim + dom_len - 1) {
+ if (ret < 0 || ret != nlen - 1) {
DEBUG(SSSDBG_OP_FAILURE, ("Failed to generate a fully qualified name"
" for member [%s@%s] of group [%s]!"
" Skipping\n", name.str, domain,
(char *)&body[rzero+STRS_ROFFSET]));
/* reclaim space */
- ret = sss_packet_shrink(packet, name.len + delim + dom_len);
+ ret = sss_packet_shrink(packet, nlen);
if (ret != EOK) {
goto done;
}
@@ -2378,7 +2350,7 @@ static int fill_members(struct sss_packet *packet,
memcpy(&body[rzero + rsize], name.str, name.len);
}
- rsize += name.len + delim + dom_len;
+ rsize += nlen;
memnum++;
}
@@ -2409,8 +2381,7 @@ static int fill_grent(struct sss_packet *packet,
struct sized_string name;
struct sized_string pwfield;
struct sized_string fullname;
- size_t delim = 0;
- size_t dom_len = 0;
+ int fq_len = 0;
int i = 0;
int ret, num, memnum;
size_t rzero, rsize;
@@ -2418,11 +2389,6 @@ static int fill_grent(struct sss_packet *packet,
const char *domain = dom->name;
TALLOC_CTX *tmp_ctx = NULL;
- if (add_domain) {
- delim = 1;
- dom_len = sss_fqdom_len(dom->names, dom);
- }
-
to_sized_string(&pwfield, nctx->pwfield);
num = 0;
@@ -2483,7 +2449,18 @@ static int fill_grent(struct sss_packet *packet,
/* fill in gid and name and set pointer for number of members */
rsize = STRS_ROFFSET + name.len + pwfield.len; /* name\0x\0 */
- if (add_domain) rsize += delim + dom_len;
+
+ if (add_domain) {
+ fq_len = sss_fqname(NULL, 0, dom->names, dom, name.str);
+ if (fq_len >= 0) {
+ fq_len += 1;
+ rsize -= name.len;
+ rsize += fq_len;
+ } else {
+ /* Other failures caught below */
+ fq_len = 0;
+ }
+ }
ret = sss_packet_grow(packet, rsize);
if (ret != EOK) {
@@ -2500,28 +2477,9 @@ static int fill_grent(struct sss_packet *packet,
/* 8-X: sequence of strings (name, passwd, mem..) */
if (add_domain) {
- ret = sss_fqname((char *)&body[rzero+STRS_ROFFSET],
- name.len + delim + dom_len,
+ ret = sss_fqname((char *)&body[rzero+STRS_ROFFSET], fq_len,
dom->names, dom, name.str);
- if (ret >= (name.len + delim + dom_len)) {
- /* need more space, got creative with the print format ? */
- int t = ret - (name.len + delim + dom_len) + 1;
- ret = sss_packet_grow(packet, t);
- if (ret != EOK) {
- num = 0;
- goto done;
- }
- sss_packet_get_body(packet, &body, &blen);
- rsize += t;
- delim += t;
-
- /* retry */
- ret = sss_fqname((char *)&body[rzero+STRS_ROFFSET],
- name.len + delim + dom_len,
- dom->names, dom, name.str);
- }
-
- if (ret != name.len + delim + dom_len - 1) {
+ if (ret < 0 || ret != fq_len - 1) {
DEBUG(1, ("Failed to generate a fully qualified name for"
" group [%s] in [%s]! Skipping\n", name.str, domain));
/* reclaim space */
diff --git a/src/tests/cmocka/test_fqnames.c b/src/tests/cmocka/test_fqnames.c
index e0735083a..90f60c5be 100644
--- a/src/tests/cmocka/test_fqnames.c
+++ b/src/tests/cmocka/test_fqnames.c
@@ -76,7 +76,6 @@ void test_default(void **state)
char *fqdn;
const int fqdn_size = 255;
char fqdn_s[fqdn_size];
- size_t domsize;
if (test_ctx == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Type mismatch\n"));
@@ -87,7 +86,6 @@ void test_default(void **state)
"(?P<name>[^@]+)@?(?P<domain>[^@]*$)",
"%1$s@%2$s", &test_ctx->nctx);
assert_int_equal(ret, EOK);
- assert_int_equal(test_ctx->nctx->fq_flags, FQ_FMT_NAME | FQ_FMT_DOMAIN);
fqdn = sss_tc_fqname(test_ctx, test_ctx->nctx, test_ctx->dom, NAME);
assert_non_null(fqdn);
@@ -98,9 +96,6 @@ void test_default(void **state)
assert_int_equal(ret + 1, sizeof(NAME"@"DOMNAME));
assert_string_equal(fqdn_s, NAME"@"DOMNAME);
- domsize = sss_fqdom_len(test_ctx->nctx, test_ctx->dom);
- assert_int_equal(domsize, sizeof(DOMNAME)-1);
-
talloc_free(test_ctx->nctx);
}
@@ -113,7 +108,6 @@ void test_all(void **state)
char *fqdn;
const int fqdn_size = 255;
char fqdn_s[fqdn_size];
- size_t domsize;
if (test_ctx == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Type mismatch\n"));
@@ -124,8 +118,6 @@ void test_all(void **state)
"(?P<name>[^@]+)@?(?P<domain>[^@]*$)",
"%1$s@%2$s@%3$s", &test_ctx->nctx);
assert_int_equal(ret, EOK);
- assert_int_equal(test_ctx->nctx->fq_flags,
- FQ_FMT_NAME | FQ_FMT_DOMAIN | FQ_FMT_FLAT_NAME);
fqdn = sss_tc_fqname(test_ctx, test_ctx->nctx, test_ctx->dom, NAME);
assert_non_null(fqdn);
@@ -136,9 +128,6 @@ void test_all(void **state)
assert_int_equal(ret + 1, sizeof(NAME"@"DOMNAME"@"FLATNAME));
assert_string_equal(fqdn_s, NAME"@"DOMNAME"@"FLATNAME);
- domsize = sss_fqdom_len(test_ctx->nctx, test_ctx->dom);
- assert_int_equal(domsize, sizeof(DOMNAME)-1 + sizeof(FLATNAME)-1);
-
talloc_free(test_ctx->nctx);
}
@@ -151,7 +140,6 @@ void test_flat(void **state)
char *fqdn;
const int fqdn_size = 255;
char fqdn_s[fqdn_size];
- size_t domsize;
if (test_ctx == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Type mismatch\n"));
@@ -162,7 +150,6 @@ void test_flat(void **state)
"(?P<name>[^@]+)@?(?P<domain>[^@]*$)",
"%1$s@%3$s", &test_ctx->nctx);
assert_int_equal(ret, EOK);
- assert_int_equal(test_ctx->nctx->fq_flags, FQ_FMT_NAME | FQ_FMT_FLAT_NAME);
fqdn = sss_tc_fqname(test_ctx, test_ctx->nctx, test_ctx->dom, NAME);
assert_non_null(fqdn);
@@ -173,9 +160,6 @@ void test_flat(void **state)
assert_int_equal(ret + 1, sizeof(NAME"@"FLATNAME));
assert_string_equal(fqdn_s, NAME"@"FLATNAME);
- domsize = sss_fqdom_len(test_ctx->nctx, test_ctx->dom);
- assert_int_equal(domsize, sizeof(FLATNAME)-1);
-
talloc_free(test_ctx->nctx);
}
@@ -188,7 +172,6 @@ void test_flat_fallback(void **state)
char *fqdn;
const int fqdn_size = 255;
char fqdn_s[fqdn_size];
- size_t domsize;
if (test_ctx == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Type mismatch\n"));
@@ -199,7 +182,6 @@ void test_flat_fallback(void **state)
"(?P<name>[^@]+)@?(?P<domain>[^@]*$)",
"%1$s@%3$s", &test_ctx->nctx);
assert_int_equal(ret, EOK);
- assert_int_equal(test_ctx->nctx->fq_flags, FQ_FMT_NAME | FQ_FMT_FLAT_NAME);
test_ctx->dom->flat_name = NULL;
@@ -215,9 +197,6 @@ void test_flat_fallback(void **state)
assert_int_equal(ret + 1, sizeof(NAME"@"DOMNAME));
assert_string_equal(fqdn_s, NAME"@"DOMNAME);
- domsize = sss_fqdom_len(test_ctx->nctx, test_ctx->dom);
- assert_int_equal(domsize, sizeof(DOMNAME)-1);
-
talloc_free(test_ctx->nctx);
}
diff --git a/src/tests/cmocka/test_nss_srv.c b/src/tests/cmocka/test_nss_srv.c
index d1a4d4bd8..4db108a79 100644
--- a/src/tests/cmocka/test_nss_srv.c
+++ b/src/tests/cmocka/test_nss_srv.c
@@ -540,8 +540,8 @@ void test_nss_getpwnam_fqdn(void **state)
* Check that FQDN processing is able to handle arbitrarily sized
* delimeter
*/
-static int test_nss_getpwnam_check_resize_fqdn(uint32_t status,
- uint8_t *body, size_t blen)
+static int test_nss_getpwnam_check_fancy_fqdn(uint32_t status,
+ uint8_t *body, size_t blen)
{
struct passwd pwd;
errno_t ret;
@@ -555,29 +555,28 @@ static int test_nss_getpwnam_check_resize_fqdn(uint32_t status,
assert_int_equal(pwd.pw_uid, 125);
assert_int_equal(pwd.pw_gid, 458);
- assert_string_equal(pwd.pw_name, "testuser_fqdn_resize@@@@@"TEST_DOM_NAME);
+ assert_string_equal(pwd.pw_name, "testuser_fqdn_fancy@@@@@"TEST_DOM_NAME);
assert_string_equal(pwd.pw_shell, "/bin/sh");
return EOK;
}
-void test_nss_getpwnam_fqdn_resize(void **state)
+void test_nss_getpwnam_fqdn_fancy(void **state)
{
errno_t ret;
/* Prime the cache with a valid user */
ret = sysdb_add_user(nss_test_ctx->tctx->dom,
- "testuser_fqdn_resize", 125, 458, "test user",
+ "testuser_fqdn_fancy", 125, 458, "test user",
"/home/testuser", "/bin/sh", NULL,
NULL, 300, 0);
assert_int_equal(ret, EOK);
- mock_input_user_or_group("testuser_fqdn_resize@"TEST_DOM_NAME);
+ mock_input_user_or_group("testuser_fqdn_fancy@"TEST_DOM_NAME);
will_return(__wrap_sss_packet_get_cmd, SSS_NSS_GETPWNAM);
mock_fill_user();
- will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
/* Query for that user, call a callback when command finishes */
- set_cmd_cb(test_nss_getpwnam_check_resize_fqdn);
+ set_cmd_cb(test_nss_getpwnam_check_fancy_fqdn);
nss_test_ctx->cctx->rctx->domains[0].fqnames = true;
ret = sss_cmd_execute(nss_test_ctx->cctx, SSS_NSS_GETPWNAM,
nss_test_ctx->nss_cmds);
@@ -1298,7 +1297,7 @@ void nss_subdom_test_setup(void **state)
nss_test_ctx->subdom = subdomain;
}
-void nss_fqdn_resize_test_setup(void **state)
+void nss_fqdn_fancy_test_setup(void **state)
{
struct sss_test_conf_param params[] = {
{ "enumerate", "false" },
@@ -1339,8 +1338,8 @@ int main(int argc, const char *argv[])
nss_test_setup, nss_test_teardown),
unit_test_setup_teardown(test_nss_getpwnam_fqdn,
nss_fqdn_test_setup, nss_test_teardown),
- unit_test_setup_teardown(test_nss_getpwnam_fqdn_resize,
- nss_fqdn_resize_test_setup, nss_test_teardown),
+ unit_test_setup_teardown(test_nss_getpwnam_fqdn_fancy,
+ nss_fqdn_fancy_test_setup, nss_test_teardown),
unit_test_setup_teardown(test_nss_getgrnam_no_members,
nss_test_setup, nss_test_teardown),
unit_test_setup_teardown(test_nss_getgrnam_members,
diff --git a/src/tests/cmocka/test_utils.c b/src/tests/cmocka/test_utils.c
index eeef9ee0c..13a67f756 100644
--- a/src/tests/cmocka/test_utils.c
+++ b/src/tests/cmocka/test_utils.c
@@ -531,8 +531,7 @@ void test_sss_names_init(void **state)
assert_int_equal(ret, EOK);
assert_non_null(names_ctx);
assert_string_equal(names_ctx->re_pattern, GLOBAL_RE_EXPRESSION);
- assert_string_equal(names_ctx->fq_fmt, GLOBAL_FULL_NAME_FORMAT"%3$s");
- assert_int_equal(names_ctx->fq_flags, FQ_FMT_NAME|FQ_FMT_DOMAIN);
+ assert_string_equal(names_ctx->fq_fmt, GLOBAL_FULL_NAME_FORMAT);
talloc_free(names_ctx);
@@ -541,8 +540,7 @@ void test_sss_names_init(void **state)
assert_int_equal(ret, EOK);
assert_non_null(names_ctx);
assert_string_equal(names_ctx->re_pattern, DOMAIN_RE_EXPRESSION);
- assert_string_equal(names_ctx->fq_fmt, DOMAIN_FULL_NAME_FORMAT"%2$s");
- assert_int_equal(names_ctx->fq_flags, FQ_FMT_NAME|FQ_FMT_FLAT_NAME);
+ assert_string_equal(names_ctx->fq_fmt, DOMAIN_FULL_NAME_FORMAT);
talloc_free(names_ctx);
}
diff --git a/src/util/usertools.c b/src/util/usertools.c
index cd57d0c57..c77aa7ce0 100644
--- a/src/util/usertools.c
+++ b/src/util/usertools.c
@@ -26,6 +26,7 @@
#include "confdb/confdb.h"
#include "util/util.h"
+#include "util/safe-format-string.h"
#include "responder/common/responder.h"
#ifdef HAVE_LIBPCRE_LESSER_THAN_7
@@ -138,18 +139,7 @@ done:
static errno_t sss_fqnames_init(struct sss_names_ctx *nctx, const char *fq_fmt)
{
- struct pattern_desc {
- const char *pattern;
- const char *desc;
- int flag;
- };
-
- struct pattern_desc fqname_patterns[] = {
- { "%1$s", "user name", FQ_FMT_NAME },
- { "%2$s", "domain name", FQ_FMT_DOMAIN },
- { "%3$s", "domain flat name", FQ_FMT_FLAT_NAME },
- { NULL, NULL, 0 }
- };
+ char *fq;
nctx->fq_fmt = talloc_strdup(nctx, fq_fmt);
if (nctx->fq_fmt == NULL) {
@@ -158,34 +148,20 @@ static errno_t sss_fqnames_init(struct sss_names_ctx *nctx, const char *fq_fmt)
DEBUG(SSSDBG_CONF_SETTINGS, ("Using fq format [%s].\n", nctx->fq_fmt));
- /* Fail if the name specifier is missing and warn if the domain
- * specifier is missing
- */
- if (strstr(fq_fmt, fqname_patterns[0].pattern) == NULL) {
+ /* Fail if the name specifier is missing, or if the format is
+ * invalid */
+ fq = sss_tc_fqname2 (nctx, nctx, "unused.example.com", "unused", "the-test-user");
+ if (fq == NULL) {
+ DEBUG(SSSDBG_OP_FAILURE,
+ ("The fq format is invalid [%s]", nctx->fq_fmt));
+ return EINVAL;
+ } else if (strstr (fq, "the-test-user") == NULL) {
DEBUG(SSSDBG_OP_FAILURE,
("Username pattern not found in [%s]\n", nctx->fq_fmt));
return ENOENT;
}
- nctx->fq_flags = FQ_FMT_NAME;
-
- for (int i = 1; fqname_patterns[i].pattern; i++) {
- char *s;
- s = strstr(fq_fmt, fqname_patterns[i].pattern);
- if (s == NULL) {
- /* Append the format specifier */
- nctx->fq_fmt = talloc_strdup_append(nctx->fq_fmt,
- fqname_patterns[i].pattern);
- if (nctx->fq_fmt == NULL) {
- return ENOMEM;
- }
- continue;
- }
-
- DEBUG(SSSDBG_CONF_SETTINGS,
- ("Found the pattern for %s\n", fqname_patterns[i].desc));
- nctx->fq_flags |= fqname_patterns[i].flag;
- }
+ talloc_free (fq);
return EOK;
}
@@ -568,19 +544,13 @@ sss_get_cased_name_list(TALLOC_CTX *mem_ctx, const char * const *orig,
}
static inline const char *
-safe_fq_str(struct sss_names_ctx *nctx, uint8_t part, const char *str)
-{
- return nctx->fq_flags & part ? str : "";
-}
-
-static inline const char *
-safe_flat_name(struct sss_names_ctx *nctx, struct sss_domain_info *domain)
+calc_flat_name(struct sss_domain_info *domain)
{
const char *s;
- s = safe_fq_str(nctx, FQ_FMT_FLAT_NAME, domain->flat_name);
+ s = domain->flat_name;
if (s == NULL) {
- DEBUG(SSSDBG_CRIT_FAILURE, ("Flat name requested but domain has no"
+ DEBUG(SSSDBG_MINOR_FAILURE, ("Flat name requested but domain has no"
"flat name set, falling back to domain name\n"));
s = domain->name;
}
@@ -588,28 +558,24 @@ safe_flat_name(struct sss_names_ctx *nctx, struct sss_domain_info *domain)
return s;
}
-static inline size_t
-fq_part_len(struct sss_names_ctx *nctx, struct sss_domain_info *dom,
- uint8_t part, const char *str)
-{
- const char *s = str;
-
- if (part == FQ_FMT_FLAT_NAME) {
- s = safe_flat_name(nctx, dom);
- }
- return nctx->fq_flags & part ? strlen(s) : 0;
-}
-
char *
sss_tc_fqname(TALLOC_CTX *mem_ctx, struct sss_names_ctx *nctx,
struct sss_domain_info *domain, const char *name)
{
if (domain == NULL || nctx == NULL) return NULL;
- return talloc_asprintf(mem_ctx, nctx->fq_fmt,
- safe_fq_str(nctx, FQ_FMT_NAME, name),
- safe_fq_str(nctx, FQ_FMT_DOMAIN, domain->name),
- safe_flat_name(nctx, domain));
+ return sss_tc_fqname2 (mem_ctx, nctx, domain->name,
+ calc_flat_name (domain), name);
+}
+
+static void
+safe_talloc_callback (void *data,
+ const char *piece,
+ size_t len)
+{
+ char **output = data;
+ if (*output != NULL)
+ *output = talloc_strndup_append(*output, piece, len);
}
char *
@@ -617,12 +583,17 @@ sss_tc_fqname2(TALLOC_CTX *mem_ctx, struct sss_names_ctx *nctx,
const char *domain_name, const char *flat_dom_name,
const char *name)
{
+ const char *args[] = { name, domain_name, flat_dom_name, NULL };
+ char *output;
+
if (nctx == NULL) return NULL;
- return talloc_asprintf(mem_ctx, nctx->fq_fmt,
- safe_fq_str(nctx, FQ_FMT_NAME, name),
- safe_fq_str(nctx, FQ_FMT_DOMAIN, domain_name),
- safe_fq_str(nctx, FQ_FMT_FLAT_NAME, flat_dom_name));
+ output = talloc_strdup(mem_ctx, "");
+ if (safe_format_string_cb(safe_talloc_callback, &output, nctx->fq_fmt, args, 3) < 0)
+ output = NULL;
+ else if (output == NULL)
+ errno = ENOMEM;
+ return output;
}
int
@@ -631,19 +602,8 @@ sss_fqname(char *str, size_t size, struct sss_names_ctx *nctx,
{
if (domain == NULL || nctx == NULL) return -EINVAL;
- return snprintf(str, size, nctx->fq_fmt,
- safe_fq_str(nctx, FQ_FMT_NAME, name),
- safe_fq_str(nctx, FQ_FMT_DOMAIN, domain->name),
- safe_flat_name(nctx, domain));
-}
-
-size_t
-sss_fqdom_len(struct sss_names_ctx *nctx,
- struct sss_domain_info *domain)
-{
- size_t len = fq_part_len(nctx, domain, FQ_FMT_DOMAIN, domain->name);
- len += fq_part_len(nctx, domain, FQ_FMT_FLAT_NAME, domain->flat_name);
- return len;
+ return safe_format_string(str, size, nctx->fq_fmt,
+ name, domain->name, calc_flat_name (domain), NULL);
}
char *
diff --git a/src/util/util.h b/src/util/util.h
index 101270571..4a9dbb75f 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -324,14 +324,9 @@ char *get_username_from_uid(TALLOC_CTX *mem_ctx, uid_t uid);
char *get_uppercase_realm(TALLOC_CTX *memctx, const char *name);
-#define FQ_FMT_NAME 0x01
-#define FQ_FMT_DOMAIN 0x02
-#define FQ_FMT_FLAT_NAME 0x04
-
struct sss_names_ctx {
char *re_pattern;
char *fq_fmt;
- uint8_t fq_flags;
pcre *re;
};
@@ -384,15 +379,14 @@ sss_tc_fqname2(TALLOC_CTX *mem_ctx, struct sss_names_ctx *nctx,
/* Return fully-qualified name formatted according to the fq_fmt. The buffer in "str" is
* "size" bytes long. Returns the number of bytes written on success or a negative
* value of failure.
+ *
+ * Pass a zero size to calculate the length that would be needed by the fully-qualified
+ * name.
*/
int
sss_fqname(char *str, size_t size, struct sss_names_ctx *nctx,
struct sss_domain_info *domain, const char *name);
-size_t
-sss_fqdom_len(struct sss_names_ctx *nctx,
- struct sss_domain_info *domain);
-
/* Subdomains use fully qualified names in the cache while primary domains use
* just the name. Return either of these for a specified domain or subdomain
*/