Blame SOURCES/0006-Refactor-fail-earlier-on-invalid-servants.patch

04a57c
From 8301cbafed191f30656a22876941cc7c9189b623 Mon Sep 17 00:00:00 2001
04a57c
From: Klaus Wenninger <klaus.wenninger@aon.at>
04a57c
Date: Thu, 31 Jan 2019 14:42:01 +0100
04a57c
Subject: [PATCH] Refactor: fail earlier on invalid servants
04a57c
04a57c
---
04a57c
 src/sbd-inquisitor.c | 51 ++++++++++++++++++++++++++++++++-------------------
04a57c
 src/sbd-md.c         |  7 +------
04a57c
 src/sbd.h            |  2 +-
04a57c
 3 files changed, 34 insertions(+), 26 deletions(-)
04a57c
04a57c
diff --git a/src/sbd-inquisitor.c b/src/sbd-inquisitor.c
04a57c
index 8e0bc87..9be6c99 100644
04a57c
--- a/src/sbd-inquisitor.c
04a57c
+++ b/src/sbd-inquisitor.c
04a57c
@@ -42,19 +42,36 @@ void recruit_servant(const char *devname, pid_t pid)
04a57c
 	struct servants_list_item *newbie;
04a57c
 
04a57c
 	if (lookup_servant_by_dev(devname)) {
04a57c
-		cl_log(LOG_DEBUG, "Servant %s already exists", devname);
04a57c
-		return;
04a57c
+	    cl_log(LOG_DEBUG, "Servant %s already exists", devname);
04a57c
+	    return;
04a57c
 	}
04a57c
 
04a57c
 	newbie = malloc(sizeof(*newbie));
04a57c
-	if (!newbie) {
04a57c
-		fprintf(stderr, "malloc failed in recruit_servant.\n");
04a57c
-		exit(1);
04a57c
+	if (newbie) {
04a57c
+	    memset(newbie, 0, sizeof(*newbie));
04a57c
+	    newbie->devname = strdup(devname);
04a57c
+	    newbie->pid = pid;
04a57c
+	    newbie->first_start = 1;
04a57c
+	}
04a57c
+	if (!newbie || !newbie->devname) {
04a57c
+	    fprintf(stderr, "heap allocation failed in recruit_servant.\n");
04a57c
+	    exit(1);
04a57c
+	}
04a57c
+
04a57c
+	/* some sanity-check on our newbie */
04a57c
+	if (sbd_is_disk(newbie)) {
04a57c
+	    cl_log(LOG_INFO, "Monitoring %s", devname);
04a57c
+	    disk_count++;
04a57c
+	} else if (sbd_is_pcmk(newbie) || sbd_is_cluster(newbie)) {
04a57c
+	    /* alive just after pcmk and cluster servants have shown up */
04a57c
+	    newbie->outdated = 1;
04a57c
+	} else {
04a57c
+	    /* toss our newbie */
04a57c
+	    cl_log(LOG_ERR, "Refusing to recruit unrecognized servant %s", devname);
04a57c
+	    free((void *) newbie->devname);
04a57c
+	    free(newbie);
04a57c
+	    return;
04a57c
 	}
04a57c
-	memset(newbie, 0, sizeof(*newbie));
04a57c
-	newbie->devname = strdup(devname);
04a57c
-	newbie->pid = pid;
04a57c
-	newbie->first_start = 1;
04a57c
 
04a57c
 	if (!s) {
04a57c
 		servants_leader = newbie;
04a57c
@@ -65,12 +82,6 @@ void recruit_servant(const char *devname, pid_t pid)
04a57c
 	}
04a57c
 
04a57c
 	servant_count++;
04a57c
-        if(sbd_is_disk(newbie)) {
04a57c
-            cl_log(LOG_INFO, "Monitoring %s", devname);
04a57c
-            disk_count++;
04a57c
-        } else {
04a57c
-            newbie->outdated = 1;
04a57c
-        }
04a57c
 }
