[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[lintian] 01/04: checks/shared-libs: Exclude PIEs from shared library checks



This is an automated email from the git hooks/post-receive script.

jwilk pushed a commit to branch master
in repository lintian.

commit 492dc0d123840dbe4b22ce698bde69c2aa847688
Author: Jakub Wilk <jwilk@debian.org>
Date:   Thu Oct 20 19:31:28 2016 +0200

    checks/shared-libs: Exclude PIEs from shared library checks
    
    According to glibc upstream[*], DT_DEBUG can be used to distinguish
    normal shared libraries from position-independent executables. To be
    extra sure, we skip only those PIEs that have executable bit set and
    don't have a .so extension.
    
    [*] https://sourceware.org/ml/libc-alpha/2015-03/msg00605.html
---
 checks/shared-libs.pm                                 |  8 +++++++-
 debian/changelog                                      |  3 +++
 helpers/coll/objdump-info-helper                      |  2 +-
 lib/Lintian/Collect/Binary.pm                         |  2 +-
 t/tests/shared-libs-missing-soname/debian/Makefile    | 19 +++++++++++++++++++
 t/tests/shared-libs-missing-soname/debian/code.c      | 10 ++++++++++
 .../debian/debian/control.in                          | 14 ++++++++++++++
 t/tests/shared-libs-missing-soname/debian/main.c      |  4 ++++
 t/tests/shared-libs-missing-soname/desc               |  6 ++++++
 t/tests/shared-libs-missing-soname/tags               |  1 +
 10 files changed, 66 insertions(+), 3 deletions(-)

diff --git a/checks/shared-libs.pm b/checks/shared-libs.pm
index 00d019e..93dfbed 100644
--- a/checks/shared-libs.pm
+++ b/checks/shared-libs.pm
@@ -77,7 +77,13 @@ sub run {
         next if not $file->is_file;
         my $fileinfo = $file->file_info;
         if ($fileinfo =~ m/^[^,]*\bELF\b/ && $fileinfo =~ m/shared object/) {
-            $sharedobject{$file} = 1;
+            my $perm = $file->operm;
+            my $debug = defined $objdump->{$file}{DEBUG};
+            if ($debug and $perm & 0111 and $file !~ m/\.so(?:\.|$)/) {
+                # position-independent executable
+            } else {
+                $sharedobject{$file} = 1;
+            }
         }
     }
 
diff --git a/debian/changelog b/debian/changelog
index b4bbd53..7b8e841 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -16,6 +16,9 @@ lintian (2.5.49) UNRELEASED; urgency=medium
   * checks/shared-libs.pm:
     + [JW] Don't complain about executable bit for ld.so shipped in
       multi-arch directories.
+    + [JW] Don't complain about missing SONAME for position-independent
+      executables.  Thanks to Reuben Thomas for the bug report.
+      (Closes: #731987)
   * checks/source-copyright.pm:
     + [RA, JW] Fix handling punctuation characters in license expressions
       in machine-readable copyright files.  (Closes: #841356)
diff --git a/helpers/coll/objdump-info-helper b/helpers/coll/objdump-info-helper
index 0690cb6..b738e6f 100755
--- a/helpers/coll/objdump-info-helper
+++ b/helpers/coll/objdump-info-helper
@@ -173,7 +173,7 @@ while (my $line = <$readelf>) {
             $value =~ s/.*\[//;
             $value =~ s/\]\s*$//;
             $keep = 1;
-        } elsif ($type eq 'TEXTREL') {
+        } elsif ($type eq 'TEXTREL' or $type eq 'DEBUG') {
             $keep = 1;
         } elsif ($type eq 'FLAGS_1') {
             # Will contain "NOW" if the binary was built with -Wl,-z,now
diff --git a/lib/Lintian/Collect/Binary.pm b/lib/Lintian/Collect/Binary.pm
index a351575..075e5bf 100644
--- a/lib/Lintian/Collect/Binary.pm
+++ b/lib/Lintian/Collect/Binary.pm
@@ -424,7 +424,7 @@ sub objdump_info {
                 }
             } elsif ($header eq 'NEEDED' or $header eq 'SONAME') {
                 push @{ $info{$header} }, $val;
-            } elsif ($header eq 'TEXTREL') {
+            } elsif ($header eq 'TEXTREL' or $header eq 'DEBUG') {
                 $info{$header} = 1;
             } elsif ($header eq 'FLAGS_1') {
                 for my $flag (split(m/\s++/, $val)) {
diff --git a/t/tests/shared-libs-missing-soname/debian/Makefile b/t/tests/shared-libs-missing-soname/debian/Makefile
new file mode 100644
index 0000000..2c8bd5e
--- /dev/null
+++ b/t/tests/shared-libs-missing-soname/debian/Makefile
@@ -0,0 +1,19 @@
+CFLAGS += -fPIC
+
+all: libhallo.so hallohelper
+
+libhallo.so: code.o
+	$(LINK.c) -o $@ -shared $^ -lc
+
+hallohelper: main.o
+	$(LINK.c) -o $@ -pie $^ -lc
+
+clean:
+	rm -f *.a *.o *.so *helper
+
+install: all
+	install -m 0755 -d $(DESTDIR)/usr/lib
+	install -m 0644 *.so $(DESTDIR)/usr/lib
+	install -m 0755 *helper $(DESTDIR)/usr/lib
+
+.PHONY: install clean
diff --git a/t/tests/shared-libs-missing-soname/debian/code.c b/t/tests/shared-libs-missing-soname/debian/code.c
new file mode 100644
index 0000000..65887f3
--- /dev/null
+++ b/t/tests/shared-libs-missing-soname/debian/code.c
@@ -0,0 +1,10 @@
+#include <stdlib.h>
+#include <math.h>
+
+double e(void (*f)(char *)){
+  char tmp[10];
+  double x;
+  f(tmp);
+  x = atof(tmp);
+  return exp(x);
+}
diff --git a/t/tests/shared-libs-missing-soname/debian/debian/control.in b/t/tests/shared-libs-missing-soname/debian/debian/control.in
new file mode 100644
index 0000000..a1b78c3
--- /dev/null
+++ b/t/tests/shared-libs-missing-soname/debian/debian/control.in
@@ -0,0 +1,14 @@
+Source: {$source}
+Priority: extra
+Section: libs
+Maintainer: {$author}
+Standards-Version: {$standards_version}
+Build-Depends: {$build_depends}
+
+Package: libhallo1
+Architecture: any
+Depends: $\{shlibs:Depends\}, $\{misc:Depends\}
+Description: {$description}
+ This is a test package designed to exercise some feature or tag of
+ Lintian.  It is part of the Lintian test suite and may do very odd
+ things.  It should not be installed like a regular package.
diff --git a/t/tests/shared-libs-missing-soname/debian/main.c b/t/tests/shared-libs-missing-soname/debian/main.c
new file mode 100644
index 0000000..832667c
--- /dev/null
+++ b/t/tests/shared-libs-missing-soname/debian/main.c
@@ -0,0 +1,4 @@
+int main(int argc, char **argv)
+{
+  return 42;
+}
diff --git a/t/tests/shared-libs-missing-soname/desc b/t/tests/shared-libs-missing-soname/desc
new file mode 100644
index 0000000..026cf7b
--- /dev/null
+++ b/t/tests/shared-libs-missing-soname/desc
@@ -0,0 +1,6 @@
+Testname: shared-libs-missing-soname
+Version: 1.0
+Test-Depends: debhelper (>= 9.20151004~)
+Description: Test for shlib without SONAME
+Test-For:
+ sharedobject-in-library-directory-missing-soname
diff --git a/t/tests/shared-libs-missing-soname/tags b/t/tests/shared-libs-missing-soname/tags
new file mode 100644
index 0000000..9bdfed9
--- /dev/null
+++ b/t/tests/shared-libs-missing-soname/tags
@@ -0,0 +1 @@
+E: libhallo1: sharedobject-in-library-directory-missing-soname usr/lib/libhallo.so

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/lintian/lintian.git


Reply to: