Patchwork [1/1] UBUNTU: SAUCE: headers_install: fix #include "..." usage for userspace

login
register
mail settings
Submitter Andy Whitcroft
Date Sept. 16, 2011, 12:20 p.m.
Message ID <1316175631-1728-2-git-send-email-apw@canonical.com>
Download mbox | patch
Permalink /patch/114921/
State New
Headers show

Comments

Andy Whitcroft - Sept. 16, 2011, 12:20 p.m.
When headers are converted to userspace headers they may include
relative includes.  For example x86 has the following in its
asm/posix_types.h:

    # ifdef __i386__
    #  include "posix_types_32.h"
    # else
    #  include "posix_types_64.h"
    # endif

However this is not safe in the face of the gcc option -I- which removes
"the directory the file I am being included from" from the search list.

Convert these references to <dir/...> form avoiding this.

BugLink: http://bugs.launchpad.net/bugs/824377
Signed-off-by: Andy Whitcroft <apw@canonical.com>
---
 scripts/Makefile.headersinst |    4 ++--
 scripts/headers_install.pl   |    8 +++++++-
 2 files changed, 9 insertions(+), 3 deletions(-)
Leann Ogasawara - Sept. 16, 2011, 5:03 p.m.
On Fri, 2011-09-16 at 13:20 +0100, Andy Whitcroft wrote:
> When headers are converted to userspace headers they may include
> relative includes.  For example x86 has the following in its
> asm/posix_types.h:
> 
>     # ifdef __i386__
>     #  include "posix_types_32.h"
>     # else
>     #  include "posix_types_64.h"
>     # endif
> 
> However this is not safe in the face of the gcc option -I- which removes
> "the directory the file I am being included from" from the search list.
> 
> Convert these references to <dir/...> form avoiding this.
> 
> BugLink: http://bugs.launchpad.net/bugs/824377
> Signed-off-by: Andy Whitcroft <apw@canonical.com>

Signed-off-by: Leann Ogasawara <leann.ogasawara@canonical.com>

Applied to Oneiric master-next.

Thanks,
Leann

> ---
>  scripts/Makefile.headersinst |    4 ++--
>  scripts/headers_install.pl   |    8 +++++++-
>  2 files changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst
> index a57f5bd..b4018c5 100644
> --- a/scripts/Makefile.headersinst
> +++ b/scripts/Makefile.headersinst
> @@ -50,8 +50,8 @@ printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@))
>  quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
>                              file$(if $(word 2, $(all-files)),s))
>        cmd_install = \
> -        $(PERL) $< $(srctree)/$(obj) $(install) $(SRCARCH) $(header-y); \
> -        $(PERL) $< $(objtree)/$(obj) $(install) $(SRCARCH) $(objhdr-y); \
> +        $(PERL) $< $(srctree)/$(obj) $(install) $(SRCARCH) $(printdir) $(header-y); \
> +        $(PERL) $< $(objtree)/$(obj) $(install) $(SRCARCH) $(printdir) $(objhdr-y); \
>          for F in $(wrapper-files); do                                   \
>                  echo "\#include <asm-generic/$$F>" > $(install)/$$F;    \
>          done;                                                           \
> diff --git a/scripts/headers_install.pl b/scripts/headers_install.pl
> index efb3be1..0425f5f 100644
> --- a/scripts/headers_install.pl
> +++ b/scripts/headers_install.pl
> @@ -18,7 +18,9 @@
>  
>  use strict;
>  
> -my ($readdir, $installdir, $arch, @files) = @ARGV;
> +my ($readdir, $installdir, $arch, $printdir, @files) = @ARGV;
> +
> +$printdir =~ s@^include/@@;
>  
>  my $unifdef = "scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__";
>  
> @@ -30,6 +32,10 @@ foreach my $file (@files) {
>  	open(my $out, '>', $tmpfile)
>  	    or die "$tmpfile: $!\n";
>  	while (my $line = <$in>) {
> +		# Any #include which uses "" and does not have a path needs
> +		# rewriting so that the resultant user space headers are
> +		# safe against the use of -I-.
> +		$line =~ s/^(\s*#\s*include\s+)"([^\/]*?)"/$1<$printdir\/$2>/;
>  		$line =~ s/([\s(])__user\s/$1/g;
>  		$line =~ s/([\s(])__force\s/$1/g;
>  		$line =~ s/([\s(])__iomem\s/$1/g;
> -- 
> 1.7.4.1
> 
>

Patch

diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst
index a57f5bd..b4018c5 100644
--- a/scripts/Makefile.headersinst
+++ b/scripts/Makefile.headersinst
@@ -50,8 +50,8 @@  printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@))
 quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
                             file$(if $(word 2, $(all-files)),s))
       cmd_install = \
-        $(PERL) $< $(srctree)/$(obj) $(install) $(SRCARCH) $(header-y); \
-        $(PERL) $< $(objtree)/$(obj) $(install) $(SRCARCH) $(objhdr-y); \
+        $(PERL) $< $(srctree)/$(obj) $(install) $(SRCARCH) $(printdir) $(header-y); \
+        $(PERL) $< $(objtree)/$(obj) $(install) $(SRCARCH) $(printdir) $(objhdr-y); \
         for F in $(wrapper-files); do                                   \
                 echo "\#include <asm-generic/$$F>" > $(install)/$$F;    \
         done;                                                           \
diff --git a/scripts/headers_install.pl b/scripts/headers_install.pl
index efb3be1..0425f5f 100644
--- a/scripts/headers_install.pl
+++ b/scripts/headers_install.pl
@@ -18,7 +18,9 @@ 
 
 use strict;
 
-my ($readdir, $installdir, $arch, @files) = @ARGV;
+my ($readdir, $installdir, $arch, $printdir, @files) = @ARGV;
+
+$printdir =~ s@^include/@@;
 
 my $unifdef = "scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__";
 
@@ -30,6 +32,10 @@  foreach my $file (@files) {
 	open(my $out, '>', $tmpfile)
 	    or die "$tmpfile: $!\n";
 	while (my $line = <$in>) {
+		# Any #include which uses "" and does not have a path needs
+		# rewriting so that the resultant user space headers are
+		# safe against the use of -I-.
+		$line =~ s/^(\s*#\s*include\s+)"([^\/]*?)"/$1<$printdir\/$2>/;
 		$line =~ s/([\s(])__user\s/$1/g;
 		$line =~ s/([\s(])__force\s/$1/g;
 		$line =~ s/([\s(])__iomem\s/$1/g;