From: Romain Naour <romain.naour@openwide.fr>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCHv2 01/12] toolchain-external: instrument wrapper to warn about unsafe paths
Date: Sat, 06 Dec 2014 17:57:39 +0100 [thread overview]
Message-ID: <54833583.4030700@openwide.fr> (raw)
In-Reply-To: <1417470913-1280-2-git-send-email-thomas.petazzoni@free-electrons.com>
Hi Thomas,
Le 01/12/2014 22:55, Thomas Petazzoni a ?crit :
> The CodeSourcery toolchains have a very interesting feature: they warn
> the user when an unsafe header or library path is used, i.e a path
> that will lead host headers or libraries to leak into the build.
>
> This commit adds a similar functionality into our external toolchain
> wrapper, so that it can be used with all external toolchains, and can
> also be tuned as needed. By default, the external toolchain wrapper
> now gives warnings such as:
>
> arm-linux-gcc: WARNING: unsafe header/library path used in cross-compilation: '-I /usr/foo'
> arm-linux-gcc: WARNING: unsafe header/library path used in cross-compilation: '-L /usr/bleh'
>
> but the compilation continues successfully. One can then easily grep
> in his build log to search for occurences of this message.
>
> Optionally, if BR_COMPILER_PARANOID_UNSAFE_PATH is defined in the
> environment to a non empty value, the external wrapper will instead
> error out and abort the compilation.
>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> ---
> .../toolchain-external/ext-toolchain-wrapper.c | 53 ++++++++++++++++++++++
> 1 file changed, 53 insertions(+)
>
> diff --git a/toolchain/toolchain-external/ext-toolchain-wrapper.c b/toolchain/toolchain-external/ext-toolchain-wrapper.c
> index f459a7e..846cb5b 100644
> --- a/toolchain/toolchain-external/ext-toolchain-wrapper.c
> +++ b/toolchain/toolchain-external/ext-toolchain-wrapper.c
> @@ -15,11 +15,13 @@
> * kind, whether express or implied.
> */
>
> +#define _GNU_SOURCE
> #include <stdio.h>
> #include <string.h>
> #include <limits.h>
> #include <unistd.h>
> #include <stdlib.h>
> +#include <errno.h>
>
> static char path[PATH_MAX];
> static char sysroot[PATH_MAX];
> @@ -69,6 +71,25 @@ static char *predef_args[] = {
> #endif
> };
>
> +static void check_unsafe_path(const char *path, int paranoid)
> +{
> + char **c;
> + static char *unsafe_paths[] = {
> + "/lib", "/usr/include", "/usr/lib", "/usr/local/include", "/usr/local/lib", NULL,
We may add "/lib64", "/usr/lib64" and "/usr/local/lib64" too ?
> + };
> +
> + for (c = unsafe_paths; *c != NULL; c++) {
> + if (!strncmp(path, *c, strlen(*c))) {
> + fprintf(stderr, "%s: %s: unsafe header/library path used in cross-compilation: '%s'\n",
> + program_invocation_short_name,
> + paranoid ? "ERROR" : "WARNING", path);
> + if (paranoid)
> + exit(1);
> + continue;
> + }
> + }
> +}
> +
> int main(int argc, char **argv)
> {
> char **args, **cur;
> @@ -76,6 +97,8 @@ int main(int argc, char **argv)
> char *progpath = argv[0];
> char *basename;
> char *env_debug;
> + char *paranoid_wrapper;
> + int paranoid;
> int ret, i, count = 0, debug;
>
> /* Calculate the relative paths */
> @@ -172,6 +195,36 @@ int main(int argc, char **argv)
> }
> #endif /* ARCH || CPU */
>
> + paranoid_wrapper = getenv("BR_COMPILER_PARANOID_UNSAFE_PATH");
> + if (paranoid_wrapper && strlen(paranoid_wrapper) > 0)
> + paranoid = 1;
> + else
> + paranoid = 0;
> +
> +
extra new line
> + /* Check for unsafe library and header paths */
> + for (i = 1; i < argc; i++) {
> +
> + /* Skip options that do not start with -I and -L */
> + if (strncmp(argv[i], "-I", 2) && strncmp(argv[i], "-L", 2))
> + continue;
> +
> + /* We handle two cases: first the case where -I/-L and
> + * the path are separated by one space and therefore
> + * visible as two separate options, and then the case
> + * where they are stuck together forming one single
> + * option.
> + */
> + if (argv[i][2] == '\0') {
> + i++;
> + if (i == argc)
> + continue;
> + check_unsafe_path(argv[i], paranoid);
> + } else {
> + check_unsafe_path(argv[i] + 2, paranoid);
> + }
> + }
> +
> /* append forward args */
> memcpy(cur, &argv[1], sizeof(char *) * (argc - 1));
> cur += argc - 1;
>
Otherwise:
Reviewed-by: Romain Naour <romain.naour@openwide.fr>
Tested-by: Romain Naour <romain.naour@openwide.fr>
Tested with an external x86 toolchain with iprutils package selected.
$ make O=test/paranoid iprutils BR_COMPILER_PARANOID_UNSAFE_PATH=1
/home/naourr/git/buildroot/test/paranoid/host/usr/bin/i686-pc-linux-gnu-gcc -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -pipe -Os -Wall -DIPR_MAJOR_RELEASE=2 -DIPR_MINOR_RELEASE=4 -DIPR_FIX_LEVEL=2 -DIPR_FIX_DATE='"(June 10, 2014)"' -DIPR_VERSION_STR='"2.4.2 (June 10, 2014)"' -DIPR_RELEASE=1 -I. -I/usr/include/ncurses -o iprlib.o -c iprlib.c
gzip -f -c iprinit.8 > iprinit.8.gz
i686-pc-linux-gnu-gcc: ERROR: unsafe header/library path used in cross-compilation: '/usr/include/ncurses'
make[1]: *** [iprlib.o] Erreur 1
Thanks,
--
Romain Naour
OPEN WIDE Ing?nierie - Paris
23/25, rue Daviel| 75013 PARIS
http://ingenierie.openwide.fr
Le blog des technologies libres et embarqu?es :
http://www.linuxembedded.fr
next prev parent reply other threads:[~2014-12-06 16:57 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-01 21:55 [Buildroot] [PATCHv2 00/12] Paranoid header and library path checking Thomas Petazzoni
2014-12-01 21:55 ` [Buildroot] [PATCHv2 01/12] toolchain-external: instrument wrapper to warn about unsafe paths Thomas Petazzoni
2014-12-06 16:57 ` Romain Naour [this message]
2014-12-01 21:55 ` [Buildroot] [PATCHv2 02/12] binutils/2.24: add patch to warn about unsafe library paths Thomas Petazzoni
2014-12-08 22:51 ` Romain Naour
2014-12-01 21:55 ` [Buildroot] [PATCHv2 03/12] binutils/2.23: " Thomas Petazzoni
2014-12-06 17:23 ` Romain Naour
2014-12-08 21:55 ` Romain Naour
2014-12-08 22:51 ` Romain Naour
2014-12-01 21:55 ` [Buildroot] [PATCHv2 04/12] binutils/2.22: " Thomas Petazzoni
2014-12-08 22:51 ` Romain Naour
2014-12-01 21:55 ` [Buildroot] [PATCHv2 05/12] binutils/arc-4.8-R3: " Thomas Petazzoni
2014-12-08 22:58 ` Romain Naour
2014-12-01 21:55 ` [Buildroot] [PATCHv2 06/12] gcc/4.9: add patch to warn about unsafe header paths Thomas Petazzoni
2014-12-08 22:52 ` Romain Naour
2014-12-01 21:55 ` [Buildroot] [PATCHv2 07/12] gcc/4.8: " Thomas Petazzoni
2014-12-08 22:52 ` Romain Naour
2014-12-01 21:55 ` [Buildroot] [PATCHv2 08/12] gcc/arc-4.8-R3: " Thomas Petazzoni
2014-12-08 22:59 ` Romain Naour
2014-12-01 21:55 ` [Buildroot] [PATCHv2 09/12] gcc/4.7: " Thomas Petazzoni
2014-12-08 22:52 ` Romain Naour
2014-12-01 21:55 ` [Buildroot] [PATCHv2 10/12] gcc: enable poison system directories option Thomas Petazzoni
2014-12-01 21:55 ` [Buildroot] [PATCHv2 11/12] binutils: " Thomas Petazzoni
2014-12-08 22:55 ` Romain Naour
2014-12-01 21:55 ` [Buildroot] [PATCHv2 12/12] Add option for paranoid unsafe path checking Thomas Petazzoni
2014-12-06 17:08 ` Romain Naour
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54833583.4030700@openwide.fr \
--to=romain.naour@openwide.fr \
--cc=buildroot@busybox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox