|
Message-Id: <20190411134428.GY14111@linux.ibm.com> Date: Thu, 11 Apr 2019 06:44:28 -0700 From: "Paul E. McKenney" <paulmck@...ux.ibm.com> To: Joel Fernandes <joel@...lfernandes.org> Cc: Steven Rostedt <rostedt@...dmis.org>, linux-kernel@...r.kernel.org, keescook@...omium.org, mathieu.desnoyers@...icios.com, Jessica Yu <jeyu@...nel.org>, kernel-hardening@...ts.openwall.com, kernel-team@...roid.com, rcu@...r.kernel.org Subject: Re: [PATCH v3 3/3] module: Make __tracepoints_ptrs as read-only On Thu, Apr 11, 2019 at 04:21:06AM -0400, Joel Fernandes wrote: > On Wed, Apr 10, 2019 at 08:44:01PM -0400, Steven Rostedt wrote: > > On Wed, 10 Apr 2019 16:29:02 -0400 > > Joel Fernandes <joel@...lfernandes.org> wrote: > > > > > The srcu structure pointer array is modified at module load time because the > > > array is fixed up by the module loader at load-time with the final locations > > > of the tracepoints right? Basically relocation fixups. At compile time, I > > > believe it is not know what the values in the ptr array are. I believe same > > > is true for the tracepoint ptrs array. > > > > > > Also it needs to be in a separate __tracepoint_ptrs so that this code works: > > > > > > > > > #ifdef CONFIG_TRACEPOINTS > > > mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs", > > > sizeof(*mod->tracepoints_ptrs), > > > &mod->num_tracepoints); > > > #endif > > > > > > Did I miss some point? Thanks, > > > > But there's a lot of others too. Hmm, does this mean that the RO data > > sections that are in modules are not set to RO? > > > > There's a bunch of separate sections that are RO. Just look in > > include/asm-generic/vmlinux.lds.h under the RO_DATA_SECTION() macro. > > > > A lot of the sections saved in module.c:find_module_sections() are in > > that RO_DATA when compiled as a builtin. Are they not RO when loaded via > > a module? > > > > If this is the case, there probably is going to be a lot more sections > > added to your list. > > Hi Steven, > > You are right. It turns out that this patch for tracepoint is not needed > since each tracepoint pointer is marked as a const which automatically makes > the section non-writable after relocations.. > > #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS > typedef const int tracepoint_ptr_t; > #else > typedef struct tracepoint * const tracepoint_ptr_t; > #endif > > So the fix for SRCU could just be the following. I verified with the change > that the ELF section section is marked only with the ALLOCATE flag, not the > WRITE flag which should automatically put the srcu pointer array in rodata. > I'll test this out tomorrow. > > Patch 2/3 and 3/3 would not be nececessary if this works out. 1/3 may be a > nice clean up but is not something urgent and we could do that in the future > if needed. > > Any thoughts? Thanks a lot for the review! > > (I believe it is still worth auditing other sections in built-in RODATA and > making sure they are non-writable for modules as well). Nice and simple change! ;-) If it works and Steve is OK with it, I will be happy to take the corresponding formal patch. Thanx, Paul > ---8<----------------------- > > diff --git a/include/linux/srcutree.h b/include/linux/srcutree.h > index 8af1824c46a8..9cfcc8a756ae 100644 > --- a/include/linux/srcutree.h > +++ b/include/linux/srcutree.h > @@ -123,7 +123,7 @@ struct srcu_struct { > #ifdef MODULE > # define __DEFINE_SRCU(name, is_static) \ > is_static struct srcu_struct name; \ > - struct srcu_struct *__srcu_struct_##name \ > + struct srcu_struct * const __srcu_struct_##name \ > __section("___srcu_struct_ptrs") = &name > #else > # define __DEFINE_SRCU(name, is_static) \ >
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.