lx_emul: initialize task members needed by network

Those members are access via static inline functions in the network
core code and from certain protocols, e.g. AF_NETLINK.

Issue #4455.
This commit is contained in:
Josef Söntgen 2022-02-11 16:26:23 +01:00 committed by Christian Helmuth
parent 77cdceabaa
commit edb08770dc
2 changed files with 32 additions and 3 deletions

View File

@ -18,6 +18,8 @@
#include <asm/processor.h>
#include <lx_emul/task.h>
#include <linux/sched/task.h>
#include <linux/cred.h>
#include <linux/sched/signal.h>
/*
* We accept that we transfer the 4KiB task_struct object via stack in
@ -30,7 +32,22 @@ pid_t kernel_thread(int (* fn)(void *),void * arg,unsigned long flags)
{
static int pid_counter = FIRST_PID;
struct task_struct * task = kmalloc(sizeof(struct task_struct), GFP_KERNEL);
struct cred * cred;
struct task_struct * task;
struct signal_struct *signal;
cred = kzalloc(sizeof (struct cred), GFP_KERNEL);
if (!cred)
return -1;
signal = kzalloc(sizeof(struct signal_struct), GFP_KERNEL);
if (!signal)
goto err_signal;
task = kmalloc(sizeof(struct task_struct), GFP_KERNEL);
if (!task)
goto err_task;
*task = (struct task_struct) {
.__state = 0,
.usage = REFCOUNT_INIT(2),
@ -55,8 +72,10 @@ pid_t kernel_thread(int (* fn)(void *),void * arg,unsigned long flags)
.pid = pid_counter++,
.pending = {
.list = LIST_HEAD_INIT(task->pending.list),
.signal = {{0}}
}};
.signal = {{0}} },
.cred = cred,
.signal = signal,
};
#ifndef CONFIG_X86
task->thread_info.preempt_count = 0;
@ -64,6 +83,12 @@ pid_t kernel_thread(int (* fn)(void *),void * arg,unsigned long flags)
lx_emul_task_create(task, "kthread", task->pid, fn, arg);
return task->pid;
err_task:
kfree(signal);
err_signal:
kfree(cred);
return -1;
}
#pragma GCC diagnostic pop

View File

@ -131,6 +131,9 @@ int lx_emul_init_task_function(void * dtb)
}
static struct cred _init_task_cred;
struct task_struct init_task = {
.__state = 0,
.usage = REFCOUNT_INIT(2),
@ -157,5 +160,6 @@ struct task_struct init_task = {
.signal = {{0}}
},
.blocked = {{0}},
.cred = &_init_task_cred,
};
void * lx_emul_init_task_struct = &init_task;