Blob Blame History Raw
diff -up nfs-utils-2.3.3/configure.ac.orig nfs-utils-2.3.3/configure.ac
--- nfs-utils-2.3.3/configure.ac.orig	2019-09-18 10:57:14.190810677 -0400
+++ nfs-utils-2.3.3/configure.ac	2019-09-18 10:57:56.715567641 -0400
@@ -561,6 +561,7 @@ my_am_cflags="\
  -Werror=parentheses \
  -Werror=aggregate-return \
  -Werror=unused-result \
+ -Wno-cast-function-type \
  -fno-strict-aliasing \
 "
 
diff -up nfs-utils-2.3.3/support/junction/path.c.orig nfs-utils-2.3.3/support/junction/path.c
--- nfs-utils-2.3.3/support/junction/path.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/support/junction/path.c	2019-09-18 10:57:56.715567641 -0400
@@ -163,8 +163,10 @@ nsdb_count_components(const char *pathna
 			break;
 		next = strchrnul(component, '/');
 		tmp = (size_t)(next - component);
-		if (tmp > 255)
+		if (tmp > 255) {
+			free(start);
 			return false;
+		}
 		length += XDR_UINT_BYTES + (nsdb_quadlen(tmp) << 2);
 		count++;
 
@@ -328,11 +330,13 @@ nsdb_posix_to_path_array(const char *pat
 		length = (size_t)(next - component);
 		if (length > 255) {
 			nsdb_free_string_array(result);
+			free(normalized);
 			return FEDFS_ERR_SVRFAULT;
 		}
 
 		result[i] = strndup(component, length);
 		if (result[i] == NULL) {
+			free(normalized);
 			nsdb_free_string_array(result);
 			return FEDFS_ERR_SVRFAULT;
 		}
diff -up nfs-utils-2.3.3/support/nfs/exports.c.orig nfs-utils-2.3.3/support/nfs/exports.c
--- nfs-utils-2.3.3/support/nfs/exports.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/support/nfs/exports.c	2019-09-18 10:57:56.715567641 -0400
@@ -714,6 +714,7 @@ parsesquash(char *list, int **idp, int *
 		}
 		if (id0 == -1 || id1 == -1) {
 			syntaxerr("uid/gid -1 not permitted");
+			xfree(id);
 			return -1;
 		}
 		if ((len % 8) == 0)
@@ -724,6 +725,7 @@ parsesquash(char *list, int **idp, int *
 			break;
 		if (*cp != ',') {
 			syntaxerr("bad uid/gid list");
+			xfree(id);
 			return -1;
 		}
 		cp++;
diff -up nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c.orig nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c
--- nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c	2019-09-18 10:57:56.716567635 -0400
@@ -406,8 +406,10 @@ int nfs4_init_name_mapping(char *conffil
 	nfs4_methods = conf_get_list("Translation", "Method");
 	if (nfs4_methods) {
 		IDMAP_LOG(1, ("libnfsidmap: processing 'Method' list"));
-		if (load_plugins(nfs4_methods, &nfs4_plugins) == -1)
+		if (load_plugins(nfs4_methods, &nfs4_plugins) == -1) {
+			conf_free_list(nfs4_methods);
 			return -ENOENT;
+		}
 	} else {
 		struct conf_list list;
 		struct conf_list_node node;
@@ -475,11 +477,15 @@ out:
 	if (ret) {
 		if (nfs4_plugins)
 			unload_plugins(nfs4_plugins);
-		if (gss_plugins)
+		if (gss_plugins) {
 			unload_plugins(gss_plugins);
+		}
 		nfs4_plugins = gss_plugins = NULL;
 	}
 
+	if (gss_methods)
+		conf_free_list(gss_methods);
+
 	return ret ? -ENOENT: 0;
 }
 
diff -up nfs-utils-2.3.3/support/nfsidmap/static.c.orig nfs-utils-2.3.3/support/nfsidmap/static.c
--- nfs-utils-2.3.3/support/nfsidmap/static.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/support/nfsidmap/static.c	2019-09-18 10:57:56.716567635 -0400
@@ -347,6 +347,7 @@ static int static_init(void) {
 			warnx("static_init: calloc (1, %lu) failed",
 				(unsigned long)sizeof *unode);
 			free(pw);
+			conf_free_list(princ_list);
 			return -ENOMEM;
 		}
 		unode->uid = pw->pw_uid;
@@ -355,6 +356,9 @@ static int static_init(void) {
 		unode->localname = conf_get_str("Static", cln->field);
 		if (!unode->localname) {
 			free(pw);
+			free(unode->principal);
+			free(unode);
+			conf_free_list(princ_list);
 			return -ENOENT;
 		}
 
@@ -379,6 +383,7 @@ static int static_init(void) {
 			warnx("static_init: calloc (1, %lu) failed",
 				(unsigned long)sizeof *gnode);
 			free(gr);
+			conf_free_list(princ_list);
 			return -ENOMEM;
 		}
 		gnode->gid = gr->gr_gid;
@@ -387,6 +392,9 @@ static int static_init(void) {
 		gnode->localgroup = conf_get_str("Static", cln->field);
 		if (!gnode->localgroup) {
 			free(gr);
+			free(gnode->principal);
+			free(gnode);
+			conf_free_list(princ_list);
 			return -ENOENT;
 		}
 
@@ -394,6 +402,8 @@ static int static_init(void) {
 
 		LIST_INSERT_HEAD (&gid_mappings[gid_hash(gnode->gid)], gnode, link);
 	}
+	
+	conf_free_list(princ_list);
 	return 0;
 }
 
diff -up nfs-utils-2.3.3/support/nfs/mydaemon.c.orig nfs-utils-2.3.3/support/nfs/mydaemon.c
--- nfs-utils-2.3.3/support/nfs/mydaemon.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/support/nfs/mydaemon.c	2019-09-18 10:57:56.716567635 -0400
@@ -123,6 +123,7 @@ daemon_init(bool fg)
 	dup2(tempfd, 0);
 	dup2(tempfd, 1);
 	dup2(tempfd, 2);
+	close(tempfd);
 	closelog();
 	dup2(pipefds[1], 3);
 	pipefds[1] = 3;
diff -up nfs-utils-2.3.3/support/nfs/rpcmisc.c.orig nfs-utils-2.3.3/support/nfs/rpcmisc.c
--- nfs-utils-2.3.3/support/nfs/rpcmisc.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/support/nfs/rpcmisc.c	2019-09-18 10:57:56.716567635 -0400
@@ -102,6 +102,7 @@ makesock(int port, int proto)
 	if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) == -1) {
 		xlog(L_FATAL, "Could not bind name to socket: %s",
 					strerror(errno));
+		close(sock);
 		return -1;
 	}
 
diff -up nfs-utils-2.3.3/support/nfs/svc_socket.c.orig nfs-utils-2.3.3/support/nfs/svc_socket.c
--- nfs-utils-2.3.3/support/nfs/svc_socket.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/support/nfs/svc_socket.c	2019-09-18 10:57:56.717567629 -0400
@@ -134,6 +134,7 @@ svc_socket (u_long number, int type, int
       if (ret < 0)
 	{
 	  xlog(L_ERROR, "svc_socket: socket reuse problem: %m");
+      (void) __close(sock);
 	  return ret;
 	}
     }
diff -up nfs-utils-2.3.3/support/nfs/xcommon.c.orig nfs-utils-2.3.3/support/nfs/xcommon.c
--- nfs-utils-2.3.3/support/nfs/xcommon.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/support/nfs/xcommon.c	2019-09-18 10:57:56.717567629 -0400
@@ -53,14 +53,17 @@ char *
 xstrconcat3 (const char *s, const char *t, const char *u) {
      char *res;
 
-     if (!s) s = "";
+     int dofree = 1;
+
+     if (!s) s = "", dofree=0;
      if (!t) t = "";
      if (!u) u = "";
      res = xmalloc(strlen(s) + strlen(t) + strlen(u) + 1);
      strcpy(res, s);
      strcat(res, t);
      strcat(res, u);
-     free((void *) s);
+     if (dofree)
+         free((void *) s);
      return res;
 }
 
@@ -69,7 +72,9 @@ char *
 xstrconcat4 (const char *s, const char *t, const char *u, const char *v) {
      char *res;
 
-     if (!s) s = "";
+     int dofree = 1;
+
+     if (!s) s = "", dofree=0;
      if (!t) t = "";
      if (!u) u = "";
      if (!v) v = "";
@@ -78,7 +83,8 @@ xstrconcat4 (const char *s, const char *
      strcat(res, t);
      strcat(res, u);
      strcat(res, v);
-     free((void *) s);
+     if (dofree)
+         free((void *) s);
      return res;
 }
 
diff -up nfs-utils-2.3.3/support/nfs/xlog.c.orig nfs-utils-2.3.3/support/nfs/xlog.c
--- nfs-utils-2.3.3/support/nfs/xlog.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/support/nfs/xlog.c	2019-09-18 10:57:56.717567629 -0400
@@ -135,10 +135,14 @@ xlog_from_conffile(char *service)
 	struct conf_list_node *n;
 
 	kinds = conf_get_list(service, "debug");
-	if (!kinds || !kinds->cnt)
+	if (!kinds || !kinds->cnt) {
+		free(kinds);
 		return;
+	}
 	TAILQ_FOREACH(n, &(kinds->fields), link)
 		xlog_sconfig(n->field, 1);
+
+	conf_free_list(kinds);
 }
 
 int
diff -up nfs-utils-2.3.3/support/nsm/file.c.orig nfs-utils-2.3.3/support/nsm/file.c
--- nfs-utils-2.3.3/support/nsm/file.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/support/nsm/file.c	2019-09-18 10:57:56.717567629 -0400
@@ -533,6 +533,7 @@ nsm_update_kernel_state(const int state)
 	len = snprintf(buf, sizeof(buf), "%d", state);
 	if (error_check(len, sizeof(buf))) {
 		xlog_warn("Failed to form NSM state number string");
+		close(fd);
 		return;
 	}
 
diff -up nfs-utils-2.3.3/systemd/rpc-pipefs-generator.c.orig nfs-utils-2.3.3/systemd/rpc-pipefs-generator.c
--- nfs-utils-2.3.3/systemd/rpc-pipefs-generator.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/systemd/rpc-pipefs-generator.c	2019-09-18 10:57:56.717567629 -0400
@@ -69,12 +69,16 @@ int generate_target(char *pipefs_path, c
 		return 1;
 
 	ret = generate_mount_unit(pipefs_path, pipefs_unit, dirname);
-	if (ret)
+	if (ret) {
+		free(pipefs_unit);
 		return ret;
+	}
 
 	path = malloc(strlen(dirname) + 1 + sizeof(filebase));
-	if (!path)
+	if (!path) {
+		free(pipefs_unit);
 		return 2;
+	}
 	sprintf(path, "%s", dirname);
 	mkdir(path, 0755);
 	strcat(path, filebase);
@@ -82,6 +86,7 @@ int generate_target(char *pipefs_path, c
 	if (!f)
 	{
 		free(path);
+		free(pipefs_unit);
 		return 1;
 	}
 
@@ -90,6 +95,7 @@ int generate_target(char *pipefs_path, c
 	fprintf(f, "After=%s\n", pipefs_unit);
 	fclose(f);
 	free(path);
+	free(pipefs_unit);
 
 	return 0;
 }
diff -up nfs-utils-2.3.3/utils/blkmapd/device-discovery.c.orig nfs-utils-2.3.3/utils/blkmapd/device-discovery.c
--- nfs-utils-2.3.3/utils/blkmapd/device-discovery.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/utils/blkmapd/device-discovery.c	2019-09-18 10:58:54.444237714 -0400
@@ -186,8 +186,11 @@ static void bl_add_disk(char *filepath)
 		}
 	}
 
-	if (disk && diskpath)
+	if (disk && diskpath) {
+		if (serial)
+			free(serial);
 		return;
+	}
 
 	/* add path */
 	path = malloc(sizeof(struct bl_disk_path));
@@ -223,6 +226,8 @@ static void bl_add_disk(char *filepath)
 			disk->size = size;
 			disk->valid_path = path;
 		}
+		if (serial)
+			free(serial);
 	}
 	return;
 
@@ -232,6 +237,9 @@ static void bl_add_disk(char *filepath)
 			free(path->full_path);
 		free(path);
 	}
