From 49b2c69eb54e66d75f3752405a7087fcd49adbcc Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Mon, 7 Jul 2008 15:58:24 +0000 Subject: [PATCH] chrooting is not thread-safe. Install the initscript before calling VServer.start instead, where we know we're the only thread running. --- sliver_vs.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/sliver_vs.py b/sliver_vs.py index 09e46e1..9e180d1 100644 --- a/sliver_vs.py +++ b/sliver_vs.py @@ -155,16 +155,7 @@ class Sliver_VS(accounts.Account, vserver.VServer): new_initscript = rec['initscript'] if new_initscript != self.initscript: self.initscript = new_initscript - logger.log('%s: installing initscript' % self.name) - def install_initscript(): - flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC - fd = os.open('/etc/rc.vinit', flags, 0755) - os.write(fd, new_initscript) - os.close(fd) - try: - self.chroot_call(install_initscript) - self.initscriptchanged = True - except: logger.log_exc(self.name) + self.initscriptchanged = True accounts.Account.configure(self, rec) # install ssh keys @@ -174,6 +165,17 @@ class Sliver_VS(accounts.Account, vserver.VServer): time.sleep(delay) child_pid = os.fork() if child_pid == 0: + if self.initscriptchanged: + logger.log('%s: installing initscript' % self.name) + def install_initscript(): + flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC + fd = os.open('/etc/rc.vinit', flags, 0755) + os.write(fd, new_initscript) + os.close(fd) + try: + self.chroot_call(install_initscript) + self.initscriptchanged = False + except: logger.log_exc(self.name) # VServer.start calls fork() internally, # so just close the nonstandard fds and fork once to avoid creating zombies tools.close_nonstandard_fds() @@ -181,7 +183,6 @@ class Sliver_VS(accounts.Account, vserver.VServer): os._exit(0) else: os.waitpid(child_pid, 0) else: logger.log('%s: not starting, is not enabled' % self.name) - self.initscriptchanged = False def stop(self): logger.log('%s: stopping' % self.name) -- 2.43.0