[SSSD] [PATCH] Service lookup fixes

Jakub Hrozek jhrozek at redhat.com
Thu Mar 22 23:24:01 UTC 2012


Attached are patches that fix some issues with service lookups and case
sensitivity.

[PATCH 1/3] Add sss_get_cased_name_list utility function
This pattern would repeat in later patches

[PATCH 2/3] LDAP services: Save lowercased protocol names in case-insensitive
domains
https://fedorahosted.org/sssd/ticket/1260

[PATCH 3/3] Proxy services: Save lowercased protocol names and
aliases in case-insensitive domains
I'm not sure if anyone is ever going to use case insensitive service
lookups in the proxy domain, but I think we should implement it for
completeness' sake.
-------------- next part --------------
From 64f55a0b50229fb6f8854712de257be7cc27431a Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Thu, 22 Mar 2012 16:49:12 +0100
Subject: [PATCH 1/3] Add sss_get_cased_name_list utility function

---
 src/util/usertools.c |   37 +++++++++++++++++++++++++++++++++++++
 src/util/util.h      |    4 ++++
 2 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/src/util/usertools.c b/src/util/usertools.c
index 64e8b1037fca322492e2d7c55152a7b07592df85..ff189e32fa5235bbc9d9828dd7b7269bc4403cb1 100644
--- a/src/util/usertools.c
+++ b/src/util/usertools.c
@@ -182,3 +182,40 @@ sss_get_cased_name(TALLOC_CTX *mem_ctx,
     return case_sensitive ? talloc_strdup(mem_ctx, orig_name) :
                             sss_tc_utf8_str_tolower(mem_ctx, orig_name);
 }
+
+errno_t
+sss_get_cased_name_list(TALLOC_CTX *mem_ctx, const char * const *orig,
+                        bool case_sensitive, const char ***_cased)
+{
+    const char **out;
+    size_t num, i;
+
+    if (orig == NULL) {
+        *_cased = NULL;
+        return EOK;
+    }
+
+    for (num=0; orig[num]; num++);  /* count the num of strings */
+
+    if (num == 0) {
+        *_cased = NULL;
+        return EOK;
+    }
+
+    out = talloc_array(mem_ctx, const char *, num + 1);
+    if (out == NULL) {
+        return ENOMEM;
+    }
+
+    for (i = 0; i < num; i++) {
+        out[i] = sss_get_cased_name(out, orig[i], case_sensitive);
+        if (out[i] == NULL) {
+            talloc_free(out);
+            return ENOMEM;
+        }
+    }
+
+    out[num] = NULL;
+    *_cased = out;
+    return EOK;
+}
diff --git a/src/util/util.h b/src/util/util.h
index 985c7898182c5e58ca79e049f99f37d724009cf1..da6db1cffe36035f27c447b9971b4a8ba7b7f740 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -405,6 +405,10 @@ char *
 sss_get_cased_name(TALLOC_CTX *mem_ctx, const char *orig_name,
                    bool case_sensitive);
 
+errno_t
+sss_get_cased_name_list(TALLOC_CTX *mem_ctx, const char * const *orig,
+                        bool case_sensitive, const char ***_cased);
+
 /* from backup-file.c */
 int backup_file(const char *src, int dbglvl);
 
-- 
1.7.7.6

-------------- next part --------------
From 1572ece3f415e7bda2101f584952adcdb6c3863c Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Thu, 22 Mar 2012 16:50:12 +0100
Subject: [PATCH 2/3] LDAP services: Save lowercased protocol names in
 case-insensitive domains

https://fedorahosted.org/sssd/ticket/1260
---
 src/providers/ldap/sdap_async_services.c |   18 +++++++++++++++++-
 1 files changed, 17 insertions(+), 1 deletions(-)