+	if (serial)
+		free(serial);
+
 	return;
 }
 
@@ -375,7 +383,12 @@ static void bl_rpcpipe_cb(void)
 			if (event->mask & IN_CREATE) {
 				BL_LOG_WARNING("nfs pipe dir created\n");
 				bl_watch_dir(nfspipe_dir, &nfs_pipedir_wfd);
+				if (bl_pipe_fd >= 0)
+					close(bl_pipe_fd);
 				bl_pipe_fd = open(bl_pipe_file, O_RDWR);
+				if (bl_pipe_fd < 0)
+					BL_LOG_ERR("open %s failed: %s\n",
+						event->name, strerror(errno));
 			} else if (event->mask & IN_DELETE) {
 				BL_LOG_WARNING("nfs pipe dir deleted\n");
 				inotify_rm_watch(bl_watch_fd, nfs_pipedir_wfd);
@@ -388,6 +401,8 @@ static void bl_rpcpipe_cb(void)
 				continue;
 			if (event->mask & IN_CREATE) {
 				BL_LOG_WARNING("blocklayout pipe file created\n");
+				if (bl_pipe_fd >= 0)
+					close(bl_pipe_fd);
 				bl_pipe_fd = open(bl_pipe_file, O_RDWR);
 				if (bl_pipe_fd < 0)
 					BL_LOG_ERR("open %s failed: %s\n",
diff -up nfs-utils-2.3.3/utils/gssd/krb5_util.c.orig nfs-utils-2.3.3/utils/gssd/krb5_util.c
--- nfs-utils-2.3.3/utils/gssd/krb5_util.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/utils/gssd/krb5_util.c	2019-09-18 10:57:56.718567624 -0400
@@ -698,6 +698,8 @@ gssd_search_krb5_keytab(krb5_context con
 				 "we failed to unparse principal name: %s\n",
 				 k5err);
 			k5_free_kt_entry(context, kte);
+			free(k5err);
+			k5err = NULL;
 			continue;
 		}
 		printerr(4, "Processing keytab entry for principal '%s'\n",
@@ -899,6 +901,8 @@ find_keytab_entry(krb5_context context,
 				k5err = gssd_k5_err_msg(context, code);
 				printerr(1, "%s while building principal for '%s'\n",
 					 k5err, spn);
+				free(k5err);
+				k5err = NULL;
 				continue;
 			}
 			code = krb5_kt_get_entry(context, kt, princ, 0, 0, kte);
@@ -1168,7 +1172,8 @@ gssd_get_krb5_machine_cred_list(char ***
 		*list = l;
 		retval = 0;
 		goto out;
-	}
+	} else
+		free((void *)l);
   out:
 	return retval;
 }
@@ -1216,6 +1221,8 @@ gssd_destroy_krb5_machine_creds(void)
 			printerr(0, "WARNING: %s while resolving credential "
 				    "cache '%s' for destruction\n", k5err,
 				    ple->ccname);
+			free(k5err);
+			k5err = NULL;
 			continue;
 		}
 
