Author: hrs
Date: Sat Dec 31 03:07:48 2016
New Revision: 310888
URL: https://svnweb.freebsd.org/changeset/base/310888

Log:
  Retry to open an F_PIPE process when it dies unexpectedly.
  
  Reported by:  Eugene Grosbein
  PR:           215335

Modified:
  head/usr.sbin/syslogd/syslogd.c

Modified: head/usr.sbin/syslogd/syslogd.c
==============================================================================
--- head/usr.sbin/syslogd/syslogd.c     Sat Dec 31 02:23:15 2016        
(r310887)
+++ head/usr.sbin/syslogd/syslogd.c     Sat Dec 31 03:07:48 2016        
(r310888)
@@ -368,9 +368,19 @@ close_filed(struct filed *f)
        if (f == NULL || f->f_file == -1)
                return;
 
+       switch (f->f_type) {
+       case F_FILE:
+       case F_TTY:
+       case F_CONSOLE:
+       case F_FORW:
+               f->f_type = F_UNUSED;
+               break;
+       case F_PIPE:
+               f->fu_pipe_pid = 0;
+               break;
+       }
        (void)close(f->f_file);
        f->f_file = -1;
-       f->f_type = F_UNUSED;
 }
 
 static int
@@ -1378,18 +1388,15 @@ fprintlog(struct filed *f, int flags, co
                if (f->fu_pipe_pid == 0) {
                        if ((f->f_file = p_open(f->fu_pipe_pname,
                                                &f->fu_pipe_pid)) < 0) {
-                               f->f_type = F_UNUSED;
                                logerror(f->fu_pipe_pname);
                                break;
                        }
                }
                if (writev(f->f_file, iov, nitems(iov)) < 0) {
                        int e = errno;
+
+                       deadq_enter(f->fu_pipe_pid, f->fu_pipe_pname);
                        close_filed(f);
-                       if (f->fu_pipe_pid > 0)
-                               deadq_enter(f->fu_pipe_pid,
-                                           f->fu_pipe_pname);
-                       f->fu_pipe_pid = 0;
                        errno = e;
                        logerror(f->fu_pipe_pname);
                }
@@ -1520,7 +1527,6 @@ reapchild(int signo __unused)
                        if (f->f_type == F_PIPE &&
                            f->fu_pipe_pid == pid) {
                                close_filed(f);
-                               f->fu_pipe_pid = 0;
                                log_deadchild(pid, status, f->fu_pipe_pname);
                                break;
                        }
@@ -1619,10 +1625,8 @@ die(int signo)
                /* flush any pending output */
                if (f->f_prevcount)
                        fprintlog(f, 0, (char *)NULL);
-               if (f->f_type == F_PIPE && f->fu_pipe_pid > 0) {
+               if (f->f_type == F_PIPE && f->fu_pipe_pid > 0)
                        close_filed(f);
-                       f->fu_pipe_pid = 0;
-               }
        }
        Initialized = was_initialized;
        if (signo) {
@@ -1851,12 +1855,8 @@ init(int signo)
                        close_filed(f);
                        break;
                case F_PIPE:
-                       if (f->fu_pipe_pid > 0) {
-                               close_filed(f);
-                               deadq_enter(f->fu_pipe_pid,
-                                           f->fu_pipe_pname);
-                       }
-                       f->fu_pipe_pid = 0;
+                       deadq_enter(f->fu_pipe_pid, f->fu_pipe_pname);
+                       close_filed(f);
                        break;
                }
        }
@@ -2753,6 +2753,8 @@ deadq_enter(pid_t pid, const char *name)
        struct deadq_entry *dq;
        int status;
 
+       if (pid == 0)
+               return;
        /*
         * Be paranoid, if we can't signal the process, don't enter it
         * into the dead queue (perhaps it's already dead).  If possible,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to