From 237cd892d9e9625b135f8c9d078d50dfa44bba91 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sat, 22 Jul 2017 10:39:41 -0400 Subject: [PATCH] kdc: unused pid element is (pid_t)-1 not zero When the termination of a child process is observed by reap_kid() it clears the pids[] element by assigning it the invalid pid value (pid_t)-1. However, start_kdc() assumes that the unused pid[[] element value is 0. As a result, each pid[] element's associated child process can only be restarted once since start_kdc() will not be able to locate an unused element. This change alters start_kdc() to initialize all elements of pids[] to (pid_t)-1 and use that as the marker for unused elements. By doing so start_kdc() can properly record child process pids and indefinitely restart child processes as necessary. Change-Id: Ia93c9284ab21289994eca7fc9cf1278be7c00683 --- kdc/connect.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/kdc/connect.c b/kdc/connect.c index bc63f58a4..f98e6c749 100644 --- a/kdc/connect.c +++ b/kdc/connect.c @@ -1122,9 +1122,11 @@ start_kdc(krb5_context context, if (max_kdcs < 1) max_kdcs = 1; - pids = calloc(max_kdcs, sizeof(*pids)); + pids = malloc(max_kdcs * sizeof(*pids)); if (!pids) krb5_err(context, 1, errno, "malloc"); + for (i = 0; i < max_kdcs; i++) + pids[i] = (pid_t)-1; /* * We open a socketpair of which we hand one end to each of our kids. @@ -1196,12 +1198,12 @@ start_kdc(krb5_context context, sleep(10); break; default: - for (i=0; i < max_kdcs; i++) { - if (pids[i] == 0) { - pids[i] = pid; - break; - } - } + for (i = 0; i < max_kdcs; i++) { + if (pids[i] == (pid_t)-1) { + pids[i] = pid; + break; + } + } kdc_log(context, config, 0, "KDC worker process started: %d", pid); num_kdcs++;