diff -up nfs-utils-2.3.3/utils/mount/configfile.c.orig nfs-utils-2.3.3/utils/mount/configfile.c
--- nfs-utils-2.3.3/utils/mount/configfile.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/utils/mount/configfile.c	2019-09-18 10:57:56.718567624 -0400
@@ -404,7 +404,7 @@ char *conf_get_mntopts(char *spec, char
 
 	/* list_size + optlen + ',' + '\0' */
 	config_opts = calloc(1, (list_size+optlen+2));
-	if (server == NULL) {
+	if (config_opts == NULL) {
 		xlog_warn("conf_get_mountops: Unable calloc memory for config_opts"); 
 		free_all();
 		return mount_opts;
diff -up nfs-utils-2.3.3/utils/mountd/cache.c.orig nfs-utils-2.3.3/utils/mountd/cache.c
--- nfs-utils-2.3.3/utils/mountd/cache.c.orig	2019-09-18 10:57:14.190810677 -0400
+++ nfs-utils-2.3.3/utils/mountd/cache.c	2019-09-18 10:57:56.718567624 -0400
@@ -1240,7 +1240,7 @@ static struct exportent *lookup_junction
 		goto out;
 	}
 	status = nfs_get_basic_junction(pathname, &locations);
-	switch (status) {
+	if (status) {
 		xlog(L_WARNING, "Dangling junction %s: %s",
 			pathname, strerror(status));
 		goto out;
@@ -1248,10 +1248,11 @@ static struct exportent *lookup_junction
 
 	parent = lookup_parent_export(dom, pathname, ai);
 	if (parent == NULL)
-		goto out;
+		goto free_locations;
 
 	exp = locations_to_export(locations, pathname, parent);
 
+free_locations:
 	nfs_free_locations(locations->ns_list);
 	free(locations);
 
diff -up nfs-utils-2.3.3/utils/mountd/fsloc.c.orig nfs-utils-2.3.3/utils/mountd/fsloc.c
--- nfs-utils-2.3.3/utils/mountd/fsloc.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/utils/mountd/fsloc.c	2019-09-18 10:57:56.719567618 -0400
@@ -102,6 +102,7 @@ static struct servers *parse_list(char *
 		cp = strchr(list[i], '@');
 		if ((!cp) || list[i][0] != '/') {
 			xlog(L_WARNING, "invalid entry '%s'", list[i]);
+			free(mp);
 			continue; /* XXX Need better error handling */
 		}
 		res->h_mp[i] = mp;
diff -up nfs-utils-2.3.3/utils/mount/nfsmount.c.orig nfs-utils-2.3.3/utils/mount/nfsmount.c
--- nfs-utils-2.3.3/utils/mount/nfsmount.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/utils/mount/nfsmount.c	2019-09-18 10:57:56.730567555 -0400
@@ -452,6 +452,7 @@ parse_options(char *old_opts, struct nfs
 	nfs_error(_("%s: Bad nfs mount parameter: %s\n"), progname, opt);
  out_bad:
 	free(tmp_opts);
+	free(mounthost);
 	return 0;
 }
 
diff -up nfs-utils-2.3.3/utils/mount/stropts.c.orig nfs-utils-2.3.3/utils/mount/stropts.c
--- nfs-utils-2.3.3/utils/mount/stropts.c.orig	2019-09-18 10:57:14.183810717 -0400
+++ nfs-utils-2.3.3/utils/mount/stropts.c	2019-09-18 10:57:56.730567555 -0400
@@ -982,8 +982,11 @@ static int nfs_try_mount(struct nfsmount
 		}
 
 		if (!nfs_append_addr_option(address->ai_addr,
-					    address->ai_addrlen, mi->options))
+					    address->ai_addrlen, mi->options)) {
+			freeaddrinfo(address);
+			errno = ENOMEM;
 			return 0;
+		}
 		mi->address = address;
 	}
 
diff -up nfs-utils-2.3.3/utils/nfsdcltrack/sqlite.c.orig nfs-utils-2.3.3/utils/nfsdcltrack/sqlite.c
--- nfs-utils-2.3.3/utils/nfsdcltrack/sqlite.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/utils/nfsdcltrack/sqlite.c	2019-09-18 10:57:56.731567549 -0400
@@ -215,6 +215,8 @@ sqlite_maindb_init_v2(void)
 				&err);
 	if (ret != SQLITE_OK) {
 		xlog(L_ERROR, "Unable to begin transaction: %s", err);
+		if (err)
+			sqlite3_free(err);
 		return ret;
 	}
 
diff -up nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c.orig nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c
--- nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c.orig	2019-11-11 08:49:06.044870974 -0500
+++ nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c	2019-11-11 09:19:10.391896845 -0500
@@ -486,6 +486,9 @@ out:
 	if (gss_methods)
 		conf_free_list(gss_methods);
 
+	if (nfs4_methods)
+		conf_free_list(nfs4_methods);
+
 	return ret ? -ENOENT: 0;
 }
 
