Blame 0001-ensure_keytab_principals-do-not-leak-memory-when-cal.patch

8fc58f6
From 3a84c2469c31967bc22c0490456f07723ef5fc86 Mon Sep 17 00:00:00 2001
8fc58f6
From: Sumit Bose <sbose@redhat.com>
8fc58f6
Date: Wed, 20 Mar 2019 11:01:50 +0100
8fc58f6
Subject: [PATCH 1/4] ensure_keytab_principals: do not leak memory when called
8fc58f6
 twice
8fc58f6
8fc58f6
Related to https://bugzilla.redhat.com/show_bug.cgi?id=1630187
8fc58f6
---
8fc58f6
 library/adenroll.c | 32 +++++++++++++++++++++-----------
8fc58f6
 1 file changed, 21 insertions(+), 11 deletions(-)
8fc58f6
8fc58f6
diff --git a/library/adenroll.c b/library/adenroll.c
8fc58f6
index d1f746c..48cb4cf 100644
8fc58f6
--- a/library/adenroll.c
8fc58f6
+++ b/library/adenroll.c
8fc58f6
@@ -413,6 +413,25 @@ ensure_service_principals (adcli_result res,
8fc58f6
 	return res;
8fc58f6
 }
8fc58f6
 
8fc58f6
+static void enroll_clear_keytab_principals (adcli_enroll *enroll)
8fc58f6
+{
8fc58f6
+	krb5_context k5;
8fc58f6
+	size_t c;
8fc58f6
+
8fc58f6
+	if (enroll->keytab_principals) {
8fc58f6
+		k5 = adcli_conn_get_krb5_context (enroll->conn);
8fc58f6
+		return_if_fail (k5 != NULL);
8fc58f6
+
8fc58f6
+		for (c = 0; enroll->keytab_principals[c] != NULL; c++)
8fc58f6
+			krb5_free_principal (k5, enroll->keytab_principals[c]);
8fc58f6
+
8fc58f6
+		free (enroll->keytab_principals);
8fc58f6
+		enroll->keytab_principals = NULL;
8fc58f6
+	}
8fc58f6
+
8fc58f6
+	return;
8fc58f6
+}
8fc58f6
+
8fc58f6
 static adcli_result
8fc58f6
 ensure_keytab_principals (adcli_result res,
8fc58f6
                           adcli_enroll *enroll)
8fc58f6
@@ -430,6 +449,7 @@ ensure_keytab_principals (adcli_result res,
8fc58f6
 	k5 = adcli_conn_get_krb5_context (enroll->conn);
8fc58f6
 	return_unexpected_if_fail (k5 != NULL);
8fc58f6
 
8fc58f6
+	enroll_clear_keytab_principals (enroll);
8fc58f6
 	enroll->keytab_principals = calloc (count + 3, sizeof (krb5_principal));
8fc58f6
 	return_unexpected_if_fail (enroll->keytab_principals != NULL);
8fc58f6
 	at = 0;
8fc58f6
@@ -1860,18 +1880,8 @@ static void
8fc58f6
 enroll_clear_state (adcli_enroll *enroll)
8fc58f6
 {
8fc58f6
 	krb5_context k5;
8fc58f6
-	int i;
8fc58f6
-
8fc58f6
-	if (enroll->keytab_principals) {
8fc58f6
-		k5 = adcli_conn_get_krb5_context (enroll->conn);
8fc58f6
-		return_if_fail (k5 != NULL);
8fc58f6
-
8fc58f6
-		for (i = 0; enroll->keytab_principals[i] != NULL; i++)
8fc58f6
-			krb5_free_principal (k5, enroll->keytab_principals[i]);
8fc58f6
 
8fc58f6
-		free (enroll->keytab_principals);
8fc58f6
-		enroll->keytab_principals = NULL;
8fc58f6
-	}
8fc58f6
+	enroll_clear_keytab_principals (enroll);
8fc58f6
 
8fc58f6
 	if (enroll->keytab) {
8fc58f6
 		k5 = adcli_conn_get_krb5_context (enroll->conn);
8fc58f6
-- 
8fc58f6
2.20.1
8fc58f6