From edb08770dc3008e36180edd925fd7082047586a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Fri, 11 Feb 2022 16:26:23 +0100 Subject: [PATCH] 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. --- .../src/lib/lx_emul/shadow/kernel/fork.c | 31 +++++++++++++++++-- repos/dde_linux/src/lib/lx_emul/start.c | 4 +++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/repos/dde_linux/src/lib/lx_emul/shadow/kernel/fork.c b/repos/dde_linux/src/lib/lx_emul/shadow/kernel/fork.c index 4eaedfdd86..58ad199049 100644 --- a/repos/dde_linux/src/lib/lx_emul/shadow/kernel/fork.c +++ b/repos/dde_linux/src/lib/lx_emul/shadow/kernel/fork.c @@ -18,6 +18,8 @@ #include #include #include +#include +#include /* * 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 diff --git a/repos/dde_linux/src/lib/lx_emul/start.c b/repos/dde_linux/src/lib/lx_emul/start.c index 00aaee530c..ec9469edca 100644 --- a/repos/dde_linux/src/lib/lx_emul/start.c +++ b/repos/dde_linux/src/lib/lx_emul/start.c @@ -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;