diff -up nfs-utils-2.3.3/utils/gssd/krb5_util.c.orig nfs-utils-2.3.3/utils/gssd/krb5_util.c
--- nfs-utils-2.3.3/utils/gssd/krb5_util.c.orig	2019-11-11 08:49:06.045870979 -0500
+++ nfs-utils-2.3.3/utils/gssd/krb5_util.c	2019-11-11 09:19:10.393896856 -0500
@@ -911,6 +911,8 @@ find_keytab_entry(krb5_context context,
 				k5err = gssd_k5_err_msg(context, code);
 				printerr(3, "%s while getting keytab entry for '%s'\n",
 					 k5err, spn);
+				free(k5err);
+				k5err = NULL;
 				/*
 				 * We tried the active directory machine account
 				 * with the hostname part as-is and failed...
@@ -1013,6 +1015,8 @@ query_krb5_ccache(const char* cred_cache
 	char *str = NULL;
 	char *princstring;
 
+	*ret_princname = *ret_realm = NULL;
+
 	ret = krb5_init_context(&context);
 	if (ret) 
 		return 0;
@@ -1047,7 +1051,7 @@ err_princ:
 	krb5_cc_close(context, ccache);
 err_cache:
 	krb5_free_context(context);
-	return found;
+	return (*ret_princname && *ret_realm);
 }
 
 /*==========================*/
@@ -1230,6 +1234,8 @@ gssd_destroy_krb5_machine_creds(void)
 			k5err = gssd_k5_err_msg(context, code);
 			printerr(0, "WARNING: %s while destroying credential "
 				    "cache '%s'\n", k5err, ple->ccname);
+			free(k5err);
+			k5err = NULL;
 		}
 	}
 	krb5_free_context(context);
