e3ffab
From 1a4a6e0350e1b95e4c5185fdd299f2c1a2273a94 Mon Sep 17 00:00:00 2001
e3ffab
From: Simo Sorce <simo@redhat.com>
e3ffab
Date: Fri, 12 Dec 2014 13:56:51 -0500
e3ffab
Subject: [PATCH] Avoid calling ldap functions without a context
e3ffab
e3ffab
We need to make sure we have a ld context before we can load the
e3ffab
configuration, otherwise ldap APIs will abort crashing the KDC.
e3ffab
e3ffab
If we have an issue connecting to LDAP the lcontext will be NULL, but
e3ffab
we are not checking that condition when we try to refresh the global
e3ffab
configuration.
e3ffab
e3ffab
https://fedorahosted.org/freeipa/ticket/4810
e3ffab
e3ffab
Signed-off-by: Simo Sorce <simo@redhat.com>
e3ffab
Reviewed-By: Martin Kosek <mkosek@redhat.com>
e3ffab
---
e3ffab
 daemons/ipa-kdb/ipa_kdb.c | 19 ++++++++++++++++---
e3ffab
 1 file changed, 16 insertions(+), 3 deletions(-)
e3ffab
e3ffab
diff --git a/daemons/ipa-kdb/ipa_kdb.c b/daemons/ipa-kdb/ipa_kdb.c
e3ffab
index e5101bdd0ad880888fd58fd93a5ca8133868db98..d20b6a1f4666a40f1f0523c5ee9b729e27b666ad 100644
e3ffab
--- a/daemons/ipa-kdb/ipa_kdb.c
e3ffab
+++ b/daemons/ipa-kdb/ipa_kdb.c
e3ffab
@@ -224,6 +224,10 @@ static int ipadb_load_global_config(struct ipadb_context *ipactx)
e3ffab
     int ret;
e3ffab
     char **authz_data_list;
e3ffab
 
e3ffab
+    if (!ipactx || !ipactx->lcontext) {
e3ffab
+        return EINVAL;
e3ffab
+    }
e3ffab
+
e3ffab
     ret = asprintf(&base, "cn=ipaConfig,cn=etc,%s", ipactx->base);
e3ffab
     if (ret == -1) {
e3ffab
         ret = ENOMEM;
e3ffab
@@ -295,10 +299,19 @@ const struct ipadb_global_config *
e3ffab
 ipadb_get_global_config(struct ipadb_context *ipactx)
e3ffab
 {
e3ffab
     time_t now = 0;
e3ffab
+    int ret;
e3ffab
 
e3ffab
-    if (time(&now) != (time_t)-1
e3ffab
-        && now - ipactx->config.last_update > IPADB_GLOBAL_CONFIG_CACHE_TIME)
e3ffab
-        ipadb_load_global_config(ipactx);
e3ffab
+    if (time(&now) != (time_t)-1 &&
e3ffab
+        now - ipactx->config.last_update > IPADB_GLOBAL_CONFIG_CACHE_TIME) {
e3ffab
+        if (!ipactx->lcontext) {
e3ffab
+            ret = ipadb_get_connection(ipactx);
e3ffab
+            if (ret != 0)
e3ffab
+                return NULL;
e3ffab
+        }
e3ffab
+        ret = ipadb_load_global_config(ipactx);
e3ffab
+        if (ret != 0)
e3ffab
+            return NULL;
e3ffab
+    }
e3ffab
 
e3ffab
     return &ipactx->config;
e3ffab
 }
e3ffab
-- 
e3ffab
2.1.0
e3ffab