set task's name when fork

When fork a child process, the name filed of TaskContext is not set.
It results in that when we cat /proc/{pid}/status, the name filed is
null.

Like this:
Name:
State:  S (sleeping)
Tgid:   28
Pid:    28
PPid:   26
TracerPid:      0
FDSize: 8
VmSize: 89712 kB
VmRSS:  6648 kB
Threads:        1
CapInh: 00000000a93d35fb
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 00000000a93d35fb
Seccomp:        0
Change-Id: I5d469098c37cedd19da16b7ffab2e546a28a321e
PiperOrigin-RevId: 240893304
This commit is contained in:
chris.zn 2019-03-28 18:04:32 -07:00 committed by Shentubot
parent 99195b0e16
commit 31c2236e97
2 changed files with 25 additions and 0 deletions

View File

@ -74,6 +74,7 @@ func (tc *TaskContext) release() {
// of the original's.
func (tc *TaskContext) Fork(ctx context.Context, k *Kernel, shareAddressSpace bool) (*TaskContext, error) {
newTC := &TaskContext{
Name: tc.Name,
Arch: tc.Arch.Fork(),
st: tc.st,
}

View File

@ -52,6 +52,30 @@ TEST(PrctlTest, SetNameLongName) {
ASSERT_EQ(long_name.substr(0, truncated_length), std::string(truncated_name));
}
TEST(PrctlTest, ChildProcessName) {
constexpr size_t kMaxNameLength = 15;
char parent_name[kMaxNameLength + 1] = {};
memset(parent_name, 'a', kMaxNameLength);
ASSERT_THAT(prctl(PR_SET_NAME, parent_name), SyscallSucceeds());
pid_t child_pid = fork();
TEST_PCHECK(child_pid >= 0);
if (child_pid == 0) {
char child_name[kMaxNameLength + 1] = {};
TEST_PCHECK(prctl(PR_GET_NAME, child_name) >= 0);
TEST_CHECK(memcmp(parent_name, child_name, sizeof(parent_name)) == 0);
_exit(0);
}
int status;
ASSERT_THAT(waitpid(child_pid, &status, 0),
SyscallSucceedsWithValue(child_pid));
EXPECT_TRUE(WIFEXITED(status) && WEXITSTATUS(status) == 0)
<< "status =" << status;
}
// Offset added to exit code from test child to distinguish from other abnormal
// exits.
constexpr int kPrctlNoNewPrivsTestChildExitBase = 100;