From c6aa18e509c45f2e4bd2a630d136638e82489bb0 Mon Sep 17 00:00:00 2001 From: Steve Dickson Date: Dec 17 2008 21:58:58 +0000 Subject: - statd: not unlinking host files --- diff --git a/nfs-utils-1.1.4-statd-xunlink.patch b/nfs-utils-1.1.4-statd-xunlink.patch new file mode 100644 index 0000000..26d19c2 --- /dev/null +++ b/nfs-utils-1.1.4-statd-xunlink.patch @@ -0,0 +1,98 @@ +commit bc870150cc2116584aee288d15ac2b9a2f825ff5 +Author: Steve Dickson +Date: Wed Dec 17 16:41:35 2008 -0500 + + statd: not unlinking host files + + Statd is not unlinking host files during SM_UNMON and + SM_UNMON_ALL calls because the given host is still on the run-time + notify list (rtnl) and the check flag is set when xunlink() is + called. But the next thing the caller of xunlink() does is + remove the host from the rtnl list which means the + unlink will never happen. + + So this patch removes the check flag from xunlink() since + its not needed and correctly allocates and frees memory + used by xunlink(). + + Signed-off-by: Steve Dickson + +diff --git a/utils/statd/misc.c b/utils/statd/misc.c +index fd201b4..7256291 100644 +--- a/utils/statd/misc.c ++++ b/utils/statd/misc.c +@@ -53,23 +53,25 @@ xstrdup (const char *string) + + + /* +- * Call with check=1 to verify that this host is not still on the rtnl +- * before unlinking file. ++ * Unlinking a file. + */ + void +-xunlink (char *path, char *host, short int check) ++xunlink (char *path, char *host) + { +- char *tozap; ++ char *tozap; + +- tozap=alloca (strlen(path)+strlen(host)+2); +- sprintf (tozap, "%s/%s", path, host); ++ tozap = malloc(strlen(path)+strlen(host)+2); ++ if (tozap == NULL) { ++ note(N_ERROR, "xunlink: malloc failed: errno %d (%s)", ++ errno, strerror(errno)); ++ return; ++ } ++ sprintf (tozap, "%s/%s", path, host); + +- if (!check || !nlist_gethost(rtnl, host, 0)) { +- if (unlink (tozap) == -1) +- note (N_ERROR, "unlink (%s): %s", tozap, strerror (errno)); +- else +- dprintf (N_DEBUG, "Unlinked %s", tozap); +- } +- else +- dprintf (N_DEBUG, "Not unlinking %s--host still monitored.", tozap); ++ if (unlink (tozap) == -1) ++ note(N_ERROR, "unlink (%s): %s", tozap, strerror (errno)); ++ else ++ dprintf (N_DEBUG, "Unlinked %s", tozap); ++ ++ free(tozap); + } +diff --git a/utils/statd/monitor.c b/utils/statd/monitor.c +index a6a1d9c..24c2531 100644 +--- a/utils/statd/monitor.c ++++ b/utils/statd/monitor.c +@@ -352,7 +352,7 @@ sm_unmon_1_svc(struct mon_id *argp, struct svc_req *rqstp) + /* PRC: do the HA callout: */ + ha_callout("del-client", mon_name, my_name, -1); + +- xunlink(SM_DIR, clnt->dns_name, 1); ++ xunlink(SM_DIR, clnt->dns_name); + nlist_free(&rtnl, clnt); + + return (&result); +@@ -404,7 +404,7 @@ sm_unmon_all_1_svc(struct my_id *argp, struct svc_req *rqstp) + temp = NL_NEXT(clnt); + /* PRC: do the HA callout: */ + ha_callout("del-client", mon_name, my_name, -1); +- xunlink(SM_DIR, clnt->dns_name, 1); ++ xunlink(SM_DIR, clnt->dns_name); + nlist_free(&rtnl, clnt); + ++count; + clnt = temp; +diff --git a/utils/statd/statd.h b/utils/statd/statd.h +index 5a6e289..88ba208 100644 +--- a/utils/statd/statd.h ++++ b/utils/statd/statd.h +@@ -53,7 +53,7 @@ extern int process_notify_list(void); + extern int process_reply(FD_SET_TYPE *); + extern char * xstrdup(const char *); + extern void * xmalloc(size_t); +-extern void xunlink (char *, char *, short int); ++extern void xunlink (char *, char *); + extern void load_state(void); + + /* diff --git a/nfs-utils.spec b/nfs-utils.spec index 3f6dd33..184e385 100644 --- a/nfs-utils.spec +++ b/nfs-utils.spec @@ -37,6 +37,7 @@ Patch107: nfs-utils-1.1.4-mount-inet6-support.patch Patch108: nfs-utils-1.1.4-svcgssd-expiration.patch Patch109: nfs-utils-1.1.4-mount-po_get_numeric.patch Patch110: nfs-utils-1.1.4-sm-notify-freeaddrinfo.patch +Patch111: nfs-utils-1.1.4-statd-xunlink.patch %if %{enablefscache} Patch90: nfs-utils-1.1.0-mount-fsc.patch @@ -102,6 +103,7 @@ This package also contains the mount.nfs and umount.nfs program. %patch108 -p1 %patch109 -p1 %patch110 -p1 +%patch111 -p1 %if %{enablefscache} %patch90 -p1 @@ -269,6 +271,7 @@ fi - text-based mount command: add function to parse numeric mount options - text-based mount command: use po_get_numeric() for handling retry - sm-notify command: fix a use-after-free bug +- statd: not unlinking host files * Thu Dec 11 2008 Steve Dickson 1.1.4-8 - mount command: AF_INET6 support for probe_bothports()