From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751143AbbCTBo7 (ORCPT ); Thu, 19 Mar 2015 21:44:59 -0400 Received: from ozlabs.org ([103.22.144.67]:48042 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750734AbbCTBoz (ORCPT ); Thu, 19 Mar 2015 21:44:55 -0400 From: Rusty Russell To: Quentin Casasnovas , lkml Cc: Oleg Nesterov , Borislav Petkov , Linus Torvalds , Quentin Casasnovas Subject: Re: [PATCH 1/7] modpost: add strict white-listing when referencing sections. In-Reply-To: <1426596002-26128-2-git-send-email-quentin.casasnovas@oracle.com> References: <1426596002-26128-1-git-send-email-quentin.casasnovas@oracle.com> <1426596002-26128-2-git-send-email-quentin.casasnovas@oracle.com> User-Agent: Notmuch/0.17 (http://notmuchmail.org) Emacs/24.3.1 (x86_64-pc-linux-gnu) Date: Fri, 20 Mar 2015 11:59:41 +1030 Message-ID: <87sid0jw1m.fsf@rustcorp.com.au> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Quentin Casasnovas writes: > Prints a warning when a section references a section outside a strict > white-list. This will be useful to print a warning if __ex_table > references a non-executable section. Hi Quentin, Really pleasant to read these patches; nice work! > diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c > index d439856..7094a57 100644 > --- a/scripts/mod/modpost.c > +++ b/scripts/mod/modpost.c > @@ -925,7 +925,8 @@ enum mismatch { > > struct sectioncheck { > const char *fromsec[20]; > - const char *tosec[20]; > + const char *bad_tosec[20]; > + const char *good_tosec[20]; > enum mismatch mismatch; > const char *symbol_white_list[20]; My only gripe is that these fields are undocumented. You maintain the status quo, but some comments indicating what the mean would be nice. Perhaps as a separate patch. In case you need it (for the whole series): Acked-by: Rusty Russell Thanks, Rusty. > }; > @@ -936,19 +937,19 @@ static const struct sectioncheck sectioncheck[] = { > */ > { > .fromsec = { TEXT_SECTIONS, NULL }, > - .tosec = { ALL_INIT_SECTIONS, NULL }, > + .bad_tosec = { ALL_INIT_SECTIONS, NULL }, > .mismatch = TEXT_TO_ANY_INIT, > .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, > }, > { > .fromsec = { DATA_SECTIONS, NULL }, > - .tosec = { ALL_XXXINIT_SECTIONS, NULL }, > + .bad_tosec = { ALL_XXXINIT_SECTIONS, NULL }, > .mismatch = DATA_TO_ANY_INIT, > .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, > }, > { > .fromsec = { DATA_SECTIONS, NULL }, > - .tosec = { INIT_SECTIONS, NULL }, > + .bad_tosec = { INIT_SECTIONS, NULL }, > .mismatch = DATA_TO_ANY_INIT, > .symbol_white_list = { > "*_template", "*_timer", "*_sht", "*_ops", > @@ -957,54 +958,54 @@ static const struct sectioncheck sectioncheck[] = { > }, > { > .fromsec = { TEXT_SECTIONS, NULL }, > - .tosec = { ALL_EXIT_SECTIONS, NULL }, > + .bad_tosec = { ALL_EXIT_SECTIONS, NULL }, > .mismatch = TEXT_TO_ANY_EXIT, > .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, > }, > { > .fromsec = { DATA_SECTIONS, NULL }, > - .tosec = { ALL_EXIT_SECTIONS, NULL }, > + .bad_tosec = { ALL_EXIT_SECTIONS, NULL }, > .mismatch = DATA_TO_ANY_EXIT, > .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, > }, > /* Do not reference init code/data from meminit code/data */ > { > .fromsec = { ALL_XXXINIT_SECTIONS, NULL }, > - .tosec = { INIT_SECTIONS, NULL }, > + .bad_tosec = { INIT_SECTIONS, NULL }, > .mismatch = XXXINIT_TO_SOME_INIT, > .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, > }, > /* Do not reference exit code/data from memexit code/data */ > { > .fromsec = { ALL_XXXEXIT_SECTIONS, NULL }, > - .tosec = { EXIT_SECTIONS, NULL }, > + .bad_tosec = { EXIT_SECTIONS, NULL }, > .mismatch = XXXEXIT_TO_SOME_EXIT, > .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, > }, > /* Do not use exit code/data from init code */ > { > .fromsec = { ALL_INIT_SECTIONS, NULL }, > - .tosec = { ALL_EXIT_SECTIONS, NULL }, > + .bad_tosec = { ALL_EXIT_SECTIONS, NULL }, > .mismatch = ANY_INIT_TO_ANY_EXIT, > .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, > }, > /* Do not use init code/data from exit code */ > { > .fromsec = { ALL_EXIT_SECTIONS, NULL }, > - .tosec = { ALL_INIT_SECTIONS, NULL }, > + .bad_tosec = { ALL_INIT_SECTIONS, NULL }, > .mismatch = ANY_EXIT_TO_ANY_INIT, > .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, > }, > { > .fromsec = { ALL_PCI_INIT_SECTIONS, NULL }, > - .tosec = { INIT_SECTIONS, NULL }, > + .bad_tosec = { INIT_SECTIONS, NULL }, > .mismatch = ANY_INIT_TO_ANY_EXIT, > .symbol_white_list = { NULL }, > }, > /* Do not export init/exit functions or data */ > { > .fromsec = { "__ksymtab*", NULL }, > - .tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL }, > + .bad_tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL }, > .mismatch = EXPORT_TO_INIT_EXIT, > .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, > } > @@ -1018,9 +1019,12 @@ static const struct sectioncheck *section_mismatch( > const struct sectioncheck *check = §ioncheck[0]; > > for (i = 0; i < elems; i++) { > - if (match(fromsec, check->fromsec) && > - match(tosec, check->tosec)) > - return check; > + if (match(fromsec, check->fromsec)) { > + if (check->bad_tosec[0] && match(tosec, check->bad_tosec)) > + return check; > + if (check->good_tosec[0] && !match(tosec, check->good_tosec)) > + return check; > + } > check++; > } > return NULL; > -- > 2.0.5 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/