lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20151216092812.34711e3b@grimm.local.home>
Date:	Wed, 16 Dec 2015 09:28:12 -0500
From:	Steven Rostedt <rostedt@...dmis.org>
To:	"Zhang, Yanmin" <yanmin_zhang@...ux.intel.com>
Cc:	"Qiu, PeiyangX" <peiyangx.qiu@...el.com>,
	linux-kernel@...r.kernel.org, mingo@...hat.com,
	Rusty Russell <rusty@...tcorp.com.au>
Subject: Re: [PATCH] ftrace: fix race between ftrace and insmod

On Wed, 16 Dec 2015 18:28:35 +0800
"Zhang, Yanmin" <yanmin_zhang@...ux.intel.com> wrote:

> > +	/*
> > +	 * If the tracing is enabled, go ahead and enable the record.
> > +	 *
> > +	 * The reason not to enable the record immediatelly is the
> > +	 * inherent check of ftrace_make_nop/ftrace_make_call for
> > +	 * correct previous instructions.  Making first the NOP
> > +	 * conversion puts the module to the correct state, thus
> > +	 * passing the ftrace_make_call check.
> > +	 *
> > +	 * We also delay this to after the module code already set the
> > +	 * text to read-only, as we now need to set it back to read-write
> > +	 * so that we can modify the text.
> > +	 */
> > +	if (ftrace_start_up)
> > +		ftrace_arch_code_modify_prepare();
> > +
> > +	do_for_each_ftrace_rec(pg, rec) {
> > +		int cnt;
> > +		/*
> > +		 * do_for_each_ftrace_rec() is a double loop.
> > +		 * module text shares the pg. If a record is
> > +		 * not part of this module, then skip this pg,
> > +		 * which the "break" will do.
> > +		 */
> > +		if (!within_module_core(rec->ip, mod))
> > +			break;
> > +
> > +		cnt = 0;
> > +
> > +		/*
> > +		 * When adding a module, we need to check if tracers are
> > +		 * currently enabled and if they are, and can trace this record,
> > +		 * we need to enable the module functions as well as update the
> > +		 * reference counts for those function records.
> > +		 */
> > +		if (ftrace_start_up)
> > +			cnt += referenced_filters(rec);
> > +
> > +		/* This clears FTRACE_FL_DISABLED */
> > +		rec->flags = cnt;
> > +
> > +		if (ftrace_start_up && cnt) {
> > +			int failed = __ftrace_replace_code(rec, 1);  
> 
> If we choose to call ftrace_module_enable when receiving module notification
>   MODULE_STATE_COMING, TEXT section of the module is already changed to RO.

And that's why we call ftrace_arch_code_modify_prepare(). That should
change all text to RW.

-- Steve
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