Blame SOURCES/vsftpd-3.0.2-wnohang.patch

249a1e
diff -up vsftpd-3.0.2/sysutil.c.wnohang vsftpd-3.0.2/sysutil.c
249a1e
--- vsftpd-3.0.2/sysutil.c.wnohang	2015-08-03 07:35:33.619620425 +0200
249a1e
+++ vsftpd-3.0.2/sysutil.c	2015-08-03 07:35:33.626620480 +0200
249a1e
@@ -608,13 +608,13 @@ vsf_sysutil_exit(int exit_code)
249a1e
 }
249a1e
 
249a1e
 struct vsf_sysutil_wait_retval
249a1e
-vsf_sysutil_wait(void)
249a1e
+vsf_sysutil_wait(int hang)
249a1e
 {
249a1e
   struct vsf_sysutil_wait_retval retval;
249a1e
   vsf_sysutil_memclr(&retval, sizeof(retval));
249a1e
   while (1)
249a1e
   {
249a1e
-    int sys_ret = wait(&retval.exit_status);
249a1e
+    int sys_ret = waitpid(-1, &retval.exit_status, hang ? 0 : WNOHANG);
249a1e
     if (sys_ret < 0 && errno == EINTR)
249a1e
     {
249a1e
       vsf_sysutil_check_pending_actions(kVSFSysUtilUnknown, 0, 0);
249a1e
diff -up vsftpd-3.0.2/sysutil.h.wnohang vsftpd-3.0.2/sysutil.h
249a1e
--- vsftpd-3.0.2/sysutil.h.wnohang	2015-08-03 07:35:33.610620354 +0200
249a1e
+++ vsftpd-3.0.2/sysutil.h	2015-08-03 07:35:33.626620480 +0200
249a1e
@@ -176,7 +176,7 @@ struct vsf_sysutil_wait_retval
249a1e
   int PRIVATE_HANDS_OFF_syscall_retval;
249a1e
   int PRIVATE_HANDS_OFF_exit_status;
249a1e
 };
249a1e
-struct vsf_sysutil_wait_retval vsf_sysutil_wait(void);
249a1e
+struct vsf_sysutil_wait_retval vsf_sysutil_wait(int hang);
249a1e
 int vsf_sysutil_wait_reap_one(void);
249a1e
 int vsf_sysutil_wait_get_retval(
249a1e
   const struct vsf_sysutil_wait_retval* p_waitret);
249a1e
diff -up vsftpd-3.0.2/twoprocess.c.wnohang vsftpd-3.0.2/twoprocess.c
249a1e
--- vsftpd-3.0.2/twoprocess.c.wnohang	2012-09-16 09:15:49.000000000 +0200
249a1e
+++ vsftpd-3.0.2/twoprocess.c	2015-08-03 07:35:33.626620480 +0200
249a1e
@@ -47,8 +47,17 @@ static void
249a1e
 handle_sigchld(void* duff)
249a1e
 {
249a1e
 
249a1e
-  struct vsf_sysutil_wait_retval wait_retval = vsf_sysutil_wait();
249a1e
+  struct vsf_sysutil_wait_retval wait_retval = vsf_sysutil_wait(0);
249a1e
   (void) duff;
249a1e
+  if (!vsf_sysutil_wait_get_exitcode(&wait_retval) &&
249a1e
+      !vsf_sysutil_wait_get_retval(&wait_retval))
249a1e
+    /* There was nobody to wait for, possibly caused by underlying library
249a1e
+     * which created a new process through fork()/vfork() and already picked
249a1e
+     * it up, e.g. by pam_exec.so or integrity check routines for libraries
249a1e
+     * when FIPS mode is on (nss freebl), which can lead to calling prelink
249a1e
+     * if the prelink package is installed.
249a1e
+     */
249a1e
+    return;
249a1e
   /* Child died, so we'll do the same! Report it as an error unless the child
249a1e
    * exited normally with zero exit code
249a1e
    */
249a1e
@@ -390,7 +399,7 @@ common_do_login(struct vsf_session* p_se
249a1e
   priv_sock_send_result(p_sess->parent_fd, PRIV_SOCK_RESULT_OK);
249a1e
   if (!p_sess->control_use_ssl)
249a1e
   {
249a1e
-    (void) vsf_sysutil_wait();
249a1e
+    (void) vsf_sysutil_wait(1);
249a1e
   }
249a1e
   else
249a1e
   {