[PATCH 21/46] vfork: Use clone if arch does not have the vfork syscall

Markos Chandras markos.chandras at gmail.com
Fri Nov 16 09:36:31 UTC 2012


On Thu, Nov 15, 2012 at 10:16 PM, Rich Felker <dalias at aerifal.cx> wrote:
> On Tue, Nov 13, 2012 at 11:31:30AM +0000, Markos Chandras wrote:
>> From: Markos Chandras <markos.chandras at imgtec.com>
>>
>> Signed-off-by: Markos Chandras <markos.chandras at 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 at uclibc.org
> http://lists.busybox.net/mailman/listinfo/uclibc

Hi Rich,

Thanks. I will implement it as fork() instead.

-- 
Regards,
Markos


More information about the uClibc mailing list