From 178f99f64672cda9daf509a291581d021bb62a6a Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sun, 11 Mar 2018 14:01:21 +0000 Subject: [PATCH] syscall_exec16: Fix L2 build without locking --- Kernel/syscall_exec16.c | 59 ++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/Kernel/syscall_exec16.c b/Kernel/syscall_exec16.c index 1f0aad67..d76eaf0f 100644 --- a/Kernel/syscall_exec16.c +++ b/Kernel/syscall_exec16.c @@ -351,34 +351,37 @@ uint8_t write_core_image(void) i_deref(parent); return 0; } - if (parent && i_lock(parent) && (ino = newfile(parent, "core"))) { - ino->c_node.i_mode = F_REG | 0400; - setftime(ino, A_TIME | M_TIME | C_TIME); - wr_inode(ino); - f_trunc(ino); - - /* FIXME: need to add some arch specific header bits, and - also pull stuff like the true sp and registers out of - the return stack properly */ - - corehdr.ch_base = MAPBASE; - corehdr.ch_break = udata.u_break; - corehdr.ch_sp = udata.u_syscall_sp; - corehdr.ch_top = PROGTOP; - udata.u_offset = 0; - udata.u_base = (uint8_t *)&corehdr; - udata.u_sysio = true; - udata.u_count = sizeof(corehdr); - writei(ino, 0); - udata.u_sysio = false; - udata.u_base = MAPBASE; - udata.u_count = udata.u_break - MAPBASE; - writei(ino, 0); - udata.u_base = udata.u_sp; - udata.u_count = PROGTOP - (uint16_t)udata.u_sp; - writei(ino, 0); - i_unlock_deref(ino); - return W_COREDUMP; + if (parent) { + i_lock(parent); + if (ino = newfile(parent, "core")) { + ino->c_node.i_mode = F_REG | 0400; + setftime(ino, A_TIME | M_TIME | C_TIME); + wr_inode(ino); + f_trunc(ino); + + /* FIXME: need to add some arch specific header bits, and + also pull stuff like the true sp and registers out of + the return stack properly */ + + corehdr.ch_base = MAPBASE; + corehdr.ch_break = udata.u_break; + corehdr.ch_sp = udata.u_syscall_sp; + corehdr.ch_top = PROGTOP; + udata.u_offset = 0; + udata.u_base = (uint8_t *)&corehdr; + udata.u_sysio = true; + udata.u_count = sizeof(corehdr); + writei(ino, 0); + udata.u_sysio = false; + udata.u_base = MAPBASE; + udata.u_count = udata.u_break - MAPBASE; + writei(ino, 0); + udata.u_base = udata.u_sp; + udata.u_count = PROGTOP - (uint16_t)udata.u_sp; + writei(ino, 0); + i_unlock_deref(ino); + return W_COREDUMP; + } } return 0; } -- 2.34.1