04a57c
 
04a57c
 int assign_servant(const char* devname, functionp_t functionp, int mode, const void* argp)
04a57c
@@ -148,7 +159,7 @@ void servant_start(struct servants_list_item *s)
04a57c
 	if (sbd_is_disk(s)) {
04a57c
 #if SUPPORT_SHARED_DISK
04a57c
 		DBGLOG(LOG_INFO, "Starting servant for device %s", s->devname);
04a57c
-		s->pid = assign_servant(s->devname, servant, start_mode, s);
04a57c
+		s->pid = assign_servant(s->devname, servant_md, start_mode, s);
04a57c
 #else
04a57c
                 cl_log(LOG_ERR, "Shared disk functionality not supported");
04a57c
                 return;
04a57c
@@ -785,12 +796,14 @@ parse_device_line(const char *line)
04a57c
 
04a57c
             if (lpc > last) {
04a57c
                 entry = calloc(1, 1 + lpc - last);
04a57c
+                if (!entry) {
04a57c
+                    fprintf(stderr, "heap allocation failed parsing device-line.\n");
04a57c
+                    exit(1);
04a57c
+                }
04a57c
                 rc = sscanf(line + last, "%[^;]", entry);
04a57c
             }
04a57c
 
04a57c
-            if (entry == NULL) {
04a57c
-                /* Skip */
04a57c
-            } else if (rc != 1) {
04a57c
+            if (rc != 1) {
04a57c
                 cl_log(LOG_WARNING, "Could not parse (%d %d): %s", last, lpc, line + last);
04a57c
             } else {
04a57c
                 cl_log(LOG_DEBUG, "Adding '%s'", entry);
04a57c
diff --git a/src/sbd-md.c b/src/sbd-md.c
04a57c
index 579d273..ba2c34d 100644
04a57c
--- a/src/sbd-md.c
04a57c
+++ b/src/sbd-md.c
04a57c
@@ -1031,7 +1031,7 @@ static int servant_check_timeout_inconsistent(struct sector_header_s *hdr)
04a57c
 	return 0;
04a57c
 }
04a57c
 
04a57c
-int servant(const char *diskname, int mode, const void* argp)
04a57c
+int servant_md(const char *diskname, int mode, const void* argp)
04a57c
 {
04a57c
 	struct sector_mbox_s *s_mbox = NULL;
04a57c
 	struct sector_node_s *s_node = NULL;
04a57c
@@ -1046,11 +1046,6 @@ int servant(const char *diskname, int mode, const void* argp)
04a57c
 	char uuid[37];
04a57c
 	const struct servants_list_item *s = argp;
04a57c
 
04a57c
-	if (!diskname) {
04a57c
-		cl_log(LOG_ERR, "Empty disk name %s.", diskname);
04a57c
-		return -1;
04a57c
-	}
04a57c
-
04a57c
 	cl_log(LOG_INFO, "Servant starting for device %s", diskname);
04a57c
 
04a57c
 	/* Block most of the signals */
04a57c
diff --git a/src/sbd.h b/src/sbd.h
04a57c
index 386c85c..6fe07f9 100644
04a57c
--- a/src/sbd.h
04a57c
+++ b/src/sbd.h
04a57c
@@ -175,7 +175,7 @@ int ping_via_slots(const char *name, struct servants_list_item *servants);
04a57c
 int dump_headers(struct servants_list_item *servants);
04a57c
 unsigned long get_first_msgwait(struct servants_list_item *servants);
04a57c
 int messenger(const char *name, const char *msg, struct servants_list_item *servants);
04a57c
-int servant(const char *diskname, int mode, const void* argp);
04a57c
+int servant_md(const char *diskname, int mode, const void* argp);
04a57c
 #endif
04a57c
 
04a57c
 int servant_pcmk(const char *diskname, int mode, const void* argp);
04a57c
-- 
04a57c
1.8.3.1
04a57c