diff --git a/src/providers/ldap/sdap_async_services.c b/src/providers/ldap/sdap_async_services.c
index ae96d888226bc28ff2285b644f371cdfac0f975f..c87d07c4484914732e51ccb6de011f0234a8c1e6 100644
--- a/src/providers/ldap/sdap_async_services.c
+++ b/src/providers/ldap/sdap_async_services.c
@@ -351,6 +351,8 @@ sdap_save_service(TALLOC_CTX *mem_ctx,
     const char *name = NULL;
     const char **aliases;
     const char **protocols;
+    const char **cased_protocols;
+    const char **store_protocols;
     char **missing;
     uint16_t port;
     uint64_t cache_timeout;
@@ -412,6 +414,20 @@ sdap_save_service(TALLOC_CTX *mem_ctx,
         goto done;
     }
 
+    if (dom->case_sensitive == false) {
+        /* Don't perform the extra mallocs if not necessary */
+        ret = sss_get_cased_name_list(tmp_ctx, protocols,
+                                      dom->case_sensitive, &cased_protocols);
+        if (ret != EOK) {
+            DEBUG(SSSDBG_MINOR_FAILURE,
+                ("Failed to get case_sensitive protocols names: [%s]\n",
+                strerror(ret)));
+            goto done;
+        }
+    }
+
+    store_protocols = dom->case_sensitive ? protocols : cased_protocols;
+
     /* Get the USN value, if available */
     ret = sysdb_attrs_get_el(attrs,
                       opts->service_map[SDAP_AT_SERVICE_USN].sys_name, &el);
@@ -456,7 +472,7 @@ sdap_save_service(TALLOC_CTX *mem_ctx,
 
     cache_timeout = dom->service_timeout;
 
-    ret = sysdb_store_service(sysdb, name, port, aliases, protocols,
+    ret = sysdb_store_service(sysdb, name, port, aliases, store_protocols,
                               svc_attrs, missing, cache_timeout, now);
     if (ret != EOK) {
         DEBUG(SSSDBG_MINOR_FAILURE,
-- 
1.7.7.6

-------------- next part --------------
From 1e267f00b6257c7ecb2c6a3cb599d5440b572c5a Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Thu, 22 Mar 2012 16:51:46 +0100
Subject: [PATCH 3/3] Proxy services: Save lowercased protocol names and
 aliases in case-insensitive domains

---
 src/providers/proxy/proxy_services.c |   74 ++++++++--------------------------
 1 files changed, 17 insertions(+), 57 deletions(-)

diff --git a/src/providers/proxy/proxy_services.c b/src/providers/proxy/proxy_services.c
index e5654d75b9cd2b06f75e5994c4cddcb8a175ba3d..2b606064ce0e367f3d7273c5065c9e3b4007e349 100644
--- a/src/providers/proxy/proxy_services.c
+++ b/src/providers/proxy/proxy_services.c
@@ -38,7 +38,6 @@ proxy_save_service(struct sysdb_ctx *sysdb,
     const char **protocols;
     const char **cased_aliases;
     TALLOC_CTX *tmp_ctx;
-    size_t num_aliases, i;
     time_t now = time(NULL);
 
     tmp_ctx = talloc_new(NULL);
@@ -65,26 +64,11 @@ proxy_save_service(struct sysdb_ctx *sysdb,
     protocols[1] = NULL;
 
     /* Count the aliases */
-    for(num_aliases = 0; svc->s_aliases[num_aliases]; num_aliases++);
-
-    if (num_aliases >= 1) {
-        cased_aliases = talloc_array(tmp_ctx, const char *, num_aliases + 1);
-        if (!cased_aliases) {
-            ret = ENOMEM;
-            goto done;
-        }
-
-        for (i = 0; i < num_aliases; i++) {
-            cased_aliases[i] = sss_get_cased_name(tmp_ctx, svc->s_aliases[i],
-                                                  !lowercase);
-            if (!cased_aliases[i]) {
-                ret = ENOMEM;
-                goto done;
-            }
-        }
-        cased_aliases[num_aliases] = NULL;
-    } else {
-        cased_aliases = NULL;
+    ret = sss_get_cased_name_list(tmp_ctx,
+                                  (const char * const *) svc->s_aliases,
+                                  !lowercase, &cased_aliases);
+    if (ret != EOK) {
+        goto done;
     }
 
     ret = sysdb_store_service(sysdb,
@@ -199,38 +183,6 @@ done:
     return ret;
 }
 
-static errno_t
-get_const_aliases(TALLOC_CTX *mem_ctx,
-                  char **aliases,
-                  const char ***const_aliases)
-{
-    errno_t ret;
-    size_t i, num_aliases;
-    const char **alias_list = NULL;
-
-    for (num_aliases = 0; aliases[num_aliases]; num_aliases++);
-
-    alias_list = talloc_zero_array(mem_ctx, const char *, num_aliases + 1);
-    if (!alias_list) return ENOMEM;
-
-    for (i = 0; aliases[i]; i++) {
-        alias_list[i] = talloc_strdup(alias_list, aliases[i]);
-        if (!alias_list[i]) {
-            ret = ENOMEM;
-            goto done;
-        }
-    }
-
-    ret = EOK;
-    *const_aliases = alias_list;
-
-done:
-    if (ret != EOK) {
-        talloc_zfree(alias_list);
-    }
-    return ret;
-}
-
 errno_t
 enum_services(struct proxy_id_ctx *ctx,
               struct sysdb_ctx *sysdb,
@@ -246,6 +198,7 @@ enum_services(struct proxy_id_ctx *ctx,
     errno_t ret, sret;
     time_t now = time(NULL);
     const char *protocols[2] = { NULL, NULL };
+    const char **cased_aliases;
 
     DEBUG(SSSDBG_TRACE_FUNC, ("Enumerating services\n"));
 
@@ -320,10 +273,17 @@ again:
               ("Service found (%s, %d/%s)\n",
                svc->s_name, svc->s_port, svc->s_proto));
 
-        protocols[0] = svc->s_proto;
+        protocols[0] = sss_get_cased_name(protocols, svc->s_proto,
+                                          dom->case_sensitive);
+        if (!protocols[0]) {
+            ret = ENOMEM;
+            goto done;
+        }
+        protocols[1] = NULL;
 
-        const char **const_aliases;
-        ret = get_const_aliases(tmpctx, svc->s_aliases, &const_aliases);
+        ret = sss_get_cased_name_list(tmpctx,
+                                      (const char * const *) svc->s_aliases,
+                                      dom->case_sensitive, &cased_aliases);
         if (ret != EOK) {
             /* Do not fail completely on errors.
              * Just report the failure to save and go on */
@@ -336,7 +296,7 @@ again:
         ret = sysdb_store_service(sysdb,
                                   svc->s_name,
                                   svc->s_port,
-                                  const_aliases,
+                                  cased_aliases,
                                   protocols,
                                   NULL, NULL,
                                   dom->service_timeout,
-- 
1.7.7.6



More information about the sssd-devel mailing list