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]
Date:	Wed, 18 Mar 2015 10:08:25 +0100
From:	Quentin Casasnovas <quentin.casasnovas@...cle.com>
To:	Quentin Casasnovas <quentin.casasnovas@...cle.com>,
	Rusty Russell <rusty@...tcorp.com.au>,
	Michal Marek <mmarek@...e.cz>
Cc:	lkml <linux-kernel@...r.kernel.org>,
	Oleg Nesterov <oleg@...hat.com>,
	Borislav Petkov <bp@...en8.de>,
	Linus Torvalds <torvalds@...ux-foundation.org>
Subject: Re: [PATCH 3/7] modpost: add handler function pointer to
 sectioncheck.

Adding Rusty and Michal to CC.

On Tue, Mar 17, 2015 at 01:39:58PM +0100, Quentin Casasnovas wrote:
> This will be useful when we want to have special handlers which need to go
> through more hops to print useful information to the user.
> 
> Signed-off-by: Quentin Casasnovas <quentin.casasnovas@...cle.com>
> ---
>  scripts/mod/modpost.c | 68 +++++++++++++++++++++++++++++++--------------------
>  1 file changed, 42 insertions(+), 26 deletions(-)
> 
> diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
> index 8cef46b..0f48f8b 100644
> --- a/scripts/mod/modpost.c
> +++ b/scripts/mod/modpost.c
> @@ -930,6 +930,10 @@ struct sectioncheck {
>  	const char *good_tosec[20];
>  	enum mismatch mismatch;
>  	const char *symbol_white_list[20];
> +	void (*handler)(const char *modname, struct elf_info *elf,
> +			const struct sectioncheck* const mismatch,
> +			Elf_Rela *r, Elf_Sym *sym, const char *fromsec);
> +
>  };
>  
>  static const struct sectioncheck sectioncheck[] = {
> @@ -1417,37 +1421,49 @@ static void report_sec_mismatch(const char *modname,
>  	fprintf(stderr, "\n");
>  }
>  
> -static void check_section_mismatch(const char *modname, struct elf_info *elf,
> -				   Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
> +static void default_mismatch_handler(const char *modname, struct elf_info *elf,
> +				     const struct sectioncheck* const mismatch,
> +				     Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
>  {
>  	const char *tosec;
> -	const struct sectioncheck *mismatch;
> +	Elf_Sym *to;
> +	Elf_Sym *from;
> +	const char *tosym;
> +	const char *fromsym;
>  
>  	tosec = sec_name(elf, get_secindex(elf, sym));
> -	mismatch = section_mismatch(fromsec, tosec);
> +	from = find_elf_symbol2(elf, r->r_offset, fromsec);
> +	fromsym = sym_name(elf, from);
> +	to = find_elf_symbol(elf, r->r_addend, sym);
> +	tosym = sym_name(elf, to);
> +
> +	if (!strncmp(fromsym, "reference___initcall",
> +		     sizeof("reference___initcall")-1))
> +		return;
> +
> +	/* check whitelist - we may ignore it */
> +	if (secref_whitelist(mismatch,
> +			     fromsec, fromsym, tosec, tosym)) {
> +		report_sec_mismatch(modname, mismatch,
> +				    fromsec, r->r_offset, fromsym,
> +				    is_function(from), tosec, tosym,
> +				    is_function(to));
> +	}
> +}
> +
> +static void check_section_mismatch(const char *modname, struct elf_info *elf,
> +				   Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
> +{
> +	const char *tosec = sec_name(elf, get_secindex(elf, sym));;
> +	const struct sectioncheck *mismatch = section_mismatch(fromsec, tosec);
> +
>  	if (mismatch) {
> -		Elf_Sym *to;
> -		Elf_Sym *from;
> -		const char *tosym;
> -		const char *fromsym;
> -
> -		from = find_elf_symbol2(elf, r->r_offset, fromsec);
> -		fromsym = sym_name(elf, from);
> -		to = find_elf_symbol(elf, r->r_addend, sym);
> -		tosym = sym_name(elf, to);
> -
> -		if (!strncmp(fromsym, "reference___initcall",
> -				sizeof("reference___initcall")-1))
> -			return;
> -
> -		/* check whitelist - we may ignore it */
> -		if (secref_whitelist(mismatch,
> -					fromsec, fromsym, tosec, tosym)) {
> -			report_sec_mismatch(modname, mismatch,
> -			   fromsec, r->r_offset, fromsym,
> -			   is_function(from), tosec, tosym,
> -			   is_function(to));
> -		}
> +		if (mismatch->handler)
> +			mismatch->handler(modname, elf,  mismatch,
> +					  r, sym, fromsec);
> +		else
> +			default_mismatch_handler(modname, elf, mismatch,
> +						 r, sym, fromsec);
>  	}
>  }
>  
> -- 
> 2.0.5
> 
--
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