This allows chroot to occur before setsid_early().

In the case where a master process is re-initialised
* It will not chroot itself, though if it is already chrooted that will
  remain in effect.
* If it is already chrooted then the path to the configuration file
  read during reinitialisation will be relative to the chroot.
---
 src/haproxy.c |  116 ++++++++++++++++++++++++++++----------------------------
 1 files changed, 58 insertions(+), 58 deletions(-)

diff --git a/src/haproxy.c b/src/haproxy.c
index 4ee7161..dc2739b 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -1074,6 +1074,64 @@ void run(int argc, char **argv)
         */
        signal_register_fct(SIGPIPE, NULL, 0);
 
+       /* open log & pid files before the chroot */
+       if (global.mode & MODE_DAEMON && global.pidfile != NULL) {
+               int pidfd;
+               unlink(global.pidfile);
+               pidfd = open(global.pidfile, O_CREAT | O_WRONLY | O_TRUNC, 
0644);
+               if (pidfd < 0) {
+                       Alert("[%s.run()] Cannot create pidfile %s\n", argv[0], 
global.pidfile);
+                       if (nb_oldpids)
+                               tell_old_pids(SIGTTIN);
+                       protocol_unbind_all();
+                       exit(1);
+               }
+               pidfile = fdopen(pidfd, "w");
+       }
+
+#ifdef CONFIG_HAP_CTTPROXY
+       if (global.last_checks & LSTCHK_CTTPROXY) {
+               int ret;
+
+               ret = check_cttproxy_version();
+               if (ret < 0) {
+                       Alert("[%s.run()] Cannot enable cttproxy.\n%s",
+                             argv[0],
+                             (ret == -1) ? "  Incorrect module version.\n"
+                             : "  Make sure you have enough permissions and 
that the module is loaded.\n");
+                       protocol_unbind_all();
+                       exit(1);
+               }
+       }
+#endif
+
+       if ((global.last_checks & LSTCHK_NETADM) && global.uid) {
+               Alert("[%s.run()] Some configuration options require full 
privileges, so global.uid cannot be changed.\n"
+                     "", argv[0]);
+               protocol_unbind_all();
+               exit(1);
+       }
+
+       /* If the user is not root, we'll still let him try the configuration
+        * but we inform him that unexpected behaviour may occur.
+        */
+       if ((global.last_checks & LSTCHK_NETADM) && getuid())
+               Warning("[%s.run()] Some options which require full privileges"
+                       " might not work well.\n"
+                       "", argv[0]);
+
+       /* chroot if needed */
+       if (!is_master && global.chroot != NULL) {
+               if (chroot(global.chroot) == -1) {
+                       Alert("[%s.run()] Cannot chroot(%s).\n", argv[0], 
global.chroot);
+                       if (nb_oldpids)
+                               tell_old_pids(SIGTTIN);
+                       protocol_unbind_all();
+                       exit(1);
+               }
+               chdir("/");
+       }
+
        setid_early(argv[0]);
 
        /* ulimits */
@@ -1176,64 +1234,6 @@ void run(int argc, char **argv)
                fclose(stdin); fclose(stdout); fclose(stderr);
        }
 
-       /* open log & pid files before the chroot */
-       if (global.mode & MODE_DAEMON && global.pidfile != NULL) {
-               int pidfd;
-               unlink(global.pidfile);
-               pidfd = open(global.pidfile, O_CREAT | O_WRONLY | O_TRUNC, 
0644);
-               if (pidfd < 0) {
-                       Alert("[%s.run()] Cannot create pidfile %s\n", argv[0], 
global.pidfile);
-                       if (nb_oldpids)
-                               tell_old_pids(SIGTTIN);
-                       protocol_unbind_all();
-                       exit(1);
-               }
-               pidfile = fdopen(pidfd, "w");
-       }
-
-#ifdef CONFIG_HAP_CTTPROXY
-       if (global.last_checks & LSTCHK_CTTPROXY) {
-               int ret;
-
-               ret = check_cttproxy_version();
-               if (ret < 0) {
-                       Alert("[%s.run()] Cannot enable cttproxy.\n%s",
-                             argv[0],
-                             (ret == -1) ? "  Incorrect module version.\n"
-                             : "  Make sure you have enough permissions and 
that the module is loaded.\n");
-                       protocol_unbind_all();
-                       exit(1);
-               }
-       }
-#endif
-
-       if ((global.last_checks & LSTCHK_NETADM) && global.uid) {
-               Alert("[%s.run()] Some configuration options require full 
privileges, so global.uid cannot be changed.\n"
-                     "", argv[0]);
-               protocol_unbind_all();
-               exit(1);
-       }
-
-       /* If the user is not root, we'll still let him try the configuration
-        * but we inform him that unexpected behaviour may occur.
-        */
-       if ((global.last_checks & LSTCHK_NETADM) && getuid())
-               Warning("[%s.run()] Some options which require full privileges"
-                       " might not work well.\n"
-                       "", argv[0]);
-
-       /* chroot if needed */
-       if (global.chroot != NULL) {
-               if (chroot(global.chroot) == -1) {
-                       Alert("[%s.run()] Cannot chroot(%s).\n", argv[0], 
global.chroot);
-                       if (nb_oldpids)
-                               tell_old_pids(SIGTTIN);
-                       protocol_unbind_all();
-                       exit(1);
-               }
-               chdir("/");
-       }
-
        if (nb_oldpids)
                nb_oldpids = tell_old_pids(oldpids_sig);
 
-- 
1.7.2.3


Reply via email to