Hi, there is a change in libldb of f13 which makes the IPA access provider fail if there a no memberof attributes in a host entry. I think this is also the reason for #499. The first patch adds a new sysdb_attrs call which does not create an empty element and the second patch add this call to the IPA access provider.
For your convenience I have add patches against 1.2 and master. bye, Sumit
From 90c521f7050953a365532f622cd81385f7dcc229 Mon Sep 17 00:00:00 2001 From: Sumit Bose <[email protected]> Date: Fri, 28 May 2010 14:28:06 +0200 Subject: [PATCH 1/2] Add sysdb_attrs_get_string_array() --- src/db/sysdb.c | 33 +++++++++++++++++++++++++++++++++ src/db/sysdb.h | 2 ++ 2 files changed, 35 insertions(+), 0 deletions(-) diff --git a/src/db/sysdb.c b/src/db/sysdb.c index 21e69c0..41e1756 100644 --- a/src/db/sysdb.c +++ b/src/db/sysdb.c @@ -140,6 +140,39 @@ int sysdb_attrs_get_string(struct sysdb_attrs *attrs, const char *name, return EOK; } +int sysdb_attrs_get_string_array(struct sysdb_attrs *attrs, const char *name, + TALLOC_CTX *mem_ctx, const char ***string) +{ + struct ldb_message_element *el; + int ret; + unsigned int u; + const char **a; + + ret = sysdb_attrs_get_el_int(attrs, name, false, &el); + if (ret) { + return ret; + } + + a = talloc_array(mem_ctx, const char *, el->num_values + 1); + if (a == NULL) { + return ENOMEM; + } + + memset(a, 0, sizeof(const char *) * (el->num_values + 1)); + + for(u = 0; u < el->num_values; u++) { + a[u] = talloc_strndup(a, (const char *)el->values[u].data, + el->values[u].length); + if (a[u] == NULL) { + talloc_free(a); + return ENOMEM; + } + } + + *string = a; + return EOK; +} + int sysdb_attrs_add_val(struct sysdb_attrs *attrs, const char *name, const struct ldb_val *val) { diff --git a/src/db/sysdb.h b/src/db/sysdb.h index fcdb90e..50427d6 100644 --- a/src/db/sysdb.h +++ b/src/db/sysdb.h @@ -176,6 +176,8 @@ int sysdb_attrs_steal_string(struct sysdb_attrs *attrs, const char *name, char *str); int sysdb_attrs_get_string(struct sysdb_attrs *attrs, const char *name, const char **string); +int sysdb_attrs_get_string_array(struct sysdb_attrs *attrs, const char *name, + TALLOC_CTX *mem_ctx, const char ***string); int sysdb_attrs_replace_name(struct sysdb_attrs *attrs, const char *oldname, const char *newname); -- 1.7.0.1
From ddd4a62bd502ab8c931d02ddb40231dcbe69f119 Mon Sep 17 00:00:00 2001 From: Sumit Bose <[email protected]> Date: Fri, 28 May 2010 14:29:15 +0200 Subject: [PATCH 2/2] Use sysdb_attrs_get_string_array() instead of sysdb_attrs_get_el() sysdb_attrs_get_el() creates an empty element in the sysdb_attrs structure if the requested element does not exist. Recent versions of libldb do not accept empty elements when writing new objects to disk. sysdb_attrs_get_string_array() does not create an empty element but returns ENOENT. --- src/providers/ipa/ipa_access.c | 35 ++++++++++++----------------------- 1 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/providers/ipa/ipa_access.c b/src/providers/ipa/ipa_access.c index 9d639e6..a4dc531 100644 --- a/src/providers/ipa/ipa_access.c +++ b/src/providers/ipa/ipa_access.c @@ -1180,7 +1180,6 @@ static void hbac_get_host_memberof_done(struct tevent_req *subreq) struct hbac_get_host_info_state); int ret; int i; - int v; struct ldb_message_element *el; struct hbac_host_info **hhi; struct ldb_message **msgs; @@ -1286,33 +1285,23 @@ static void hbac_get_host_memberof_done(struct tevent_req *subreq) goto fail; } - ret = sysdb_attrs_get_el(state->host_reply_list[i], - state->offline ? SYSDB_ORIG_MEMBEROF : - IPA_MEMBEROF, - &el); + ret = sysdb_attrs_get_string_array(state->host_reply_list[i], + state->offline ? SYSDB_ORIG_MEMBEROF : + IPA_MEMBEROF, + hhi, &(hhi[i]->memberof)); if (ret != EOK) { - DEBUG(1, ("sysdb_attrs_get_el failed.\n")); - goto fail; - } - - hhi[i]->memberof = talloc_array(hhi, const char *, el->num_values + 1); - if (hhi[i]->memberof == NULL) { - ret = ENOMEM; - goto fail; - } - memset(hhi[i]->memberof, 0, - sizeof(const char *) * (el->num_values + 1)); + if (ret != ENOENT) { + DEBUG(1, ("sysdb_attrs_get_string_array failed.\n")); + goto fail; + } - for(v = 0; v < el->num_values; v++) { - DEBUG(9, ("%s: [%.*s].\n", IPA_MEMBEROF, el->values[v].length, - (const char *)el->values[v].data)); - hhi[i]->memberof[v] = talloc_strndup(hhi, - (const char *)el->values[v].data, - el->values[v].length); - if (hhi[i]->memberof[v] == NULL) { + hhi[i]->memberof = talloc_array(hhi, const char *, 1); + if (hhi[i]->memberof == NULL) { + DEBUG(1, ("talloc_array failed.\n")); ret = ENOMEM; goto fail; } + hhi[i]->memberof[0] = NULL; } } -- 1.7.0.1
From 898942572925cb5da64e79d70c48dddd9771a6d8 Mon Sep 17 00:00:00 2001 From: Sumit Bose <[email protected]> Date: Fri, 28 May 2010 14:28:06 +0200 Subject: [PATCH 1/2] Add sysdb_attrs_get_string_array() --- src/db/sysdb.c | 33 +++++++++++++++++++++++++++++++++ src/db/sysdb.h | 2 ++ 2 files changed, 35 insertions(+), 0 deletions(-) diff --git a/src/db/sysdb.c b/src/db/sysdb.c index bfad77d..f784e73 100644 --- a/src/db/sysdb.c +++ b/src/db/sysdb.c @@ -130,6 +130,39 @@ int sysdb_attrs_get_string(struct sysdb_attrs *attrs, const char *name, return EOK; } +int sysdb_attrs_get_string_array(struct sysdb_attrs *attrs, const char *name, + TALLOC_CTX *mem_ctx, const char ***string) +{ + struct ldb_message_element *el; + int ret; + unsigned int u; + const char **a; + + ret = sysdb_attrs_get_el_int(attrs, name, false, &el); + if (ret) { + return ret; + } + + a = talloc_array(mem_ctx, const char *, el->num_values + 1); + if (a == NULL) { + return ENOMEM; + } + + memset(a, 0, sizeof(const char *) * (el->num_values + 1)); + + for(u = 0; u < el->num_values; u++) { + a[u] = talloc_strndup(a, (const char *)el->values[u].data, + el->values[u].length); + if (a[u] == NULL) { + talloc_free(a); + return ENOMEM; + } + } + + *string = a; + return EOK; +} + int sysdb_attrs_add_val(struct sysdb_attrs *attrs, const char *name, const struct ldb_val *val) { diff --git a/src/db/sysdb.h b/src/db/sysdb.h index a5413a2..5411945 100644 --- a/src/db/sysdb.h +++ b/src/db/sysdb.h @@ -175,6 +175,8 @@ int sysdb_attrs_steal_string(struct sysdb_attrs *attrs, const char *name, char *str); int sysdb_attrs_get_string(struct sysdb_attrs *attrs, const char *name, const char **string); +int sysdb_attrs_get_string_array(struct sysdb_attrs *attrs, const char *name, + TALLOC_CTX *mem_ctx, const char ***string); int sysdb_attrs_replace_name(struct sysdb_attrs *attrs, const char *oldname, const char *newname); -- 1.7.0.1
From 41575a7f6ea9c889b0ce627a38211d33fd68c0ac Mon Sep 17 00:00:00 2001 From: Sumit Bose <[email protected]> Date: Fri, 28 May 2010 14:29:15 +0200 Subject: [PATCH 2/2] Use sysdb_attrs_get_string_array() instead of sysdb_attrs_get_el() sysdb_attrs_get_el() creates an empty element in the sysdb_attrs structure if the requested element does not exist. Recent versions of libldb do not accept empty elements when writing new objects to disk. sysdb_attrs_get_string_array() does not create an empty element but returns ENOENT. --- src/providers/ipa/ipa_access.c | 35 ++++++++++++----------------------- 1 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/providers/ipa/ipa_access.c b/src/providers/ipa/ipa_access.c index 590ae78..56bb269 100644 --- a/src/providers/ipa/ipa_access.c +++ b/src/providers/ipa/ipa_access.c @@ -431,7 +431,6 @@ static void hbac_get_host_memberof(struct tevent_req *req, bool in_transaction = false; int ret; int i; - int v; struct ldb_message_element *el; struct hbac_host_info **hhi; char *object_name; @@ -524,33 +523,23 @@ static void hbac_get_host_memberof(struct tevent_req *req, goto fail; } - ret = sysdb_attrs_get_el(state->host_reply_list[i], - state->offline ? SYSDB_ORIG_MEMBEROF : - IPA_HOST_MEMBEROF, - &el); + ret = sysdb_attrs_get_string_array(state->host_reply_list[i], + state->offline ? SYSDB_ORIG_MEMBEROF : + IPA_MEMBEROF, + hhi, &(hhi[i]->memberof)); if (ret != EOK) { - DEBUG(1, ("sysdb_attrs_get_el failed.\n")); - goto fail; - } + if (ret != ENOENT) { + DEBUG(1, ("sysdb_attrs_get_string_array failed.\n")); + goto fail; + } - hhi[i]->memberof = talloc_array(hhi, const char *, el->num_values + 1); - if (hhi[i]->memberof == NULL) { - ret = ENOMEM; - goto fail; - } - memset(hhi[i]->memberof, 0, - sizeof(const char *) * (el->num_values + 1)); - - for(v = 0; v < el->num_values; v++) { - DEBUG(9, ("%s: [%.*s].\n", IPA_HOST_MEMBEROF, el->values[v].length, - (const char *)el->values[v].data)); - hhi[i]->memberof[v] = talloc_strndup(hhi, - (const char *)el->values[v].data, - el->values[v].length); - if (hhi[i]->memberof[v] == NULL) { + hhi[i]->memberof = talloc_array(hhi, const char *, 1); + if (hhi[i]->memberof == NULL) { + DEBUG(1, ("talloc_array failed.\n")); ret = ENOMEM; goto fail; } + hhi[i]->memberof[0] = NULL; } } -- 1.7.0.1
_______________________________________________ sssd-devel mailing list [email protected] https://fedorahosted.org/mailman/listinfo/sssd-devel
