summaryrefslogtreecommitdiff
path: root/networking
diff options
context:
space:
mode:
authorDenis Vlasenko2008-07-01 15:59:42 +0000
committerDenis Vlasenko2008-07-01 15:59:42 +0000
commit82604e973085f91f1b99cacea08963d0d1468084 (patch)
tree2de05bb2a6943ca6be0cc46f36e5fb07099aef40 /networking
parentb111917972c1398ef96ef2d388c6c4ba57a8e9f7 (diff)
downloadbusybox-82604e973085f91f1b99cacea08963d0d1468084.zip
busybox-82604e973085f91f1b99cacea08963d0d1468084.tar.gz
revert last two commits. vfork cannot be used in subroutine,
it trashes stack on return
Diffstat (limited to 'networking')
-rw-r--r--networking/ifupdown.c7
-rw-r--r--networking/inetd.c2
-rw-r--r--networking/sendmail.c11
3 files changed, 16 insertions, 4 deletions
diff --git a/networking/ifupdown.c b/networking/ifupdown.c
index 8caff3f..c123918 100644
--- a/networking/ifupdown.c
+++ b/networking/ifupdown.c
@@ -1008,9 +1008,12 @@ static int popen2(FILE **in, FILE **out, char *command, char *param)
xpiped_pair(outfd);
fflush(NULL);
- pid = xvfork();
+ pid = vfork();
- if (pid == 0) { /* child */
+ switch (pid) {
+ case -1: /* failure */
+ bb_perror_msg_and_die("vfork");
+ case 0: /* child */
/* NB: close _first_, then move fds! */
close(infd.wr);
close(outfd.rd);
diff --git a/networking/inetd.c b/networking/inetd.c
index 0028078..08c0995 100644
--- a/networking/inetd.c
+++ b/networking/inetd.c
@@ -1303,7 +1303,7 @@ int inetd_main(int argc ATTRIBUTE_UNUSED, char **argv)
pid = vfork();
if (pid < 0) { /* fork error */
- bb_perror_msg(BB_MMU ? "vfork" + 1 : "vfork");
+ bb_perror_msg("fork");
sleep(1);
restore_sigmask(&omask);
maybe_close(accepted_fd);
diff --git a/networking/sendmail.c b/networking/sendmail.c
index c195cc0..1c23ca2 100644
--- a/networking/sendmail.c
+++ b/networking/sendmail.c
@@ -120,6 +120,15 @@ static void signal_handler(int signo)
#undef err
}
+/* libbb candidate */
+static pid_t vfork_or_die(void)
+{
+ pid_t pid = vfork();
+ if (pid < 0)
+ bb_perror_msg_and_die("vfork");
+ return pid;
+}
+
static void launch_helper(const char **argv)
{
// setup vanilla unidirectional pipes interchange
@@ -128,7 +137,7 @@ static void launch_helper(const char **argv)
xpipe(pipes);
xpipe(pipes+2);
- helper_pid = xvfork();
+ helper_pid = vfork_or_die();
idx = (!helper_pid) * 2;
xdup2(pipes[idx], STDIN_FILENO);
xdup2(pipes[3-idx], STDOUT_FILENO);