FreeBSD Bugzilla – Attachment 215283 Details for
Bug 246597
Race condition in mountd
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
fix the race between SIGHUP and exports reload
mountd-reload.patch (text/plain), 2.42 KB, created by
Rick Macklem
on 2020-06-06 00:46:12 UTC
(
hide
)
Description:
fix the race between SIGHUP and exports reload
Filename:
MIME Type:
Creator:
Rick Macklem
Created:
2020-06-06 00:46:12 UTC
Size:
2.42 KB
patch
obsolete
>--- usr.sbin/mountd/mountd.c.reload 2020-06-03 18:30:40.157353000 -0700 >+++ usr.sbin/mountd/mountd.c 2020-06-04 15:34:57.131468000 -0700 >@@ -193,6 +193,12 @@ struct fhreturn { > > #define GETPORT_MAXTRY 20 /* Max tries to get a port # */ > >+/* >+ * How long to delay a reload of exports when there are RPC request(s) >+ * to process, in usec. Must be less than 1second. >+ */ >+#define RELOADDELAY 250000 >+ > /* Global defs */ > static char *add_expdir(struct dirlist **, char *, int); > static void add_dlist(struct dirlist **, struct dirlist *, >@@ -413,6 +419,10 @@ main(int argc, char **argv) > int maxrec = RPC_MAXDATASIZE; > int attempt_cnt, port_len, port_pos, ret; > char **port_list; >+ uint64_t curtime, nexttime; >+ struct timeval tv; >+ struct timespec tp; >+ sigset_t sighup_mask; > > /* Check that another mountd isn't already running. */ > pfh = pidfile_open(_PATH_MOUNTDPID, 0600, &otherpid); >@@ -668,19 +678,49 @@ main(int argc, char **argv) > } > > /* Expand svc_run() here so that we can call get_exportlist(). */ >+ curtime = nexttime = 0; >+ sigemptyset(&sighup_mask); >+ sigaddset(&sighup_mask, SIGHUP); > for (;;) { >- if (got_sighup) { >- get_exportlist(1); >+ clock_gettime(CLOCK_MONOTONIC, &tp); >+ curtime = tp.tv_sec; >+ curtime = curtime * 1000000 + tp.tv_nsec / 1000; >+ sigprocmask(SIG_BLOCK, &sighup_mask, NULL); >+ if (got_sighup && curtime >= nexttime) { > got_sighup = 0; >- } >+ sigprocmask(SIG_UNBLOCK, &sighup_mask, NULL); >+ get_exportlist(1); >+ clock_gettime(CLOCK_MONOTONIC, &tp); >+ nexttime = tp.tv_sec; >+ nexttime = nexttime * 1000000 + tp.tv_nsec / 1000 + >+ RELOADDELAY; >+ } else >+ sigprocmask(SIG_UNBLOCK, &sighup_mask, NULL); >+ >+ /* >+ * If a reload is pending, poll for received request(s), >+ * otherwise set a RELOADDELAY timeout, since a SIGHUP >+ * could be processed between the got_sighup test and >+ * the select() system call. >+ */ >+ tv.tv_sec = 0; >+ if (got_sighup) >+ tv.tv_usec = 0; >+ else >+ tv.tv_usec = RELOADDELAY; > readfds = svc_fdset; >- switch (select(svc_maxfd + 1, &readfds, NULL, NULL, NULL)) { >+ switch (select(svc_maxfd + 1, &readfds, NULL, NULL, &tv)) { > case -1: >- if (errno == EINTR) >+ if (errno == EINTR) { >+ /* Allow a reload now. */ >+ nexttime = 0; > continue; >+ } > syslog(LOG_ERR, "mountd died: select: %m"); > exit(1); > case 0: >+ /* Allow a reload now. */ >+ nexttime = 0; > continue; > default: > svc_getreqset(&readfds);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 246597
:
215182
| 215283