On Saturday 20 September 2008, Jamie Lokier wrote: > Farrell Aultman wrote: > > Between dropbear-047 and dropbear-051 changes were made that > > accounted for the fact that uClinux needs to use vfork instead of > > fork. However, fork was not replaced with vfork in all places. I > > moved the conditional preproccessor check for uClinux into the > > includes.h file, so that fork is always replaced with vfork in all > > of the dropbear code when compiling for uClinux. A side effect is > > that the code is cleaner since you just call fork without wrapping > > it every time with a conditional preprocessor check. > > Have you checked that it's safe to call vfork in all those places? > > vfork is not always a safe replacement for fork, even on uClinux where > fork doesn't work.
it istn safe. the exit() calls need to be updated too. the patch i wrote is
here (i could have sworn i posted it already):
--- dropbear-0.51/scp.c
+++ dropbear-0.51/scp.c
@@ -130,13 +130,22 @@
fprintf(stderr, " %s", a->list[i]);
fprintf(stderr, "\n");
}
- if ((pid = fork()) == -1)
+#ifdef __uClinux__
+ pid = vfork();
+#else
+ pid = fork();
+#endif /* __uClinux__ */
+ if (pid == -1)
fatal("do_local_cmd: fork: %s", strerror(errno));
if (pid == 0) {
execvp(a->list[0], a->list);
perror(a->list[0]);
+#ifdef __uClinux__
+ _exit(1);
+#else
exit(1);
+#endif /* __uClinux__ */
}
do_cmd_pid = pid;
@@ -225,7 +234,11 @@
execvp(ssh_program, args.list);
perror(ssh_program);
+#ifndef __uClinux__
exit(1);
+#else
+ _exit(1);
+#endif /* __uClinux__ */
} else if (do_cmd_pid == -1) {
fatal("fork: %s", strerror(errno));
}
-mike
signature.asc
Description: This is a digitally signed message part.
