Again, it would be better to do something like the following in includes.h: +#ifdef __uClinux__ +#define exit(x) _exit(x) +#endif
On Tue, Oct 21, 2008 at 1:01 AM, Mike Frysinger <[EMAIL PROTECTED]> wrote: > 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 >