Blame SOURCES/0171-nss-refactor-fill_orig.patch

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