diff -up nfs-utils-2.3.3/utils/idmapd/idmapd.c.orig nfs-utils-2.3.3/utils/idmapd/idmapd.c
--- nfs-utils-2.3.3/utils/idmapd/idmapd.c.orig	2019-11-11 08:49:06.029870889 -0500
+++ nfs-utils-2.3.3/utils/idmapd/idmapd.c	2019-11-11 09:19:10.393896856 -0500
@@ -517,14 +517,16 @@ static void
 clntscancb(int UNUSED(fd), short UNUSED(which), void *data)
 {
 	struct idmap_clientq *icq = data;
-	struct idmap_client *ic;
+	struct idmap_client *ic, *ic_next;
 
-	TAILQ_FOREACH(ic, icq, ic_next)
+	for (ic = TAILQ_FIRST(icq); ic != NULL; ic = ic_next) { 
+		ic_next = TAILQ_NEXT(ic, ic_next);
 		if (ic->ic_fd == -1 && nfsopen(ic) == -1) {
 			close(ic->ic_dirfd);
 			TAILQ_REMOVE(icq, ic, ic_next);
 			free(ic);
 		}
+	}
 }
 
 static void
diff -up nfs-utils-2.3.3/utils/statd/monitor.c.orig nfs-utils-2.3.3/utils/statd/monitor.c
--- nfs-utils-2.3.3/utils/statd/monitor.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/utils/statd/monitor.c	2019-11-11 09:19:10.393896856 -0500
@@ -66,7 +66,7 @@ sm_mon_1_svc(struct mon *argp, struct sv
 			*my_name  = argp->mon_id.my_id.my_name;
 	struct my_id	*id = &argp->mon_id.my_id;
 	char		*cp;
-	notify_list	*clnt;
+	notify_list	*clnt = NULL;
 	struct sockaddr_in my_addr = {
 		.sin_family		= AF_INET,
 		.sin_addr.s_addr	= htonl(INADDR_LOOPBACK),
@@ -223,6 +224,7 @@ sm_mon_1_svc(struct mon *argp, struct sv
 
 failure:
 	xlog_warn("STAT_FAIL to %s for SM_MON of %s", my_name, mon_name);
+	free(clnt);
 	return (&result);
 }
 
@@ -242,6 +244,7 @@ load_one_host(const char *hostname,
 	clnt->dns_name = strdup(hostname);
 	if (clnt->dns_name == NULL) {
 		nlist_free(NULL, clnt);
+		free(clnt);
 		return 0;
 	}
 
diff -up nfs-utils-2.3.3/utils/statd/notlist.c.orig nfs-utils-2.3.3/utils/statd/notlist.c
--- nfs-utils-2.3.3/utils/statd/notlist.c.orig	2018-09-06 14:09:08.000000000 -0400
+++ nfs-utils-2.3.3/utils/statd/notlist.c	2019-11-11 09:19:10.394896861 -0500
@@ -210,7 +210,6 @@ nlist_free(notify_list **head, notify_li
 	if (NL_MON_NAME(entry))
 		free(NL_MON_NAME(entry));
 	free(entry->dns_name);
-	free(entry);
 }
 
 /* 
@@ -219,8 +218,14 @@ nlist_free(notify_list **head, notify_li
 void 
 nlist_kill(notify_list **head)
 {
-	while (*head)
+	notify_list *next;
+
+	while (*head) {
+		next = (*head)->next;
 		nlist_free(head, *head);
+		free(*head);
+		*head = next;
+	}
 }
 
 /*