[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAEmTpZGJxtTuq8LDTLDK4V8to_Z30WEmo=p_2umboHvZaDr=Xg@mail.gmail.com>
Date: Thu, 31 Mar 2022 13:36:42 +0500
From: Марк Коренберг
<socketpair@...il.com>
To: linux-kernel@...r.kernel.org
Subject: BUG: vfork() returns EINVAL after unshare(CLONE_NEWTIME)
test:
----------------------------------------
#define _GNU_SOURCE 1
#include <stdio.h>
#include <sched.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <err.h>
#ifndef CLONE_NEWTIME
#define CLONE_NEWTIME 0x00000080
#endif
int main (void)
{
if (unshare (CLONE_NEWTIME)) err (EXIT_FAILURE, "UNSHARE_NEWTIME");
pid_t pid;
switch (pid=vfork ())
{
case 0:
_exit(0);
case -1:
err(EXIT_FAILURE, "vfork BUG");
default:
waitpid(pid, NULL, 0);
}
return 0;
}
-----------------------------------------------
Seems the bug in kernel/fork.c. It does not check for CLONE_VFORK
if (clone_flags & (CLONE_THREAD | CLONE_VM)) {
if (nsp->time_ns != nsp->time_ns_for_children)
return ERR_PTR(-EINVAL);
}
-----------------------------------
Changing vfork() to fork() in the program works ok.
The bug has been found during regression in our system because Python
3.10 runs subprocesses using vfork()+execve().
--
Segmentation fault
Powered by blists - more mailing lists