|
|
905b4d |
From a122ee37841392ceb8332d51728b54f9656225bc Mon Sep 17 00:00:00 2001
|
|
|
905b4d |
From: Sumit Bose <sbose@redhat.com>
|
|
|
905b4d |
Date: Tue, 20 Jan 2015 13:50:16 +0100
|
|
|
905b4d |
Subject: [PATCH 171/172] nss: refactor fill_orig()
|
|
|
905b4d |
|
|
|
905b4d |
The two loops in fill_orig were almost identical.
|
|
|
905b4d |
|
|
|
905b4d |
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
|
|
|
905b4d |
(cherry picked from commit a4d64002b5ca763622bde240d27797d361ba0388)
|
|
|
905b4d |
---
|
|
|
905b4d |
src/responder/nss/nsssrv_cmd.c | 133 ++++++++++++++++++++---------------------
|
|
|
905b4d |
1 file changed, 66 insertions(+), 67 deletions(-)
|
|
|
905b4d |
|
|
|
905b4d |
diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c
|
|
|
905b4d |
index b49807e3e349942c0617253fdf45b4ad43ba2ee1..6b9988548cdb25873e0c59503595e42d69b8d8e1 100644
|
|
|
905b4d |
--- a/src/responder/nss/nsssrv_cmd.c
|
|
|
905b4d |
+++ b/src/responder/nss/nsssrv_cmd.c
|
|
|
905b4d |
@@ -4605,6 +4605,61 @@ static errno_t fill_sid(struct sss_packet *packet,
|
|
|
905b4d |
return EOK;
|
|
|
905b4d |
}
|
|
|
905b4d |
|
|
|
905b4d |
+static errno_t process_attr_list(TALLOC_CTX *mem_ctx, struct ldb_message *msg,
|
|
|
905b4d |
+ const char **attr_list,
|
|
|
905b4d |
+ struct sized_string **_keys,
|
|
|
905b4d |
+ struct sized_string **_vals,
|
|
|
905b4d |
+ size_t *array_size, size_t *sum, size_t *found)
|
|
|
905b4d |
+{
|
|
|
905b4d |
+ size_t c;
|
|
|
905b4d |
+ size_t d;
|
|
|
905b4d |
+ struct sized_string *keys;
|
|
|
905b4d |
+ struct sized_string *vals;
|
|
|
905b4d |
+ struct ldb_val *val;
|
|
|
905b4d |
+ struct ldb_message_element *el;
|
|
|
905b4d |
+
|
|
|
905b4d |
+ keys = *_keys;
|
|
|
905b4d |
+ vals = *_vals;
|
|
|
905b4d |
+
|
|
|
905b4d |
+ for (c = 0; attr_list[c] != NULL; c++) {
|
|
|
905b4d |
+ el = ldb_msg_find_element(msg, attr_list[c]);
|
|
|
905b4d |
+ if (el != NULL && el->num_values > 0) {
|
|
|
905b4d |
+ if (el->num_values > 1) {
|
|
|
905b4d |
+ *array_size += el->num_values;
|
|
|
905b4d |
+ keys = talloc_realloc(mem_ctx, keys, struct sized_string,
|
|
|
905b4d |
+ *array_size);
|
|
|
905b4d |
+ vals = talloc_realloc(mem_ctx, vals, struct sized_string,
|
|
|
905b4d |
+ *array_size);
|
|
|
905b4d |
+ if (keys == NULL || vals == NULL) {
|
|
|
905b4d |
+ DEBUG(SSSDBG_OP_FAILURE, "talloc_array failed.\n");
|
|
|
905b4d |
+ return ENOMEM;
|
|
|
905b4d |
+ }
|
|
|
905b4d |
+ }
|
|
|
905b4d |
+ for (d = 0; d < el->num_values; d++) {
|
|
|
905b4d |
+ to_sized_string(&keys[*found], attr_list[c]);
|
|
|
905b4d |
+ *sum += keys[*found].len;
|
|
|
905b4d |
+ val = &(el->values[d]);
|
|
|
905b4d |
+ if (val == NULL || val->data == NULL
|
|
|
905b4d |
+ || val->data[val->length] != '\0') {
|
|
|
905b4d |
+ DEBUG(SSSDBG_CRIT_FAILURE,
|
|
|
905b4d |
+ "Unexpected attribute value found for [%s].\n",
|
|
|
905b4d |
+ attr_list[c]);
|
|
|
905b4d |
+ return EINVAL;
|
|
|
905b4d |
+ }
|
|
|
905b4d |
+ to_sized_string(&vals[*found], (const char *)val->data);
|
|
|
905b4d |
+ *sum += vals[*found].len;
|
|
|
905b4d |
+
|
|
|
905b4d |
+ (*found)++;
|
|
|
905b4d |
+ }
|
|
|
905b4d |
+ }
|
|
|
905b4d |
+ }
|
|
|
905b4d |
+
|
|
|
905b4d |
+ *_keys = keys;
|
|
|
905b4d |
+ *_vals = vals;
|
|
|
905b4d |
+
|
|
|
905b4d |
+ return EOK;
|
|
|
905b4d |
+}
|
|
|
905b4d |
+
|
|
|
905b4d |
static errno_t fill_orig(struct sss_packet *packet,
|
|
|
905b4d |
struct resp_ctx *rctx,
|
|
|
905b4d |
enum sss_id_type id_type,
|
|
|
905b4d |
@@ -4616,7 +4671,6 @@ static errno_t fill_orig(struct sss_packet *packet,
|
|
|
905b4d |
size_t blen;
|
|
|
905b4d |
size_t pctr = 0;
|
|
|
905b4d |
size_t c;
|
|
|
905b4d |
- size_t d;
|
|
|
905b4d |
size_t sum;
|
|
|
905b4d |
size_t found;
|
|
|
905b4d |
size_t array_size;
|
|
|
905b4d |
@@ -4638,8 +4692,6 @@ static errno_t fill_orig(struct sss_packet *packet,
|
|
|
905b4d |
struct sized_string *keys;
|
|
|
905b4d |
struct sized_string *vals;
|
|
|
905b4d |
struct nss_ctx *nctx;
|
|
|
905b4d |
- struct ldb_message_element *el;
|
|
|
905b4d |
- struct ldb_val *val;
|
|
|
905b4d |
|
|
|
905b4d |
tmp_ctx = talloc_new(NULL);
|
|
|
905b4d |
if (tmp_ctx == NULL) {
|
|
|
905b4d |
@@ -4666,73 +4718,20 @@ static errno_t fill_orig(struct sss_packet *packet,
|
|
|
905b4d |
|
|
|
905b4d |
sum = 0;
|
|
|
905b4d |
found = 0;
|
|
|
905b4d |
- for (c = 0; orig_attr_list[c] != NULL; c++) {
|
|
|
905b4d |
- el = ldb_msg_find_element(msg, orig_attr_list[c]);
|
|
|
905b4d |
- if (el != NULL && el->num_values > 0) {
|
|
|
905b4d |
- if (el->num_values > 1) {
|
|
|
905b4d |
- array_size += el->num_values;
|
|
|
905b4d |
- keys = talloc_realloc(tmp_ctx, keys, struct sized_string,
|
|
|
905b4d |
- array_size);
|
|
|
905b4d |
- vals = talloc_realloc(tmp_ctx, vals, struct sized_string,
|
|
|
905b4d |
- array_size);
|
|
|
905b4d |
- if (keys == NULL || vals == NULL) {
|
|
|
905b4d |
- DEBUG(SSSDBG_OP_FAILURE, "talloc_array failed.\n");
|
|
|
905b4d |
- ret = ENOMEM;
|
|
|
905b4d |
- goto done;
|
|
|
905b4d |
- }
|
|
|
905b4d |
- }
|
|
|
905b4d |
- for (d = 0; d < el->num_values; d++) {
|
|
|
905b4d |
- to_sized_string(&keys[found], orig_attr_list[c]);
|
|
|
905b4d |
- sum += keys[found].len;
|
|
|
905b4d |
- val = &(el->values[d]);
|
|
|
905b4d |
- if (val == NULL || val->data == NULL
|
|
|
905b4d |
- || val->data[val->length] != '\0') {
|
|
|
905b4d |
- DEBUG(SSSDBG_CRIT_FAILURE,
|
|
|
905b4d |
- "Unexpected attribute value found for [%s].\n",
|
|
|
905b4d |
- orig_attr_list[c]);
|
|
|
905b4d |
- ret = EINVAL;
|
|
|
905b4d |
- goto done;
|
|
|
905b4d |
- }
|
|
|
905b4d |
- to_sized_string(&vals[found], (const char *)val->data);
|
|
|
905b4d |
- sum += vals[found].len;
|
|
|
905b4d |
|
|
|
905b4d |
- found++;
|
|
|
905b4d |
- }
|
|
|
905b4d |
- }
|
|
|
905b4d |
+ ret = process_attr_list(tmp_ctx, msg, orig_attr_list, &keys, &vals,
|
|
|
905b4d |
+ &array_size, &sum, &found);
|
|
|
905b4d |
+ if (ret != EOK) {
|
|
|
905b4d |
+ DEBUG(SSSDBG_OP_FAILURE, "process_attr_list failed.\n");
|
|
|
905b4d |
+ goto done;
|
|
|
905b4d |
}
|
|
|
905b4d |
|
|
|
905b4d |
- for (c = 0; c < extra_attrs_count; c++) {
|
|
|
905b4d |
- el = ldb_msg_find_element(msg, extra_attrs_list[c]);
|
|
|
905b4d |
- if (el != NULL && el->num_values > 0) {
|
|
|
905b4d |
- if (el->num_values > 1) {
|
|
|
905b4d |
- array_size += el->num_values;
|
|
|
905b4d |
- keys = talloc_realloc(tmp_ctx, keys, struct sized_string,
|
|
|
905b4d |
- array_size);
|
|
|
905b4d |
- vals = talloc_realloc(tmp_ctx, vals, struct sized_string,
|
|
|
905b4d |
- array_size);
|
|
|
905b4d |
- if (keys == NULL || vals == NULL) {
|
|
|
905b4d |
- DEBUG(SSSDBG_OP_FAILURE, "talloc_array failed.\n");
|
|
|
905b4d |
- ret = ENOMEM;
|
|
|
905b4d |
- goto done;
|
|
|
905b4d |
- }
|
|
|
905b4d |
- }
|
|
|
905b4d |
- for (d = 0; d < el->num_values; d++) {
|
|
|
905b4d |
- to_sized_string(&keys[found], extra_attrs_list[c]);
|
|
|
905b4d |
- sum += keys[found].len;
|
|
|
905b4d |
- val = &(el->values[d]);
|
|
|
905b4d |
- if (val == NULL || val->data == NULL
|
|
|
905b4d |
- || val->data[val->length] != '\0') {
|
|
|
905b4d |
- DEBUG(SSSDBG_CRIT_FAILURE,
|
|
|
905b4d |
- "Unexpected attribute value found for [%s].\n",
|
|
|
905b4d |
- orig_attr_list[c]);
|
|
|
905b4d |
- ret = EINVAL;
|
|
|
905b4d |
- goto done;
|
|
|
905b4d |
- }
|
|
|
905b4d |
- to_sized_string(&vals[found], (const char *)val->data);
|
|
|
905b4d |
- sum += vals[found].len;
|
|
|
905b4d |
-
|
|
|
905b4d |
- found++;
|
|
|
905b4d |
- }
|
|
|
905b4d |
+ if (extra_attrs_count != 0) {
|
|
|
905b4d |
+ ret = process_attr_list(tmp_ctx, msg, extra_attrs_list, &keys, &vals,
|
|
|
905b4d |
+ &array_size, &sum, &found);
|
|
|
905b4d |
+ if (ret != EOK) {
|
|
|
905b4d |
+ DEBUG(SSSDBG_OP_FAILURE, "process_attr_list failed.\n");
|
|
|
905b4d |
+ goto done;
|
|
|
905b4d |
}
|
|
|
905b4d |
}
|
|
|
905b4d |
|
|
|
905b4d |
--
|
|
|
905b4d |
2.1.0
|
|
|
905b4d |
|