On Tue, Nov 13, 2012 at 11:31:30AM +0000, Markos Chandras wrote: > From: Markos Chandras <markos.chand...@imgtec.com> > > Signed-off-by: Markos Chandras <markos.chand...@imgtec.com> > --- > libc/sysdeps/linux/common/vfork.c | 20 +++++++++++++++++++- > 1 files changed, 19 insertions(+), 1 deletions(-) > > diff --git a/libc/sysdeps/linux/common/vfork.c > b/libc/sysdeps/linux/common/vfork.c > index e7c9208..16f5f79 100644 > --- a/libc/sysdeps/linux/common/vfork.c > +++ b/libc/sysdeps/linux/common/vfork.c > @@ -4,13 +4,31 @@ > * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. > */ > > +#include <signal.h> > #include <unistd.h> > #include <sys/types.h> > #include <sys/syscall.h> > > extern __typeof(vfork) __vfork attribute_hidden; > > -#ifdef __NR_vfork > +#if defined(__NR_clone) && ! defined(__NR_vfork) > +pid_t __vfork(void) > +{ > + pid_t pid; > + pid = INLINE_SYSCALL(clone, 4, CLONE_VFORK | CLONE_VM | > + SIGCHLD, NULL, NULL, NULL); > + > + if (pid<0) { > + __set_errno(-pid); > + return -1 > + } > + > + return pid; > +} > +weak_alias(__vfork,vfork) > +libc_hidden_weak(vfork)
This is not valid. clone will return twice, both in the parent and the child, but the child will already have clobbered the return address on the parent's stack due to sharing memory. Whether you use the clone syscall or the vfork syscall, the only way to implement vfork is from asm. If you want a generic C fallback, it should just behave as fork rather than as vfork. Rich _______________________________________________ uClibc mailing list uClibc@uclibc.org http://lists.busybox.net/mailman/listinfo/uclibc