lintian-2.5.22ubuntu1/ 0000775 0000000 0000000 00000000000 12315530763 011461 5 ustar lintian-2.5.22ubuntu1/.perlcriticrc 0000664 0000000 0000000 00000005255 12311317074 014150 0 ustar # -*- conf -*-
# FIXME: the list of checks should probably be moved to
# t/scripts/critic.pl. Line continuations are not supported here
verbose = 1
# Severity is actually ignored for our main purposes, see below
severity = 1
# Work based on a whitelist
only = 1
# Our whitelist (ignores severity):
include = ExplicitReturnUndef GlobFunction NegativeIndices PrivateVars UselessInitialization MatchVars NumberSeparators NullStatements LongChainsOfMethodCalls UseStrict UseWarnings EndWithOne ConditionalUseStatements PackageMatchesPodName JoinedReadline UnreachableCode TrailingWhitespace InterpolationOfLiterals ImplicitNewlines CommaSeparatedStatements UseStrict UseWarnings UnusedVariables UnusedCapture TwoArgOpen ProhibitHardTabs MismatchedOperators IndirectSyntax Modules:: BuiltinFunctions:: ClassHierarchies:: CommaSeparatedStatements QuotesAsQuotelikeOperatorDelimiters MixedBooleanOperators ProhibitBarewordFileHandles ConditionalUseStatements Tidy
#include = MixedBooleanOperators InteractiveTest UpperCaseHeredoc ReusedNames PackageVars ConditionalDeclarations SingleCharAlternation FixedStringMatches ConditionalUseStatements QuotedWordLists
exclude = RequireFilenameMatchesPackage RequireVersionVar ProhibitExcessMainComplexity ProhibitStringySplit ComplexMappings StringyEval
# If you want to try some other stuff, uncomment the following
# (exclude is an incomplete list of things we probably won't change)
# theme = security || bugs || complexity || maintenance
# exclude = ExtendedFormat LineBoundaryMatch DotMatchAnything AutomaticExportation BuiltinHomonyms FinalReturn PunctuationVars InitializationForLocalVars UnusualDelimiters RcsKeywords
# even more stuff if theme is empty
# Would be nice to fix at some point:
# include = ProhibitBarewordFileHandles
criticism-fatal = 1
color = 1
allow-unsafe = 1
[BuiltinFunctions::ProhibitBooleanGrep]
[InputOutput::RequireCheckedSyscalls]
functions = open opendir chdir read readdir readline closedir sysopen sysread sysclose mkdir link pipe readlink unlink rename symlink fork
# possible TODO close
# Checks and collections blow up
[-Modules::RequireFilenameMatchesPackage]
# We don't use package versions atm and even if we did, it probably
# won't have full coverage anyway.
[-Modules::RequireVersionVar]
# Maybe some day...
[-Modules::ProhibitExcessMainComplexity]
[Subroutines::RequireFinalReturn]
terminal_funcs = CORE::exec fail Lintian::Util::fail Die error
[ValuesAndExpressions::ProhibitInterpolationOfLiterals]
[ValuesAndExpressions::ProhibitCommaSeparatedStatements]
allow_last_statement_to_be_comma_separated_in_map_and_grep = 1
[-ValuesAndExpressions::ProhibitConstantPragma]
[Variables::RequireLocalizedPunctuationVars]
allow = %ENV %SIG $! $?
lintian-2.5.22ubuntu1/checks/ 0000775 0000000 0000000 00000000000 12314366011 012711 5 ustar lintian-2.5.22ubuntu1/checks/changes-file.desc 0000664 0000000 0000000 00000010264 12153060143 016077 0 ustar Check-Script: changes-file
Abbrev: chng
Type: changes
Info: This script checks for various problems with .changes files
Tag: malformed-changes-file
Severity: serious
Certainty: certain
Info: There is no "Format" field in your .changes file. This probably
indicates some serious problem with the file. Perhaps it's not actually
a changes file, or it's not in the proper format, or it's PGP-signed
twice.
.
Since Lintian was unable to parse this .changes file, any further checks
on it were skipped.
Ref: policy 5.5
Tag: no-description-in-changes-file
Severity: serious
Certainty: certain
Info: There is no "Description" field in your .changes file. A
description is mandatory and is usually constructed from the descriptions
in the control file of the package by the package build tools.
Ref: policy 5.5
Tag: bad-distribution-in-changes-file
Severity: important
Certainty: certain
Info: You've specified an unknown target distribution for your upload in
the debian/changelog file. It is possible that you are uploading
for a different distribution than the one Lintian is checking for. In
that case, passing --profile $VENDOR may fix this warning.
.
Note that the distributions non-free and contrib are no
longer valid. You'll have to use distribution unstable and
Section: non-free/xxx or Section: contrib/xxx instead.
Ref: policy 5.6.14
Tag: multiple-distributions-in-changes-file
Severity: important
Certainty: possible
Info: You've specified more than one target distribution for your upload
in the *.changes file, probably via the most recent entry in the
debian/changelog file.
.
Although this syntax is valid, it is not accepted by the Debian archive
management software. This may not be a problem if this upload is
targeted at an archive other than Debian's.
Ref: policy 5.6.14
Tag: no-urgency-in-changes-file
Severity: normal
Certainty: certain
Info: There is no "Urgency" field in the .changes file. This field is
recommended by policy and is usually derived from the first line of the
most recent changelog entry by the package build tools.
Ref: policy 5.5
Tag: bad-urgency-in-changes-file
Severity: important
Certainty: certain
Info: The keyword value of the "Urgency" field in the .changes file is not
one of the allowed values of low, medium, high, critical, and emergency
(case-insensitive). This value normally taken from the first line of the
most recent entry in debian/changelog, which is probably where
the error is.
Ref: policy 5.6.17
Tag: file-size-mismatch-in-changes-file
Severity: serious
Certainty: certain
Info: The actual file size does not match what's listed in the
.changes file.
Ref: policy 5.6.21, policy 5.6.24
Tag: checksum-mismatch-in-changes-file
Severity: serious
Certainty: certain
Info: The actual checksum does not match what's listed in the
.changes file.
Ref: policy 5.6.21, policy 5.6.24
Tag: bad-section-in-changes-file
Severity: important
Certainty: certain
Info: The sections non-free and contrib are no longer
valid. Please use section non-free/xxx or
contrib/xxx instead.
Ref: policy 2.4
Tag: changed-by-name-missing
Severity: serious
Certainty: certain
Info: The Changed-By field seems to contain just an email address. It must
contain the package maintainer's name and email address.
Ref: policy 5.6.4
Tag: changed-by-address-missing
Severity: serious
Certainty: certain
Info: The Changed-By field should contain the package builder's name and
email address, with the name followed by the address inside angle
brackets (< and >). The address seems to be missing.
Ref: policy 5.6.4
Tag: changed-by-address-malformed
Severity: important
Certainty: certain
Info: The Changed-By field could not be parsed according to the rules in
the Policy Manual.
Ref: policy 5.6.4
Tag: changed-by-address-looks-weird
Severity: normal
Certainty: possible
Info: The Changed-By field does not have whitespace between the name
and the email address.
Tag: changed-by-address-is-on-localhost
Severity: important
Certainty: certain
Info: The Changed-By address includes localhost(.localdomain), which is
an invalid e-mail address.
Ref: policy 5.6.2
lintian-2.5.22ubuntu1/checks/java.pm 0000664 0000000 0000000 00000020633 12311317612 014174 0 ustar # java -- lintian check script -*- perl -*-
# Copyright (C) 2011 Vincent Fourmond
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::java;
use strict;
use warnings;
use autodie;
use List::MoreUtils qw(any none);
use Lintian::Tags qw(tag);
use Lintian::Util qw(normalize_pkg_path);
sub run {
my ($pkg, undef, $info) = @_;
my $java_info = $info->java_info;
my $missing_jarwrapper = 0;
my $need_cp = 0;
my $has_public_jars = 0;
my $has_jars = 0;
my $jmajlow = '-';
my $depends = $info->relation('strong')->unparse();
# Remove all libX-java-doc packages to avoid thinking they are java libs
# - note the result may not be a valid dependency listing
$depends =~ s/lib[^\s,]+-java-doc//go;
my @java_lib_depends = ($depends =~ m/\b(lib[^\s,]+-java)\b/og);
$need_cp = 1 if @java_lib_depends;
# We first loop over jar files to find problems
for my $jar_file (sort keys %{$java_info}) {
my $files = $java_info->{$jar_file}->{files};
my $manifest = $java_info->{$jar_file}->{manifest};
my $operm = $info->index($jar_file)->operm;
my $jar_dir;
my $classes = 0;
my $datafiles = 1;
my $cp = '';
my $bsname = '';
if (exists $java_info->{$jar_file}->{error}) {
tag 'zip-parse-error', "$jar_file:",
$java_info->{$jar_file}->{error};
next;
}
# The Java Policy says very little about requires for (jars in) JVMs
next if $jar_file =~ m#usr/lib/jvm(?:-exports)?/[^/]++/#o;
# Ignore Mozilla's jar files, see #635495
next if $jar_file =~ m#usr/lib/xul(?:-ext|runner[^/]*+)/#o;
$jar_dir = $jar_file;
$jar_dir =~ s,[^/]+$,,o;
$has_jars = 1;
if($jar_file =~ m#^usr/share/java/[^/]+\.jar$#o) {
$has_public_jars = 1;
}
# check for common code files like .class or .clj (Clojure files)
foreach my $class (grep { m/\.(?:class|clj)$/oi } sort keys %{$files}){
my $mver = $files->{$class};
$classes = 1;
next if $class =~ m/\.clj$/;
# .class but no major version?
next if $mver eq '-';
if ($mver <= 44 or $mver >= 52) {
# First public major version was 45 (Java1), latest
# version is 51 (Java7).
tag 'unknown-java-class-version', $jar_file,
"($class -> $mver)";
# Skip the rest of this Jar.
last;
}
# Collect the "lowest" Class version used. We assume that
# mixed class formats implies special compat code for certain
# JVM cases.
if ($jmajlow eq '-') {
# first;
$jmajlow = $mver;
} else {
$jmajlow = $mver if $mver < $jmajlow;
}
}
$datafiles = 0
if none { m/\.(?:xml|properties|x?html|xhp)$/io } keys %$files;
if($operm & 0111) {
# Executable ?
tag 'executable-jar-without-main-class', $jar_file
unless $manifest && $manifest->{'Main-Class'};
# Here, we need to check that the package depends on
# jarwrapper.
$missing_jarwrapper = 1
unless $info->relation('strong')->implies('jarwrapper');
} elsif ($jar_file !~ m#^usr/share/#) {
tag 'jar-not-in-usr-share', $jar_file;
}
$cp = $manifest->{'Class-Path'}//'' if $manifest;
$bsname = $manifest->{'Bundle-SymbolicName'}//'' if $manifest;
if ($manifest) {
if (!$classes) {
# Eclipse / OSGi bundles are sometimes source bundles
# these do not ship classes but java files and other sources.
# Javadoc jars deployed in the Maven repository also do not ship
# classes but HTML files, images and CSS files
if ((
$bsname !~ m/\.source$/o
&& $jar_file!~ m#^usr/share/maven-repo/.*-javadoc\.jar#
)
|| $cp
) {
tag 'codeless-jar', $jar_file;
}
}
} elsif ($classes) {
tag 'missing-manifest', $jar_file;
}
if (!$cp) {
# Do we have OSGi instead?
$need_cp = 0 if $bsname;
# Maybe it is a maven plugin?
$need_cp = 0
if $need_cp
&& any { m,^META-INF/maven/plugin.xml$,io } keys %$files;
} else {
# Only run the tests when a classpath is present
my @relative = ();
my @paths = split(m/\s++/o, $cp);
$need_cp = 0;
for my $p (@paths) {
if ($p) {
# Strip leading ./
$p =~ s#^\./++##og;
if ($p !~ m#^(?:file://)?/#o and $p =~ m#/#o) {
my $target = normalize_pkg_path($jar_dir, $p);
my $tinfo;
# Can it be normalized?
next unless defined($target);
# Relative link to usr/share/java ? Works if
# we are depending of a Java library.
next
if $target =~ m,^usr/share/java/[^/]+.jar$,o
and @java_lib_depends;
$tinfo = $info->index($target);
# Points to file or link in this package,
# which is sometimes easier than
# re-writing the classpath.
next
if defined $tinfo
and ($tinfo->is_symlink or $tinfo->is_file);
# Relative path with subdirectories.
push @relative, $p;
}
# @todo add an info tag for relative paths, to educate
# maintainers ?
}
}
tag 'classpath-contains-relative-path',
"$jar_file: " . join(', ', @relative)
if @relative;
}
}
tag 'missing-dep-on-jarwrapper' if $missing_jarwrapper;
if ($jmajlow ne '-') {
# Byte code numbers:
# 45-49 -> Java1 - Java5 (Always ok)
# 50 -> Java6
# 51 -> Java7
my $bad = 0;
# If the lowest version used is:
$bad = 1 if $jmajlow == 51; # Java7 - consider bad per request.
# Technically we ought to do some checks with Java6 class files and
# dependencies/package types, but for now just skip that. (See #673276)
if ($bad) {
# Map the Class version to a Java version.
my $v = $jmajlow - 44;
tag 'incompatible-java-bytecode-format',
"Java${v} version (Class format: $jmajlow)";
}
}
if ($has_jars && $need_cp) {
# Only tag if there is at least one jar file and one strong
# java dependency and no classpath/osgi. Technically there
# should be no reason to have a strong relation with a java
# library without having a jar file, but we ignore some jars
# (e.g. in JVMs) so going safe here.
tag 'missing-classpath', join(', ', @java_lib_depends);
}
if (!$has_public_jars && $pkg =~ /^lib[^\s,]+-java$/) {
# Skip this if it installs a symlink in usr/share/java
return if any { m@^usr/share/java/[^/]+\.jar$@o } $info->sorted_index;
tag 'javalib-but-no-public-jars';
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/standards-version.desc 0000664 0000000 0000000 00000005602 12153060144 017221 0 ustar Check-Script: standards-version
Author: Christian Schwarz
Abbrev: std
Type: source
Info: This script checks if a source package contains a valid
Standards-Version field.
Needs-Info: debfiles
Tag: no-standards-version-field
Severity: important
Certainty: certain
Ref: policy 5.6.11
Info: The source package does not have a Standards-Version control field.
Please update your package to latest Policy and set this control field
appropriately.
Tag: invalid-standards-version
Severity: important
Certainty: certain
Info: The source package refers to a Standards-Version which never
existed. Please update your package to latest Policy and set this
control field appropriately.
Tag: newer-standards-version
Severity: normal
Certainty: certain
Info: The source package refers to a Standards-Version which is
newer than the highest one lintian is programmed to check. If the source
package is correct, then please upgrade lintian to the newest version.
(If there is no newer lintian version, then please bug &maint; to make
one.)
Tag: ancient-standards-version
Severity: normal
Certainty: certain
Ref: http://www.debian.org/doc/debian-policy/upgrading-checklist
Info: The source package refers to a Standards-Version that has been
obsolete for more than two years. Please update your package to latest
Policy and set this control field appropriately.
.
If the package is already compliant with the current standards, you don't
have to re-upload the package just to adjust the Standards-Version
control field. However, please remember to update this field next time
you upload the package.
.
See /usr/share/doc/debian-policy/upgrading-checklist.txt.gz in
the debian-policy package for a summary of changes in newer versions of
Policy.
Tag: out-of-date-standards-version
Severity: normal
Certainty: certain
Ref: http://www.debian.org/doc/debian-policy/upgrading-checklist
Info: The source package refers to a Standards-Version older than the one
that was current at the time the package was created (according to the
timestamp of the latest debian/changelog entry). Please
consider updating the package to current Policy and setting this control
field appropriately.
.
If the package is already compliant with the current standards, you don't
have to re-upload the package just to adjust the Standards-Version
control field. However, please remember to update this field next time
you upload the package.
.
See /usr/share/doc/debian-policy/upgrading-checklist.txt.gz in
the debian-policy package for a summary of changes in newer versions of
Policy.
Tag: timewarp-standards-version
Severity: normal
Certainty: certain
Info: The source package refers to a Standards-Version that was released
after the date of the most recent debian/changelog entry.
Perhaps you forgot to update the timestamp in debian/changelog
before building the package?
lintian-2.5.22ubuntu1/checks/group-checks.pm 0000664 0000000 0000000 00000021636 12311317610 015647 0 ustar # group-checks -- lintian check script -*- perl -*-
# Copyright (C) 2011 Niels Thykier
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::group_checks;
use strict;
use warnings;
use autodie;
use Lintian::Data;
use Lintian::Relation;
use Lintian::Tags qw(tag);
my $KNOWN_PRIOS = Lintian::Data->new('common/priorities', qr/\s*=\s*/o);
sub run {
my (undef, undef, $info, undef, $group) = @_;
## To find circular dependencies, we will first generate Strongly
## Connected Components using Tarjan's algorithm
##
## We are not using DepMap, because it cannot tell how the circles
## are made - only that there exists at least 1 circle.
# The packages a.k.a. nodes
my @nodes = ();
my %edges = ();
my $sccs;
my $ginfo = $group->info;
my @procs = $group->get_processables('binary');
_check_file_overlap(@procs);
foreach my $proc (@procs) {
my $deps = $ginfo->direct_dependencies($proc);
if (scalar @$deps > 0) {
# it depends on another package - it can cause
# a circular dependency
my $pname = $proc->pkg_name;
push @nodes, $pname;
$edges{$pname} = [map { $_->pkg_name } @$deps];
_check_priorities($proc, $deps);
_check_multiarch($proc, $deps);
}
}
# Bail now if we do not have at least two packages depending
# on some other package from this source.
return if scalar @nodes < 2;
$sccs = Lintian::group_checks::Graph->new(\@nodes, \%edges)->tarjans();
foreach my $comp (@$sccs) {
# It takes two to tango... erh. make a circular dependency.
next if scalar @$comp < 2;
tag 'intra-source-package-circular-dependency', sort @$comp;
}
return;
}
# Check that $proc has a priority that is less than or equal to that
# of its dependencies (Policy §2.5)
sub _check_priorities {
my ($proc, $deps) = @_;
my $priority = $proc->info->field('priority');
my $pkg_name = $proc->pkg_name;
if ($priority) {
my $prival = $KNOWN_PRIOS->value($priority);
foreach my $dep (@$deps) {
my $dpri = $dep->info->field('priority') // '';
my $dprival = $KNOWN_PRIOS->value($dpri);
# Ignore packages without priorities - we have a separate
# check for that.
next unless $dprival;
tag 'package-depends-on-lower-priority-package',
"$pkg_name:$priority", 'depends on', $dep->pkg_name . ":$dpri"
unless $prival <= $dprival;
}
}
return;
}
sub _check_file_overlap {
my (@procs) = @_;
# Sort them for stable output
my @sorted = sort { $a->pkg_name cmp $b->pkg_name } @procs;
for (my $i = 0 ; $i < scalar @sorted ; $i++) {
my $proc = $sorted[$i];
my $pinfo = $proc->info;
my @p = grep { $_ } split(m/,/o, $pinfo->field('provides', ''));
my $prov = Lintian::Relation->new(join(' |̈́ ', $proc->pkg_name, @p));
for (my $j = $i ; $j < scalar @sorted ; $j++) {
my $other = $sorted[$j];
my $oinfo = $other->info;
my @op = grep { $_ } split(m/,/o, $oinfo->field('provides', ''));
my $oprov
= Lintian::Relation->new(join(' | ', $other->pkg_name, @op));
# poor man's "Multi-arch: same" work-around.
next if $proc->pkg_name eq $other->pkg_name;
# $other conflicts/replaces with $proc
next if $oinfo->relation('conflicts')->implies($prov);
next if $oinfo->relation('replaces')->implies($proc->pkg_name);
# $proc conflicts/replaces with $other
next if $pinfo->relation('conflicts')->implies($oprov);
next if $pinfo->relation('replaces')->implies($other->pkg_name);
_overlap_check($proc, $pinfo, $other, $oinfo);
}
}
return;
}
sub _overlap_check {
my ($a_proc, $a_info, $b_proc, $b_info) = @_;
foreach my $a_file ($a_info->sorted_index) {
my $name = $a_file->name;
my $b_file;
$name =~ s,/$,,o;
$b_file = $b_info->index($name) // $b_info->index("$name/");
if ($b_file) {
next if $a_file->is_dir and $b_file->is_dir;
tag 'binaries-have-file-conflict', $a_proc->pkg_name,
$b_proc->pkg_name, $name;
}
}
return;
}
sub _check_multiarch {
my ($proc, $deps) = @_;
my $ma = $proc->info->field('multi-arch', 'no');
if ($ma eq 'same') {
foreach my $dep (@$deps) {
my $dma = $dep->info->field('multi-arch', 'no');
if ($dma eq 'same' or $dma eq 'foreign') {
1; # OK
} else {
tag 'dependency-is-not-multi-archified',
join(q{ },
$proc->pkg_name, 'depends on',
$dep->pkg_name, "(multi-arch: $dma)");
}
}
} elsif ($ma ne 'same'
and $proc->info->field('section', 'none') =~ m,(?:^|/)debug$,o) {
# Debug package that isn't M-A: same, exploit that (non-debug)
# dependencies is (almost certainly) a package for which the
# debug carries debug symbols.
foreach my $dep (@$deps) {
my $dma = $dep->info->field('multi-arch', 'no');
if ( $dma eq 'same'
and $dep->info->field('section', 'none') !~ m,(?:^|/)debug$,o){
# Debug package isn't M-A: same, but depends on a
# package that is from same source that isn't a debug
# package and that is M-A same. Thus it is not
# possible to install debug symbols for all
# (architecture) variants of the binaries.
tag 'debug-package-for-multi-arch-same-pkg-not-coinstallable',
$proc->pkg_name . ' => ' . $dep->pkg_name;
}
}
}
return;
}
## Encapsulate Tarjan's algorithm in an class/object to keep
## the run sub somewhat sane. Allow this "extra" package as
## it is not a proper subclass.
#<<< no Perl tidy (it breaks the no critic comment)
package Lintian::group_checks::Graph; ## no critic (Modules::ProhibitMultiplePackages)
#>>>
sub new {
my ($type, $nodes, $edges) = @_;
my $self = { nodes => $nodes, edges => $edges};
bless $self, $type;
return $self;
}
sub tarjans {
my ($self) = @_;
my $nodes = $self->{nodes};
$self->{index} = 0;
$self->{scc} = [];
$self->{stack} = [];
$self->{on_stack} = {};
# The information for each node:
# $self->{node_info}->{$node}->[X], where X is:
# 0 => index
# 1 => low_index
$self->{node_info} = {};
foreach my $node (@$nodes) {
$self->_tarjans_sc($node)
unless defined $self->{node_info}->{$node};
}
return $self->{scc};
}
sub _tarjans_sc {
my ($self, $node) = @_;
my $index = $self->{index};
my $stack = $self->{stack};
my $ninfo = [$index, $index];
my $on_stack = $self->{on_stack};
$self->{node_info}->{$node} = $ninfo;
$index++;
$self->{index} = $index;
push @$stack, $node;
$on_stack->{$node} = 1;
foreach my $neighbour (@{ $self->{edges}->{$node} }){
my $nb_info;
$nb_info = $self->{node_info}->{$neighbour};
if (!defined $nb_info){
# First time visit
$self->_tarjans_sc($neighbour);
# refresh $nb_info
$nb_info = $self->{node_info}->{$neighbour};
# min($node.low_index, $neigh.low_index)
$ninfo->[1] = $nb_info->[1] if $nb_info->[1] < $ninfo->[1];
} elsif (exists $on_stack->{$neighbour}) {
# Node is in this component
# min($node.low_index, $neigh.index)
$ninfo->[1] = $nb_info->[0] if $nb_info->[0] < $ninfo->[1];
}
}
if ($ninfo->[0] == $ninfo->[1]){
# the "root" node - create the SSC.
my $component = [];
my $scc = $self->{scc};
my $elem = '';
do {
$elem = pop @$stack;
delete $on_stack->{$elem};
push @$component, $elem;
} until $node eq $elem;
push @$scc, $component;
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/scripts.pm 0000664 0000000 0000000 00000141064 12311317620 014743 0 ustar # scripts -- lintian check script -*- perl -*-
#
# This is probably the right file to add a check for the use of
# set -e in bash and sh scripts.
#
# Copyright (C) 1998 Richard Braakman
# Copyright (C) 2002 Josip Rodin
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::scripts;
use strict;
use warnings;
use autodie;
use List::MoreUtils qw(any);
use Lintian::Check qw($known_shells_regex);
use Lintian::Data;
use Lintian::Relation;
use Lintian::Tags qw(tag);
use Lintian::Util qw(fail strip);
# This is a map of all known interpreters. The key is the interpreter
# name (the binary invoked on the #! line). The value is an anonymous
# array of two elements. The first argument is the path on a Debian
# system where that interpreter would be installed. The second
# argument is the dependency that provides that interpreter.
#
# $INTERPRETERS maps names of (unversioned) interpreters to the path
# they are installed and what package to depend on to use them.
#
my $INTERPRETERS = Lintian::Data->new('scripts/interpreters', qr/\s*=\>\s*/o,
\&_parse_interpreters);
# The more complex case of interpreters that may have a version number.
#
# This is a hash from the base interpreter name to a list. The base
# interpreter name may appear by itself or followed by some combination of
# dashes, digits, and periods.
#
# The list contains the following values:
# [, , , , ]
#
# Their meaning is documented in Lintian's scripts/versioned-interpreters
# file, though they are ordered differently and there are a few differences
# as described below:
#
# * has been passed through qr/^$/
# * If was left out, it has been substituted by the
# interpreter.
# * The magic values of are represented as:
# @NO_DEFAULT_DEPS@ -> '' (i.e. an empty string)
# @SKIP_UNVERSIONED@ -> undef (i.e the undefined value)
# * has been split into a list of versions.
# (e.g. "1.6 1.8" will be ["1.6", "1.8"])
#
# A full example is:
#
# data:
# lua => /usr/bin, lua([\d.]+), 'lua$1', 40 50 5.1
#
# $VERSIONED_INTERPRETERS->value ('lua') is
# [ '/usr/bin', 'lua', qr/^lua([\d.]+)$/, 'lua$1', ["40", "50", "5.1"] ]
#
my $VERSIONED_INTERPRETERS
= Lintian::Data->new('scripts/versioned-interpreters',
qr/\s*=\>\s*/o,\&_parse_versioned_interpreters);
# When detecting commands inside shell scripts, use this regex to match the
# beginning of the command rather than checking whether the command is at the
# beginning of a line.
my $LEADINSTR = '(?:(?:^|[`&;(|{])\s*|(?:if|then|do|while)\s+)';
my $LEADIN = qr/$LEADINSTR/;
#forbidden command in maintainer scripts
my $BAD_MAINT_CMD = Lintian::Data->new(
'scripts/maintainer-script-bad-command',
qr/\s*\~\~/,
sub {
my @sliptline = split(/\s*\~\~/, $_[1], 4);
if(scalar(@sliptline) != 4) {
fail 'Syntax error in scripts/maintainer-script-bad-command:', $.;
}
my ($incat,$exceptinpackage,$inscript,$regexp) = @sliptline;
$regexp =~ s/\${LEADIN}/$LEADINSTR/;
# allow empty $exceptinpackage and set it synonymous to check in all package
$exceptinpackage
= defined($exceptinpackage) ? strip($exceptinpackage) : '';
if (length($exceptinpackage) == 0) {
$exceptinpackage = '\a\Z';
}
# allow empty $inscript and set to synonymous to check in all script
$inscript = defined($inscript) ? strip($inscript) : '';
if (length($inscript) == 0) {
$inscript = '.*';
}
return {
# use not not to normalize boolean
'in_cat_string' => not(not(strip($incat))),
'in_package' => qr/$exceptinpackage/x,
'in_script' => qr/$inscript/x,
'regexp' => qr/$regexp/x,
};
});
# Any of the following packages can satisfy an update-inetd dependency.
my $update_inetd = join(
' | ', qw(update-inetd inet-superserver openbsd-inetd
inetutils-inetd rlinetd xinetd)
);
# Appearance of one of these regexes in a maintainer script means that there
# must be a dependency (or pre-dependency) on the given package. The tag
# reported is maintainer-script-needs-depends-on-%s, so be sure to update
# scripts.desc when adding a new rule.
my @depends_needed = (
[adduser => '\badduser\s'],
[gconf2 => '\bgconf-schemas\s'],
[$update_inetd => '\bupdate-inetd\s'],
[ucf => '\bucf\s'],
['xml-core' => '\bupdate-xmlcatalog\s'],
);
my @bashism_single_quote_regexs = (
$LEADIN . qr'echo\s+(?:-[^e\s]+\s+)?\'[^\']*(\\[abcEfnrtv0])+.*?[\']',
# unsafe echo with backslashes
$LEADIN . qr'source\s+[\"\']?(?:\.\/|\/|\$|[\w~.-])\S*',
# should be '.', not 'source'
);
my @bashism_string_regexs = (
qr'\$\[\w+\]', # arith not allowed
qr'\$\{\w+\:\d+(?::\d+)?\}', # ${foo:3[:1]}
qr'\$\{\w+(/.+?){1,2}\}', # ${parm/?/pat[/str]}
qr'\$\{\#?\w+\[[0-9\*\@]+\]\}',# bash arrays, ${name[0|*|@]}
qr'\$\{!\w+[\@*]\}', # ${!prefix[*|@]}
qr'\$\{!\w+\}', # ${!name}
qr'(\$\(|\`)\s*\<\s*\S+\s*(\)|\`)', # $(\< foo) should be $(cat foo)
qr'\$\{?RANDOM\}?\b', # $RANDOM
qr'\$\{?(OS|MACH)TYPE\}?\b', # $(OS|MACH)TYPE
qr'\$\{?HOST(TYPE|NAME)\}?\b', # $HOST(TYPE|NAME)
qr'\$\{?DIRSTACK\}?\b', # $DIRSTACK
qr'\$\{?EUID\}?\b', # $EUID should be "id -u"
qr'\$\{?UID\}?\b', # $UID should be "id -ru"
qr'\$\{?SECONDS\}?\b', # $SECONDS
qr'\$\{?BASH_[A-Z]+\}?\b', # $BASH_SOMETHING
qr'\$\{?SHELLOPTS\}?\b', # $SHELLOPTS
qr'\$\{?PIPESTATUS\}?\b', # $PIPESTATUS
qr'\$\{?SHLVL\}?\b', # $SHLVL
qr'<<<', # <<< here string
$LEADIN . qr'echo\s+(?:-[^e\s]+\s+)?\"[^\"]*(\\[abcEfnrtv0])+.*?[\"]',
# unsafe echo with backslashes
);
my @bashism_regexs = (
qr'(?:^|\s+)function \w+(\s|\(|\Z)', # function is useless
qr'(test|-o|-a)\s*[^\s]+\s+==\s', # should be 'b = a'
qr'\[\s+[^\]]+\s+==\s', # should be 'b = a'
qr'\s(\|\&)', # pipelining is not POSIX
qr'[^\\\$]\{(?:[^\s\\\}]*?,)+[^\\\}\s]*\}', # brace expansion
qr'(?:^|\s+)\w+\[\d+\]=', # bash arrays, H[0]
$LEADIN . qr'read\s+(?:-[a-qs-zA-Z\d-]+)',
# read with option other than -r
$LEADIN . qr'read\s*(?:-\w+\s*)*(?:\".*?\"|[\'].*?[\'])?\s*(?:;|$)',
# read without variable
qr'\&>', # cshism
qr'(<\&|>\&)\s*((-|\d+)[^\s;|)`&\\\\]|[^-\d\s]+)', # should be >word 2>&1
qr'\[\[(?!:)', # alternative test command
$LEADIN . qr'select\s+\w+', # 'select' is not POSIX
$LEADIN . qr'echo\s+(-n\s+)?-n?en?', # echo -e
$LEADIN . qr'exec\s+-[acl]', # exec -c/-l/-a name
qr'(?:^|\s+)let\s', # let ...
qr'(?]\(.*?\)', # <() process substituion
qr'(?:^|\s+)readonly\s+-[af]', # readonly -[af]
$LEADIN . qr'(sh|\$\{?SHELL\}?) -[rD]', # sh -[rD]
$LEADIN . qr'(sh|\$\{?SHELL\}?) --\w+', # sh --long-option
$LEADIN . qr'(sh|\$\{?SHELL\}?) [-+]O', # sh [-+]O
);
# a local function to help use separate tags for example scripts
sub script_tag {
my($tag, $filename, @rest) = @_;
$tag = "example-$tag"
if $filename and $filename =~ m,usr/share/doc/[^/]+/examples/,;
tag($tag, $filename, @rest);
return;
}
sub run {
my ($pkg, undef, $info) = @_;
my (%executable, %ELF, %scripts);
# no dependency for install-menu, because the menu package specifically
# says not to depend on it.
foreach my $file ($info->sorted_index) {
$ELF{$file} = 1 if $info->file_info($file) =~ /^[^,]*\bELF\b/o;
my $operm = $file->operm;
next unless $file->is_file and ($operm & 0111);
$executable{$file} = 1;
}
my $all_parsed = Lintian::Relation->and($info->relation('all'),
$info->relation('provides'),$pkg);
my $str_deps = $info->relation('strong');
for my $filename (sort keys %{$info->scripts}) {
my $interpreter = $info->scripts->{$filename}->{interpreter};
my $calls_env = $info->scripts->{$filename}->{calls_env};
my $path;
$scripts{$filename} = 1;
# Consider /usr/src/ scripts as "documentation"
# - packages containing /usr/src/ tend to be "-source" .debs
# and usually comes with overrides for most of the checks
# below.
# Supposedly, they could be checked as examples, but there is
# a risk that the scripts need substitution to be complete
# (so, syntax checking is not as reliable).
my $in_docs = $filename =~ m,^usr/(?:share/doc|src)/,;
my $in_examples = $filename =~ m,^usr/share/doc/[^/]+/examples/,;
# no checks necessary at all for scripts in /usr/share/doc/
# unless they are examples
next if $in_docs and not $in_examples;
my ($base) = $interpreter =~ m,([^/]*)$,;
# allow exception for .in files that have stuff like #!@PERL@
next
if ( $filename =~ m,\.in$,
and $interpreter =~ m,^(\@|<\<)[A-Z_]+(\@|>\>)$,);
my $is_absolute = ($interpreter =~ m,^/, or defined $calls_env);
# Skip files that have the #! line, but are not executable and
# do not have an absolute path and are not in a bin/ directory
# (/usr/bin, /bin etc). They are probably not scripts after
# all.
next
if ( $filename !~ m,(?:bin/|etc/init\.d/),
&& !$executable{$filename}
&& !$is_absolute
&& !$in_examples);
# Example directories sometimes contain Perl libraries, and
# some people use initial lines like #!perl or #!python to
# provide editor hints, so skip those too if they're not
# executable. Be conservative here, since it's not uncommon
# for people to both not set examples executable and not fix
# the path and we want to warn about that.
next
if ( $filename =~ /\.pm\z/
&& !$executable{$filename}
&& !$is_absolute
&& $in_examples);
if ($interpreter eq '') {
script_tag('script-without-interpreter', $filename);
next;
}
# Either they use an absolute path or they use '/usr/bin/env interp'.
script_tag('interpreter-not-absolute', $filename, "#!$interpreter")
unless $is_absolute;
tag 'script-not-executable', $filename
unless ($executable{$filename}
or $filename =~ m,^usr/(?:lib|share)/.*\.pm,
or $filename =~ m,^usr/(?:lib|share)/.*\.py,
or $filename =~ m,^usr/(?:lib|share)/ruby/.*\.rb,
or $filename =~ m,^usr/share/debconf/confmodule(?:\.sh)?$,
or $filename =~ m,\.in$,
or $filename =~ m,\.erb$,
or $filename =~ m,\.ex$,
or $filename eq 'etc/init.d/skeleton'
or $filename =~ m,^etc/menu-methods,
or $filename =~ m,^etc/X11/Xsession\.d,)
or $in_docs;
# Warn about csh scripts.
tag 'csh-considered-harmful', $filename
if ( ($base eq 'csh' or $base eq 'tcsh')
and $executable{$filename}
and $filename !~ m,^etc/csh/login\.d/,)
and not $in_docs;
$path = $info->unpacked($filename);
# Syntax-check most shell scripts, but don't syntax-check
# scripts that end in .dpatch. bash -n doesn't stop checking
# at exit 0 and goes on to blow up on the patch itself.
if ($base =~ /^$known_shells_regex$/) {
if (
-x $interpreter
and not script_is_evil_and_wrong($path)
and $filename !~ m,\.dpatch$,
and $filename !~ m,\.erb$,
# exclude some shells. zsh -n is broken, see #485885
and $base !~ m/^(?:z|t?c)sh$/
) {
if (check_script_syntax($interpreter, $path)) {
script_tag('shell-script-fails-syntax-check', $filename);
}
}
}
# Try to find the expected path of the script to check. First
# check $INTERPRETERS and %versioned_interpreters. If not
# found there, see if it ends in a version number and the base
# is found in $VERSIONED_INTERPRETERS
my $data = $INTERPRETERS->value($base);
my $versioned = 0;
if (not defined $data) {
$data = $VERSIONED_INTERPRETERS->value($base);
undef $data if ($data and not defined($data->[1]));
if (not defined($data) and $base =~ /^(.*[^\d.-])-?[\d.]+$/) {
$data = $VERSIONED_INTERPRETERS->value($1);
undef $data unless ($data and $base =~ /$data->[2]/);
}
$versioned = 1 if $data;
}
if ($data) {
my $expected = $data->[0] . '/' . $base;
unless ($interpreter eq $expected or defined $calls_env) {
script_tag('wrong-path-for-interpreter', $filename,
"(#!$interpreter != $expected)");
}
} elsif ($interpreter =~ m,/usr/local/,) {
script_tag('interpreter-in-usr-local', $filename,"#!$interpreter");
} elsif ($executable{'.' . $interpreter}) {
# Package installs the interpreter itself, so it's probably ok. Don't
# emit any tag for this.
} elsif ($interpreter eq '/bin/env') {
script_tag('script-uses-bin-env', $filename);
} else {
my $pinter = 0;
if ($interpreter =~ m,^/,) {
# Check if the package ships the interpreter (and it is
# executable).
my $interfile = substr $interpreter, 1;
my $index_info = $info->index($interfile);
$pinter = 1 if $index_info && ($index_info->operm & 0111);
}
script_tag('unusual-interpreter', $filename, "#!$interpreter")
unless $pinter;
}
# Check for obsolete perl libraries
if (
$base eq 'perl'
&&!$str_deps->implies(
'libperl4-corelibs-perl | perl (<< 5.12.3-7)')
) {
open(my $fd, '<', $path);
while (<$fd>) {
if (
m{ (?:do|require)\s+(?:'|") # do/require
# Huge list of perl4 modules...
(abbrev|assert|bigfloat|bigint|bigrat
|cacheout|complete|ctime|dotsh|exceptions
|fastcwd|find|finddepth|flush|getcwd|getopt
|getopts|hostname|importenv|look|newgetopt
|open2|open3|pwd|shellwords|stat|syslog
|tainted|termcap|timelocal|validate)
# ... so they end with ".pl" rather than ".pm"
\.pl(?:'|")
}xsm
) {
tag 'script-uses-perl4-libs-without-dep',
"$filename:$. ${1}.pl";
}
}
close($fd);
}
# If we found the interpreter and the script is executable,
# check dependencies. This should be the last thing we do in
# the loop so that we can use next for an early exit and
# reduce the nesting.
next unless ($data and $executable{$filename} and not $in_docs);
if (!$versioned) {
my $depends = $data->[1];
if (not defined $depends) {
$depends = $base;
}
if ($depends && !$all_parsed->implies($depends)) {
if ($base =~ /^(python|ruby|(m|g)awk)$/) {
tag("$base-script-but-no-$base-dep", $filename);
} elsif ($base eq 'csh' && $filename =~ m,^etc/csh/login\.d/,){
# Initialization files for csh.
} elsif ($base eq 'fish' && $filename =~ m,^etc/fish\.d/,) {
# Initialization files for fish.
} elsif (
$base eq 'ocamlrun'
&& $all_parsed->matches(
qr/^ocaml(?:-base)?(?:-nox)?-\d\.[\d.]+/)
) {
# ABI-versioned virtual packages for ocaml
} else {
tag 'missing-dep-for-interpreter', "$base => $depends",
"($filename)";
}
}
} elsif ($VERSIONED_INTERPRETERS->known($base)) {
my @versions = @{ $data->[4] };
my @depends = map {
my $d = $data->[3];
$d =~ s/\$1/$_/g;
$d;
} @versions;
unshift(@depends, $data->[1]) if length $data->[1];
my $depends = join(' | ', @depends);
unless ($all_parsed->implies($depends)) {
if ($base eq 'php') {
tag 'php-script-but-no-phpX-cli-dep', $filename;
} elsif ($base =~ /^(wish|tclsh)/) {
tag "$1-script-but-no-$1-dep", $filename;
} else {
tag 'missing-dep-for-interpreter', "$base => $depends",
"($filename)";
}
}
} else {
my ($version) = ($base =~ /$data->[2]/);
my $depends = $data->[3];
$depends =~ s/\$1/$version/g;
unless ($all_parsed->implies($depends)) {
if ($base =~ /^php/) {
tag 'php-script-but-no-phpX-cli-dep', $filename;
} elsif ($base =~ /^(python|ruby)/) {
tag "$1-script-but-no-$1-dep", $filename;
} else {
tag 'missing-dep-for-interpreter', "$base => $depends",
"($filename)";
}
}
}
}
foreach (keys %executable) {
my $index_info = $info->index($_);
my $ok = 0;
if ($index_info->is_hardlink) {
# We don't collect script information for hardlinks, so check
# if the target is a script.
my $target = $index_info->link_normalized;
if (exists $info->scripts->{$target}) {
$ok = 1;
}
}
tag 'executable-not-elf-or-script', $_
unless (
$ok
or $ELF{$_}
or $scripts{$_}
or $_ =~ m,^usr(?:/X11R6)?/man/,
or $_ =~ m/\.exe$/ # mono convention
or $_ =~ m/\.jar$/ # Debian Java policy 2.2
);
}
open(my $ctrl_fd, '<', $info->lab_data_path('control-scripts'));
# Handle control scripts. This is an edited version of the code for
# normal scripts above, because there were just enough differences to
# make a shared function awkward.
my %added_diversions;
my %removed_diversions;
my $expand_diversions = 0;
while (<$ctrl_fd>) {
chop;
m/^(\S*) (.*)$/ or fail("bad line in control-scripts file: $_");
my $interpreter = $1;
my $file = $2;
my $filename = $info->control($file);
$interpreter =~ m|([^/]*)$|;
my $base = $1;
if ($interpreter eq '') {
tag 'script-without-interpreter', "control/$file";
next;
}
tag 'interpreter-not-absolute', "control/$file", "#!$interpreter"
unless ($interpreter =~ m|^/|);
if ($interpreter =~ m|/usr/local/|) {
tag 'control-interpreter-in-usr-local', "control/$file",
"#!$interpreter";
} elsif ($base eq 'sh' or $base eq 'bash' or $base eq 'perl') {
my $expected = ($INTERPRETERS->value($base))->[0] . '/' . $base;
tag 'wrong-path-for-interpreter', "#!$interpreter != $expected",
"(control/$file)"
unless ($interpreter eq $expected);
} elsif ($file eq 'config') {
tag 'forbidden-config-interpreter', "#!$interpreter";
} elsif ($file eq 'postrm') {
tag 'forbidden-postrm-interpreter', "#!$interpreter";
} elsif ($INTERPRETERS->known($base)) {
my $data = $INTERPRETERS->value($base);
my $expected = $data->[0] . '/' . $base;
unless ($interpreter eq $expected) {
tag 'wrong-path-for-interpreter',
"#!$interpreter != $expected",
"(control/$file)";
}
tag 'unusual-control-interpreter', "control/$file",
"#!$interpreter";
# Interpreters used by preinst scripts must be in
# Pre-Depends. Interpreters used by postinst or prerm
# scripts must be in Depends.
unless (not $data->[1]) {
my $depends = Lintian::Relation->new($data->[1]);
if ($file eq 'preinst') {
unless ($info->relation('pre-depends')->implies($depends)){
tag 'preinst-interpreter-without-predepends',
"#!$interpreter";
}
} else {
unless ($info->relation('strong')->implies($depends)) {
tag 'control-interpreter-without-depends',
"control/$file",
"#!$interpreter";
}
}
}
} else {
tag 'unknown-control-interpreter', "control/$file",
"#!$interpreter";
next; # no use doing further checks if it's not a known interpreter
}
# perhaps we should warn about *csh even if they're somehow screwed,
# but that's not really important...
tag 'csh-considered-harmful', "control/$file"
if ($base eq 'csh' or $base eq 'tcsh');
my $shellscript = $base =~ /^$known_shells_regex$/ ? 1 : 0;
# Only syntax-check scripts we can check with bash.
my $checkbashisms;
if ($shellscript) {
$checkbashisms = $base eq 'sh' ? 1 : 0;
if ($base eq 'sh' or $base eq 'bash') {
if (check_script_syntax('/bin/bash', $filename)) {
tag 'maintainer-shell-script-fails-syntax-check', $file;
}
}
}
# now scan the file contents themselves
open(my $fd, '<', $filename);
my (
$saw_init, $saw_invoke, $saw_debconf,
$saw_bange, $saw_sete, $has_code
);
my %warned;
my $cat_string = '';
my $previous_line = '';
while (<$fd>) {
if ($. == 1 && $shellscript && m,/$base\s*.*\s-\w*e\w*\b,) {
$saw_bange = 1;
}
if (/\#DEBHELPER\#/) {
tag 'maintainer-script-has-unexpanded-debhelper-token', $file;
}
next if m,^\s*$,; # skip empty lines
next if m,^\s*\#,; # skip comment lines
$_ = remove_comments($_);
# Concatenate lines containing continuation character (\)
# at the end
if ($shellscript && /\\$/) {
s/\\//;
chomp;
$previous_line .= $_;
next;
}
chomp;
$_ = $previous_line . $_;
$previous_line = '';
# Don't consider the standard dh-make boilerplate to be code. This
# means ignoring the framework of a case statement, the labels, the
# echo complaining about unknown arguments, and an exit.
unless ($has_code
|| m/^\s*set\s+-\w+\s*$/
|| m/^\s*case\s+\"?\$1\"?\s+in\s*$/
|| m/^\s*(?:[a-z|-]+|\*)\)\s*$/
|| m/^\s*[:;]+\s*$/
|| m/^\s*echo\s+\"[^\"]+\"(?:\s*>&2)?\s*$/
|| m/^\s*esac\s*$/
|| m/^\s*exit\s+\d+\s*$/) {
$has_code = 1;
}
if ($shellscript
&& m,${LEADIN}set\s*(?:\s+-(?:-.*|[^e]+))*\s-\w*e,) {
$saw_sete = 1;
}
if ( m,[^\w](?:(?:/var)?/tmp|\$TMPDIR)/[^)\]}\s],
and not m/\bmks?temp\b/
and not m/\btempfile\b/
and not m/\bmkdir\b/
and not m/\$RANDOM/) {
#<<< no perltidy - tag name too long
tag 'possibly-insecure-handling-of-tmp-files-in-maintainer-script',
#>>>
"$file:$."
unless $warned{tmp};
$warned{tmp} = 1;
}
if (m/^\s*killall(?:\s|\z)/) {
tag 'killall-is-dangerous', "$file:$." unless $warned{killall};
$warned{killall} = 1;
}
if (m/^\s*mknod(?:\s|\z)/ and not m/\sp\s/) {
tag 'mknod-in-maintainer-script', "$file:$.";
}
# Collect information about init script invocations to
# catch running init scripts directly rather than through
# invoke-rc.d. Since the script is allowed to run the
# init script directly if invoke-rc.d doesn't exist, only
# tag direct invocations where invoke-rc.d is never used
# in the same script. Lots of false negatives, but
# hopefully not many false positives.
if (m%^\s*/etc/init\.d/(?:\S+)\s+[\"\']?(?:\S+)[\"\']?%) {
$saw_init = $.;
}
if (m%^\s*invoke-rc\.d\s+%) {
$saw_invoke = $.;
}
if ($shellscript) {
if ($cat_string ne '' and m/^\Q$cat_string\E$/) {
$cat_string = '';
}
my $within_another_shell = 0;
if (
m{
(?:^|\s+)(?:(?:/usr)?/bin/)?
($known_shells_regex)\s+-c\s*.+
}xsm
and $1 ne 'sh'
) {
$within_another_shell = 1;
}
# if cat_string is set, we are in a HERE document and need not
# check for things
if ( $cat_string eq ''
&& $checkbashisms
&& !$within_another_shell) {
my $found = 0;
my $match = '';
# since this test is ugly, I have to do it by itself
# detect source (.) trying to pass args to the command it runs
# The first expression weeds out '. "foo bar"'
if (
not $found
and not m{\A \s*\.\s+
(?:\"[^\"]+\"|\'[^\']+\')\s*
(?:\&|\||\d?>|<|;|\Z)}xsm
and m/^\s*(\.\s+[^\s;\`:]+\s+([^\s;]+))/
) {
my $extra;
($match, $extra) = ($1, $2);
if ($extra =~ /^(\&|\||\d?>|<)/) {
# everything is ok
;
} else {
$found = 1;
}
}
my $line = $_;
unless ($found) {
for my $re (@bashism_single_quote_regexs) {
if ($line =~ m/($re)/) {
$found = 1;
($match) = m/($re)/;
last;
}
}
}
# Ignore anything inside single quotes; it could be an
# argument to grep or the like.
# $cat_line contains the version of the line we'll check
# for heredoc delimiters later. Initially, remove any
# spaces between << and the delimiter to make the following
# updates to $cat_line easier.
my $cat_line = $line;
$cat_line =~ s/(<\<-?)\s+/$1/g;
# Remove single quoted strings, with the exception
# that we don't remove the string
# if the quote is immediately preceeded by a < or
# a -, so we can match "foo <<-?'xyz'" as a
# heredoc later The check is a little more greedy
# than we'd like, but the heredoc test itself will
# weed out any false positives
$cat_line
=~ s/(^|[^<\\\"-](?:\\\\)*)\'(?:\\.|[^\\\'])+\'/$1''/g;
unless ($found) {
# Remove "quoted quotes". They're likely to be
# inside another pair of quotes; we're not
# interested in them for their own sake and
# removing them makes finding the limits of
# the outer pair far easier.
$line =~ s/(^|[^\\\'\"])\"\'\"/$1/g;
$line =~ s/(^|[^\\\'\"])\'\"\'/$1/g;
$line
=~ s/(^|[^\\\"](?:\\\\)*)\'(?:\\.|[^\\\'])+\'/$1''/g;
for my $re (@bashism_string_regexs) {
if ($line =~ m/($re)/) {
$found = 1;
($match) = m/($re)/;
last;
}
}
}
# We've checked for all the things we still want
# to notice in double-quoted strings, so now
# remove those strings as well.
$cat_line
=~ s/(^|[^<\\\'-](?:\\\\)*)\"(?:\\.|[^\\\"])+\"/$1""/g;
unless ($found) {
$line
=~ s/(^|[^\\\'](?:\\\\)*)\"(?:\\.|[^\\\"])+\"/$1""/g;
for my $re (@bashism_regexs) {
if ($line =~ m/($re)/) {
$found = 1;
($match) = m/($re)/;
last;
}
}
}
if ($found) {
tag 'possible-bashism-in-maintainer-script',
"$file:$. \'$match\'";
}
# Only look for the beginning of a heredoc here,
# after we've stripped out quoted material, to
# avoid false positives.
if ($cat_line
=~ m/(?:^|[^<])\<\<\-?\s*(?:[\\]?(\w+)|[\'\"](.*?)[\'\"])/
) {
$cat_string = $1;
$cat_string = $2 if not defined $cat_string;
}
}
if (!$cat_string) {
generic_check_bad_command($_, $file, $., $pkg, 0);
if (m,/usr/share/debconf/confmodule,) {
$saw_debconf = 1;
}
if (m/^\s*read(?:\s|\z)/ && !$saw_debconf) {
tag 'read-in-maintainer-script', "$file:$.";
}
if (m,>\s*/etc/inetd\.conf(?:\s|\Z),) {
tag 'maintainer-script-modifies-inetd-conf',"$file:$."
unless $info->relation('provides')
->implies('inet-superserver');
}
if (m,^\s*(?:cp|mv)\s+(?:.*\s)?/etc/inetd\.conf\s*$,) {
tag 'maintainer-script-modifies-inetd-conf',"$file:$."
unless $info->relation('provides')
->implies('inet-superserver');
}
# Check for running commands with a leading path.
#
# Unfortunately, our $LEADIN string doesn't work
# well for this in the presence of commands that
# contain backquoted expressions because it can't
# tell the difference between the initial backtick
# and the closing backtick. We therefore first
# extract all backquoted expressions and check
# them separately, and then remove them from a
# copy of a string and then check it for bashisms.
while (m,\`([^\`]+)\`,g) {
my $cmd = $1;
if (
$cmd =~ m{ $LEADIN
(/(?:usr/)?s?bin/[\w.+-]+)
(?:\s|;|\Z)}xsm
) {
tag 'command-with-path-in-maintainer-script',
"$file:$. $1";
}
}
my $cmd = $_;
$cmd =~ s/\`[^\`]+\`//g;
if ($cmd =~ m,$LEADIN(/(?:usr/)?s?bin/[\w.+-]+)(?:\s|;|$),)
{
tag 'command-with-path-in-maintainer-script',
"$file:$. $1";
}
}
}
unless ($file eq 'postrm') {
for my $rule (@depends_needed) {
my ($package, $regex) = @$rule;
if ( $pkg ne $package
and /$regex/
and not $warned{$package}) {
if ( m,-x\s+\S*$regex,
or m,(?:which|type)\s+$regex,
or m,command\s+.*?$regex,) {
$warned{$package} = 1;
} elsif (!/\|\|\s*true\b/) {
unless (
$info->relation('strong')->implies($package)) {
my $shortpackage = $package;
$shortpackage =~ s/[ \(].*//;
#<<< no perltidy - tag name too long
tag "maintainer-script-needs-depends-on-$shortpackage",
#>>>
$file;
$warned{$package} = 1;
}
}
}
}
}
generic_check_bad_command($_, $file, $., $pkg, 1);
if (m,$LEADIN(?:/usr/sbin/)?dpkg-divert\s,
&& !/--(?:help|list|truename|version)/) {
if (/--local/) {
tag 'package-uses-local-diversion', "$file:$.";
}
my $mode = /--remove/ ? 'remove' : 'add';
my ($divert) = /dpkg-divert\s*(.*)$/;
$divert =~ s{\s*(?:\${?[\w:=-]+}?)*\s*
# options without arguments
--(?:add|quiet|remove|rename|test|local
# options with arguments
|(?:admindir|divert|package) \s+ \S+)
\s*}{}gxsm;
# Remove unpaired opening or closing parenthesis
1 while ($divert =~ m/\G.*?\(.+?\)/gc);
$divert =~ s/\G(.*?)[()]/$1/;
pos($divert) = undef;
# Remove unpaired opening or closing braces
1 while ($divert =~ m/\G.*?{.+?}/gc);
$divert =~ s/\G(.*?)[{}]/$1/;
pos($divert) = undef;
# position after the last pair of quotation marks, if any
1 while ($divert =~ m/\G.*?(\"|\').+?\1/gc);
# Strip anything matching and after '&&', '||', ';', or '>'
# this is safe only after we are positioned after the last pair
# of quotation marks
$divert =~ s/\G.+?\K(?: && | \|\| | ; | \d*> ).*$//x;
pos($divert) = undef;
# Remove quotation marks, they affect:
# * our var to regex trick
# * stripping the initial slash if the path was quoted
$divert =~ s/[\"\']//g;
# remove the leading / because it's not in the index hash
$divert =~ s,^/,,;
# remove any remaining leading or trailing whitespace.
strip($divert);
$divert = quotemeta($divert);
# For now just replace variables, they will later be normalised
$expand_diversions = 1 if $divert =~ s/\\\$\w+/.+/g;
$expand_diversions = 1 if $divert =~ s/\\\$\\{\w+.*?\\}/.+/g;
# handle $() the same way:
$expand_diversions = 1 if $divert =~ s/\\\$\\\(.+?\\\)/.+/g;
if ($mode eq 'add') {
$added_diversions{$divert}
= {'script' => $file, 'line' => $.};
} elsif ($mode eq 'remove') {
push @{$removed_diversions{$divert}},
{'script' => $file, 'line' => $.};
} else {
fail "Internal error: \$mode has unknown value: $mode";
}
}
}
if ($saw_init && !$saw_invoke) {
tag 'maintainer-script-calls-init-script-directly',
"$file:$saw_init";
}
unless ($has_code) {
tag 'maintainer-script-empty', $file;
}
if ($shellscript && !$saw_sete) {
if ($saw_bange) {
tag 'maintainer-script-without-set-e', $file;
} else {
tag 'maintainer-script-ignores-errors', $file;
}
}
close($fd);
}
close($ctrl_fd);
# If any of the maintainer scripts used a variable in the file or
# diversion name normalise them all
if ($expand_diversions) {
for my $divert (keys %removed_diversions, keys %added_diversions) {
# if a wider regex was found, the entries might no longer be there
unless (exists($removed_diversions{$divert})
or exists($added_diversions{$divert})) {
next;
}
my $widerrx = $divert;
my $wider = $widerrx;
$wider =~ s/\\//g;
# find the widest regex:
my @matches = grep {
my $lrx = $_;
my $l = $lrx;
$l =~ s/\\//g;
if ($wider =~ m/^$lrx$/) {
$widerrx = $lrx;
$wider = $l;
1;
} elsif ($l =~ m/^$widerrx$/) {
1;
} else {
0;
}
} (keys %removed_diversions, keys %added_diversions);
# replace all the occurences with the widest regex:
for my $k (@matches) {
next if ($k eq $widerrx);
if (exists($removed_diversions{$k})) {
$removed_diversions{$widerrx} = $removed_diversions{$k};
delete $removed_diversions{$k};
}
if (exists($added_diversions{$k})) {
$added_diversions{$widerrx} = $added_diversions{$k};
delete $added_diversions{$k};
}
}
}
}
for my $divert (keys %removed_diversions) {
if (exists $added_diversions{$divert}) {
# just mark the entry, because a --remove might
# happen in two branches in the script, i.e. we
# see it twice, which is not a bug
$added_diversions{$divert}{'removed'} = 1;
} else {
for my $item (@{$removed_diversions{$divert}}) {
my $script = $item->{'script'};
my $line = $item->{'line'};
next unless ($script eq 'postrm');
# Allow preinst and postinst to remove diversions the
# package doesn't add to clean up after previous
# versions of the package.
$divert = unquote($divert, $expand_diversions);
tag 'remove-of-unknown-diversion', $divert, "$script:$line";
}
}
}
for my $divert (keys %added_diversions) {
my $script = $added_diversions{$divert}{'script'};
my $line = $added_diversions{$divert}{'line'};
my $divertrx = $divert;
$divert = unquote($divert, $expand_diversions);
if (not exists $added_diversions{$divertrx}{'removed'}) {
tag 'orphaned-diversion', $divert, $script;
}
# Handle man page diversions somewhat specially. We may
# divert away a man page in one section without replacing that
# same file, since we're installing a man page in a different
# section. An example is diverting a man page in section 1
# and replacing it with one in section 1p (such as
# libmodule-corelist-perl at the time of this writing).
#
# Deal with this by turning all man page diversions into
# wildcard expressions instead that match everything in the
# same numeric section so that they'll match the files shipped
# in the package.
if ($divertrx =~ m,^(usr\\/share\\/man\\/\S+\\/.*\\\.\d)\w*(\\\.gz\z),)
{
$divertrx = "$1.*$2";
$expand_diversions = 1;
}
if ($expand_diversions) {
tag 'diversion-for-unknown-file', $divert, "$script:$line"
unless (any { $_ =~ m/$divertrx/ } $info->sorted_index);
} else {
tag 'diversion-for-unknown-file', $divert, "$script:$line"
unless $info->index($divert);
}
}
return;
}
# -----------------------------------
# try generic bad maintainer script command tagging
sub generic_check_bad_command {
my ($line, $file, $lineno, $pkg, $findincatstring) = @_;
# try generic bad maintainer script command tagging
BAD_CMD:
foreach my $bad_cmd_tag ($BAD_MAINT_CMD->all) {
my $bad_cmd_data = $BAD_MAINT_CMD->value($bad_cmd_tag);
my $inscript = $bad_cmd_data->{'in_script'};
my $incat;
if ($file !~ m{$inscript}) {
next BAD_CMD;
}
$incat = $bad_cmd_data->{'in_cat_string'};
if ($incat == $findincatstring) {
my $regex = $bad_cmd_data->{'regexp'};
if ($line =~ m{$regex}) {
my $extrainfo = defined($1) ? "\'$1\'" : '';
my $inpackage = $bad_cmd_data->{'in_package'};
unless($pkg =~ m{$inpackage}) {
tag $bad_cmd_tag, "$file:$.", $extrainfo;
}
}
}
}
return;
}
# Returns non-zero if the given file is not actually a shell script,
# just looks like one.
sub script_is_evil_and_wrong {
my ($filename) = @_;
my $ret = 0;
my $i = 0;
my $var = '0';
my $backgrounded = 0;
open(my $fd, '<', $filename);
local $_;
while (<$fd>) {
chomp;
next if m/^#/o;
next if m/^$/o;
last if (++$i > 55);
if (
m~
# the exec should either be "eval"ed or a new statement
(?:^\s*|\beval\s*[\'\"]|(?:;|&&|\b(?:then|else))\s*)
# eat anything between the exec and $0
exec\s*.+\s*
# optionally quoted executable name (via $0)
.?\$$var.?\s*
# optional "end of options" indicator
(?:--\s*)?
# Match expressions of the form '${1+$@}', '${1:+"$@"',
# '"${1+$@', "$@", etc where the quotes (before the dollar
# sign(s)) are optional and the second (or only if the $1
# clause is omitted) parameter may be $@ or $*.
#
# Finally the whole subexpression may be omitted for scripts
# which do not pass on their parameters (i.e. after re-execing
# they take their parameters (and potentially data) from stdin
.?(?:\${1:?\+.?)?(?:\$[\@\*])?~x
) {
$ret = 1;
last;
} elsif (/^\s*(\w+)=\$0;/) {
$var = $1;
} elsif (
m~
# Match scripts which use "foo $0 $@ &\nexec true\n"
# Program name
\S+\s+
# As above
.?\$$var.?\s*
(?:--\s*)?
.?(?:\${1:?\+.?)?(?:\$[\@\*])?.?\s*\&~x
) {
$backgrounded = 1;
} elsif (
$backgrounded
and m~
# the exec should either be "eval"ed or a new statement
(?:^\s*|\beval\s*[\'\"]|(?:;|&&|\b(?:then|else))\s*)
exec\s+true(?:\s|\Z)~x
) {
$ret = 1;
last;
}
}
close($fd);
return $ret;
}
# Given an interpretor and a file, run the interpretor on that file with the
# -n option to check syntax, discarding output and returning the exit status.
sub check_script_syntax {
my ($interpreter, $script) = @_;
my $pid = fork();
if ($pid == 0) {
open(STDOUT, '>', '/dev/null');
open(STDERR, '>&', \*STDOUT);
exec $interpreter, '-n', $script
or fail("cannot exec $interpreter: $!");
} else {
waitpid $pid, 0;
}
return $?;
}
sub remove_comments {
local $_;
my $line = shift || '';
$_ = $line;
# Remove quoted strings so we can more easily ignore comments
# inside them
s/(^|[^\\](?:\\\\)*)\'(?:\\.|[^\\\'])+\'/$1''/g;
s/(^|[^\\](?:\\\\)*)\"(?:\\.|[^\\\"])+\"/$1""/g;
# If the remaining string contains what looks like a comment,
# eat it. In either case, swap the unmodified script line
# back in for processing (if required) and return it.
if (m/(?:^|[^[\\])[\s\&;\(\)](\#.*$)/) {
my $comment = $1;
$_ = $line;
s/\Q$comment\E//; # eat comments
} else {
$_ = $line;
}
return $_;
}
sub unquote($$) {
my ($string, $replace_regex) = @_;
$string =~ s,\\,,g;
if ($replace_regex) {
$string =~ s,\.\+,*,g;
}
return $string;
}
sub _parse_interpreters {
my ($interpreter, $value) = @_;
my ($path, $dep) = split m/\s*,\s*/, $value, 2;
$dep = $interpreter if not $dep;
if ($dep eq '@NODEPS@') {
$dep = '';
} elsif ($dep =~ m/@/) {
fail "Unknown magic value $dep for versioned interpreter $interpreter";
}
return [$path, $dep];
}
sub _parse_versioned_interpreters {
my ($interpreter, $value) = @_;
my ($path, $regex, $deptmp, $vers, $deprel) = split m/\s*,\s*/, $value, 5;
my @versions = split m/\s++/, $vers;
$deprel = $interpreter if not $deprel;
if ($deprel eq '@NO_DEFAULT_DEPS@') {
$deprel = '';
} elsif ($deprel eq '@SKIP_UNVERSIONED@') {
$deprel = undef;
} elsif ($deprel =~ m/@/) {
fail
"Unknown magic value $deprel for versioned interpreter $interpreter";
}
return [$path, $deprel, qr/^$regex$/, $deptmp, \@versions];
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/automake.desc 0000664 0000000 0000000 00000001035 12310413144 015352 0 ustar Check-Script: automake
Author: Gautier Minster
Abbrev: autom
Type: source
Needs-Info: index
Info: Checks for erroneous, missing or deprecated automake files
Tag: deprecated-configure-filename
Severity: wishlist
Certainty: certain
Info: The use of 'configure.in' with automake is deprecated and will
not be supported in future versions of automake. Please consider
(helping upstream) migrating to 'configure.ac' instead.
Ref: https://lists.gnu.org/archive/html/automake/2013-05/msg00049.html
Experimental: yes
lintian-2.5.22ubuntu1/checks/patch-systems.pm 0000664 0000000 0000000 00000026271 12311317615 016066 0 ustar # patch-systems -- lintian check script -*- perl -*-
#
# Copyright (C) 2007 Marc Brockschmidt
# Copyright (C) 2008 Raphael Hertzog
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::patch_systems;
use strict;
use warnings;
use autodie;
use constant PATCH_DESC_TEMPLATE => 'TODO: Put a short summary on'
. ' the line above and replace this paragraph';
use Lintian::Tags qw(tag);
use Lintian::Util qw(fail is_ancestor_of strip);
sub run {
my (undef, undef, $info) = @_;
# Some (cruft) checks are valid for every patch system, so we need
# to record that:
my $uses_patch_system = 0;
# Get build deps so we can decide which build system the
# maintainer meant to use:
my $build_deps = $info->relation('build-depends-all');
# Get source package format
my $format = '';
if (defined $info->field('format')) {
$format = $info->field('format');
}
my $quilt_format = ($format =~ /3\.\d+ \(quilt\)/) ? 1 : 0;
my $droot = $info->debfiles;
my $dpdir = "$droot/patches";
if (!is_ancestor_of($droot, $dpdir)) {
# Bad symlink
return;
}
#----- dpatch
if ($build_deps->implies('dpatch')) {
$uses_patch_system++;
#check for a debian/patches file:
if (-l "$dpdir/00list" and not is_ancestor_of($droot, "$dpdir/00list"))
{
# skip
} elsif (!-r "$dpdir/00list") {
tag 'dpatch-build-dep-but-no-patch-list';
} else {
my $list_uses_cpp = 0;
if (-f "$dpdir/00options"
&& is_ancestor_of($droot, "$dpdir/00options")) {
open(my $fd, '<', "$dpdir/00options");
while(<$fd>) {
if (/DPATCH_OPTION_CPP=1/) {
$list_uses_cpp = 1;
last;
}
}
close($fd);
}
foreach my $listfile (glob("$dpdir/00list*")) {
my @patches;
if (-f $listfile and is_ancestor_of($droot, $listfile)) {
open(my $fd, '<', $listfile);
while(<$fd>) {
chomp;
next if (/^\#/); #ignore comments or CPP directive
s%//.*%% if $list_uses_cpp; # remove C++ style comments
if ($list_uses_cpp && m%/\*%) {
# remove C style comments
$_ .= <$fd> while($_ !~ m%\*/%);
s%/\*[^*]*\*/%%g;
}
next if (/^\s*$/); #ignore blank lines
push @patches, split(' ', $_);
}
close($fd);
}
# Check each patch.
foreach my $patch_file (@patches) {
$patch_file .= '.dpatch'
if -e "$dpdir/$patch_file.dpatch"
and not -e "$dpdir/$patch_file";
next if (-l "$dpdir/$patch_file");
next unless is_ancestor_of($droot, "$dpdir/$patch_file");
if (!-r "$dpdir/$patch_file") {
tag 'dpatch-index-references-non-existent-patch',
$patch_file;
next;
}
if (-f "$dpdir/$patch_file") {
my $has_comment = 0;
open(my $fd, '<', "$dpdir/$patch_file");
while (<$fd>) {
# stop if something looking like a patch
# starts:
last if /^---/;
# note comment if we find a proper one
$has_comment = 1
if (/^\#+\s*DP:\s*(\S.*)$/
&& $1 !~ /^no description\.?$/i);
$has_comment = 1
if (/^\# (?:Description|Subject)/);
}
close($fd);
unless ($has_comment) {
tag 'dpatch-missing-description', $patch_file;
}
}
check_patch($dpdir, $patch_file);
}
}
}
}
#----- quilt
if ($build_deps->implies('quilt') or $quilt_format) {
$uses_patch_system++;
# check for a debian/patches file:
if (-l "$dpdir/series" and not is_ancestor_of($droot, "$dpdir/series"))
{
# skip
} elsif (!-r "$dpdir/series") {
tag 'quilt-build-dep-but-no-series-file' unless $quilt_format;
} else {
if (-f "$dpdir/series") {
my @patches;
my @badopts;
open(my $series_fd, '<', "$dpdir/series");
while (my $patch = <$series_fd>) {
strip($patch); # Strip leading/trailing spaces
$patch =~ s/(?:^|\s+)#.*$//; # Strip comment
next unless $patch;
if ($patch =~ m{^(\S+)\s+(\S.*)$}) {
my $patch_options;
($patch, $patch_options) = ($1, $2);
if ($patch_options ne '-p1') {
push @badopts, $patch;
}
}
push @patches, $patch;
}
close($series_fd);
if (scalar(@badopts)) {
tag 'quilt-patch-with-non-standard-options', @badopts;
}
# Check each patch.
foreach my $patch_file (@patches) {
next if (-l "$dpdir/$patch_file");
next unless is_ancestor_of($droot, "$dpdir/$patch_file");
if (!-r "$dpdir/$patch_file") {
tag 'quilt-series-references-non-existent-patch',
$patch_file;
next;
}
if (-f "$dpdir/$patch_file") {
my $has_description = 0;
my $has_template_description = 0;
open(my $patch_fd, '<', "$dpdir/$patch_file");
while (<$patch_fd>) {
# stop if something looking like a patch starts:
last if /^---/;
next if /^\s*$/;
# Skip common "lead-in" lines
$has_description = 1
unless m{^(?:Index: |=+$|diff .+|index )};
$has_template_description = 1
if index($_, PATCH_DESC_TEMPLATE) != -1;
}
close($patch_fd);
unless ($has_description) {
tag 'quilt-patch-missing-description', $patch_file;
}
if ($has_template_description) {
tag 'quilt-patch-using-template-description',
$patch_file;
}
}
check_patch($dpdir, $patch_file);
}
}
}
if ($quilt_format) { # 3.0 (quilt) specific checks
# Format 3.0 packages may generate a debian-changes-$version patch
my $version = $info->field('version');
my $versioned_patch = "$dpdir/debian-changes-$version";
my $patch_header = "$droot/source/patch-header";
my $ok = 1;
if (-l "$droot/source" or -l $patch_header) {
# possible issue
if (!is_ancenstor_of($droot, $patch_header)) {
$ok = 0;
}
}
# $dpdir is known to be safe at this point, so only check
# the patch itself
if ($ok and -l $versioned_patch) {
if (!is_ancenstor_of($droot, $versioned_patch)) {
$ok = 0;
}
}
if ($ok && -f $versioned_patch && !-f $patch_header) {
tag 'format-3.0-but-debian-changes-patch';
}
}
} else {
if ( -r "$dpdir/series"
and -f "$dpdir/series") {
# 3.0 (quilt) sources don't need quilt as dpkg-source will
# do the work
if (!-l "$dpdir/series" || is_ancestor_of($droot, "$dpdir/series"))
{
tag 'quilt-series-but-no-build-dep' unless $quilt_format;
}
}
}
#----- look for README.source
if ($uses_patch_system && !$quilt_format && !-f "$droot/README.source") {
if (!-l "$droot/README.source") {
# tag, unless README.source was a symlink (which could be a
# traversal attempt)
tag 'patch-system-but-no-source-readme';
}
}
#----- general cruft checking:
if ($uses_patch_system > 1) {
tag 'more-than-one-patch-system';
}
my @direct;
open(my $fd, '<', $info->diffstat);
while (<$fd>) {
my ($file) = (m,^\s+(.*?)\s+\|,)
or fail("syntax error in diffstat file: $_");
push(@direct, $file) if ($file !~ m,^debian/,);
}
close($fd);
if (@direct) {
my $files= (@direct > 1) ? "$direct[0] and $#direct more" : $direct[0];
tag 'patch-system-but-direct-changes-in-diff', $files
if ($uses_patch_system);
tag 'direct-changes-in-diff-but-no-patch-system', $files
if (not $uses_patch_system);
}
return;
}
# Checks on patches common to all build systems.
sub check_patch {
my ($dpdir, $patch_file) = @_;
# Use --strip=1 to strip off the first layer of directory in case
# the parent directory in which the patches were generated was
# named "debian". This will produce false negatives for --strip=0
# patches that modify files in the debian/* directory, but as of
# 2010-01-01, all cases where the first level of the patch path is
# "debian/" in the archive are false positives.
open(my $fd, '-|', 'lsdiff', '--strip=1', "$dpdir/$patch_file");
while (<$fd>) {
chomp;
if (m|^(?:\./)?debian/|o) {
tag 'patch-modifying-debian-files', $patch_file, $_;
}
}
close($fd);
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/changelog-file.desc 0000664 0000000 0000000 00000034012 12310413206 016410 0 ustar Check-Script: changelog-file
Author: Christian Schwarz
Abbrev: chg
Type: binary
Needs-Info: file-info, changelog-file, index
Info: This script checks if a binary package conforms to policy
with regards to changelog files.
.
Each binary package with a /usr/share/doc/<foo> directory must have
a Debian changelog file in changelog.Debian.gz unless the Debian
changelog and the upstream one is the same file; in this case, it
must be in changelog.gz.
.
If there is an upstream changelog file, it must be named
"changelog.gz".
.
Both changelog files should be compressed using "gzip -9".
Even if they start out small, they will become large with time.
Tag: html-changelog-without-text-version
Severity: important
Certainty: certain
Info: If the upstream changelog file is HTML formatted, a text version
should also be accessible as "changelog.gz". (This can be created by
"lynx -dump -nolist")
Ref: policy 12.7
Tag: changelog-file-not-compressed
Severity: important
Certainty: certain
Info: Changelog files should be compressed using "gzip -9". Even if they
start out small, they will become large with time.
Ref: policy 12.7
Tag: debian-news-file-not-compressed
Severity: normal
Certainty: certain
Info: NEWS.Debian files should be compressed using "gzip -9". The file
must always have the same name.
Ref: devref 6.3.4
Tag: changelog-is-dh_make-template
Severity: important
Certainty: certain
Info: The changelog file has an instruction left by dh_make, which has
not been removed. Example:
.
* Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP%gt;
.
The "<... is the bug number ...>" part has not been removed from the
changelog.
Tag: changelog-not-compressed-with-max-compression
Severity: normal
Certainty: certain
Info: Changelog files should be compressed using "gzip -9"; i.e., using
the maximum compression level via the -9 option to gzip.
Ref: policy 12.7
Tag: wrong-name-for-changelog-of-native-package
Severity: normal
Certainty: certain
Info: The changelog file of a native Debian package (i.e., if there is
no upstream source) should usually be installed as
/usr/share/doc/pkg/changelog.gz
Ref: policy 12.7
Tag: changelog-file-missing-in-native-package
Severity: important
Certainty: certain
Info: Each Debian package (which provides a /usr/share/doc/pkg
directory) has to install a changelog file. Since this package seems
to be a native Debian package (i.e., there is no upstream source),
the file should usually be installed as
/usr/share/doc/pkg/changelog.gz
.
Note that Lintian may emit this tag if the changelog exists, but it
does not look like a Debian changelog.
Ref: policy 12.7
Tag: wrong-name-for-upstream-changelog
Severity: normal
Certainty: possible
Info: If there is an upstream changelog file, it should usually be
installed as /usr/share/doc/pkg/changelog.gz
Ref: policy 12.7
Tag: no-upstream-changelog
Severity: pedantic
Certainty: wild-guess
Info: The package does not install an upstream changelog file. If upstream
provides a changelog, it should be accessible as
/usr/share/doc/pkg/changelog.gz.
.
It's currently unclear how best to handle multiple binary packages from
the same source. Some maintainers put a copy of the upstream changelog
in each package, but it can be quite long. Some include it in one
package and add symlinks to the other packages, but this requires there
be dependencies between the packages. Some only include it in a "central"
binary package and omit it from more ancillary packages.
Ref: policy 12.7
Tag: wrong-name-for-debian-changelog-file
Severity: important
Certainty: certain
Info: The Debian changelog file should usually be installed as
/usr/share/doc/pkg/changelog.Debian.gz
Ref: policy 12.7
Tag: wrong-name-for-debian-news-file
Severity: normal
Certainty: possible
Info: The Debian news file must be installed as
/usr/share/doc/pkg/NEWS.Debian.gz with exactly that capitalization
or automated tools may not find it correctly.
Ref: devref 6.3.4
Tag: debian-changelog-file-missing
Severity: serious
Certainty: certain
Info: Each Debian package (which provides a /usr/share/doc/pkg
directory) has to install a Debian changelog file
/usr/share/doc/pkg/changelog.Debian.gz
Ref: policy 12.7
Tag: debian-changelog-file-is-a-symlink
Severity: normal
Certainty: certain
Info: The Debian changelog file is a symlink to a file in a different
directory or not found in this package. Please don't do this. It makes
package checking and manipulation unnecessarily difficult. Because it was
a symlink, the Debian changelog file was not checked for other
problems. (Symlinks to another file in /usr/share/doc/pkg or a
subdirectory thereof are fine and should not trigger this warning.)
.
To refer to the changelog, copyright, and other documentation files of
another package that this one depends on, please symlink the entire
/usr/share/doc/pkg directory rather than individual files.
Tag: debian-changelog-file-missing-or-wrong-name
Severity: serious
Certainty: certain
Info: Each Debian package (which provides a /usr/share/doc/pkg
directory) must install a Debian changelog file in
/usr/share/doc/pkg/changelog.Debian.gz
.
A common error is to name the Debian changelog like an upstream changelog
(/usr/share/doc/pkg/changelog.gz); therefore, lintian will apply
further checks to such a file if it exists even after issuing this error.
Ref: policy 12.7
Tag: debian-changelog-file-contains-obsolete-user-emacs-settings
Severity: normal
Certainty: certain
Info: The add-log-mailing-address variable is no longer honored in
debian-changelog-mode, and should not appear in packages' changelog
files. Instead, put something like this in your ~/.emacs:
.
(setq debian-changelog-mailing-address "userid@debian.org")
Tag: debian-changelog-file-contains-invalid-email-address
Severity: important
Certainty: certain
Info: The changelog file contains an invalid email address: the domain
needs at least one dot. This looks like a mistake.
Tag: debian-changelog-file-uses-obsolete-national-encoding
Severity: serious
Certainty: certain
Ref: policy 4.4
Info: The Debian changelog file must be valid UTF-8, an encoding of
the Unicode character set.
.
There are many ways to convert a changelog from an obsoleted encoding
like ISO-8859-1; you may for example use "iconv" like:
.
$ iconv -f ISO-8859-1 -t UTF-8 changelog > changelog.new
$ mv changelog.new changelog
Tag: debian-news-file-uses-obsolete-national-encoding
Severity: important
Certainty: certain
Info: The NEWS.Debian file must be valid UTF-8, an encoding of the Unicode
character set.
.
There are many ways to convert a changelog from an obsoleted encoding
like ISO-8859-1; you may for example use "iconv" like:
.
$ iconv -f ISO-8859-1 -t UTF-8 NEWS.Debian > NEWS.Debian.new
$ mv NEWS.Debian.new NEWS.Debian
Tag: latest-debian-changelog-entry-without-new-date
Severity: normal
Certainty: certain
Info: The latest Debian changelog entry has either the same or even an
older date as the entry before.
Tag: latest-debian-changelog-entry-without-new-version
Severity: normal
Certainty: certain
Info: The latest Debian changelog entry has a version number that's either
the same or smaller than the version number of the entry before.
Tag: latest-debian-changelog-entry-changed-to-native
Severity: normal
Certainty: possible
Info: The latest package has a Debian native version number, while the
previous version number was not native. This is usually a mistake made by
the maintainer by forgetting to append -1 when uploading a new upstream
version.
Tag: possible-new-upstream-release-without-new-version
Severity: normal
Certainty: possible
Info: The most recent changelog entry contains an entry that appears to
say this is a new upstream release (a comment similar to "new upstream
release," possibly with a word between "upstream" and "release"), but the
upstream portion of the package version number didn't change. This may
indicate that the package version was not updated properly in
debian/changelog.
Tag: experimental-to-unstable-without-comment
Severity: pedantic
Certainty: possible
Info: The previous version of this package had a distribution of
experimental, this version has a distribution of unstable, and there's
apparently no comment about the change of distributions (Lintian looks
for the phrase "to unstable"). This may indicate a mistake in setting
the distribution and accidentally uploading to unstable a package
intended for experimental.
Tag: syntax-error-in-debian-changelog
Severity: normal
Certainty: possible
Info: While parsing the Debian changelog, a syntax error was found. If
you have old changelog entries that don't follow the current syntax but
that you want to keep as-is for the historical record, add the line:
.
Old Changelog:
.
with no leading whitespace before the legacy entries. This line and
everything after it will be ignored.
Ref: policy 4.4
Tag: syntax-error-in-debian-news-file
Severity: normal
Certainty: possible
Info: While parsing the NEWS.Debian file, a syntax error was found.
Ref: devref 6.3.4
Tag: improbable-bug-number-in-closes
Severity: normal
Certainty: possible
Info: The most recent changelog closes a bug numbered less than 100.
While this is distantly possible, it's more likely a typo or a
placeholder value that mistakenly wasn't filled in.
Tag: wrong-bug-number-in-closes
Severity: normal
Certainty: certain
Info: Bug numbers can only contain digits.
Ref: policy 4.4
Tag: possible-missing-colon-in-closes
Severity: important
Certainty: possible
Info: To close a bug in the Debian changelog, the word "closes" must be
followed by a colon. This entry looked like it was intended to close a
bug, but there's no colon after "closes".
Ref: policy 4.4
Tag: debian-news-entry-has-strange-distribution
Severity: normal
Certainty: certain
Info: The latest entry in NEWS.Debian has an unusual distribution name.
This field is ignored by the archive software, so its value doesn't truly
matter, but it may be confusing to users reading the entry if the
distribution doesn't match the distribution for the same entry in the
Debian changelog file.
Tag: debian-news-entry-uses-asterisk
Severity: wishlist
Certainty: possible
Info: The latest entry in NEWS.Debian appears to use asterisks to present
changes in a bulleted list, similar to the normal changelog syntax. The
Debian Developer's Reference recommends using regular paragraphs in
NEWS.Debian rather than a bulleted list.
Ref: devref 6.3.4
Tag: debian-news-entry-has-unknown-version
Severity: normal
Certainty: possible
Info: The version number of the most recent NEWS.Debian entry
does not match any of the version numbers in the changelog file for this
package. This usually means the version in NEWS.Debian needs to
be updated to match a change to package version that happened after the
NEWS.Debian entry was written.
Tag: spelling-error-in-changelog
Severity: minor
Certainty: certain
Info: Lintian found a spelling error in the latest entry of the Debian
changelog. Lintian has a list of common misspellings that it looks for.
It does not have a dictionary like a spelling checker does.
.
When writing a changelog entry for a spelling fix that includes the
misspelling, ensure the word "spelling" is on the same line as the
misspelled word to avoid triggering this warning.
Tag: spelling-error-in-news-debian
Severity: minor
Certainty: certain
Info: Lintian found a spelling error in the latest entry of the
NEWS.Debian file. Lintian has a list of common misspellings that it
looks for. It does not have a dictionary like a spelling checker does.
Tag: new-package-should-close-itp-bug
Severity: normal
Certainty: certain
Info: This package appears to be the first packaging of a new upstream
software package (there is only one changelog entry and the Debian
revision is 1), but it does not close any bugs. The initial upload of a
new package should close the corresponding ITP bug for that package.
.
This warning can be ignored if the package is not intended for Debian or
if it is a split of an existing Debian package.
Ref: devref 5.1
Tag: debian-changelog-line-too-long
Severity: normal
Certainty: certain
Info: The given line of the latest changelog entry is over 80 columns.
Such changelog entries may look poor in terminal windows and mail
messages and be annoying to read. Please wrap changelog entries at 80
columns or less where possible.
Tag: changelog-news-debian-mismatch
Severity: normal
Certainty: possible
Info: The latest entries in the Debian changelog file and NEWS.Debian file
are for the same version but the given field doesn't match. The
changelog information is canonical and the NEWS.Debian information is
ignored, but it may be confusing to users to have them be different.
Tag: bad-intended-distibution
Severity: normal
Certainty: wild-guess
Experimental: yes
Info: The last changelog entry implies this version is not for release.
Instead it should specify the distribution it is to be uploaded to.
Tag: version-refers-to-distribution
Severity: minor
Certainty: certain
Info: The Debian portion of the package version contains a reference to a
particular Debian release or distribution. This should only be done for
uploads targeted at a particular release, not at unstable or
experimental, and should refer to the release by version number or code
name.
.
Using "testing" or "stable" in a package version targeted at the current
testing or stable release is less informative than using the code name or
version number and may cause annoying version sequencing issues if the
package doesn't change before the next release cycle starts.
Ref: devref 5.13.3
Tag: debian-changelog-has-wrong-weekday
Severity: normal
Certainty: certain
Info: The date in the changelog entry is not consistent with the actual
weekday. Either the date is wrong or the weekday is wrong.
.
To avoid problems like this, consider using a tool like dch(1) or
date(1) to generate the date. Example:
.
$ date -R -ud '2013-11-05 23:59:59'
Tue, 05 Nov 2013 23:59:59 +0000
lintian-2.5.22ubuntu1/checks/version-substvars.pm 0000664 0000000 0000000 00000012234 12311317623 016772 0 ustar # version-substvars -- lintian check script -*- perl -*-
#
# Copyright (C) 2006 Adeodato Simó
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
# SUMMARY
# =======
#
# What breaks
# -----------
#
# (b1) any -> any (= ${source:Version}) -> use b:V
# (b2) any -> all (= ${binary:Version}) [or S-V] -> use s:V
# (b3) all -> any (= ${either-of-them}) -> use (>= ${s:V}),
# optionally (<< ${s:V}.1~)
#
# Note (b2) also breaks if (>= ${binary:Version}) [or S-V] is used.
#
# Always warn on ${Source-Version} even if it doesn't break since the substvar
# is now considered deprecated.
package Lintian::version_substvars;
use strict;
use warnings;
use autodie;
use Lintian::Relation qw(:constants);
use Lintian::Tags qw(tag);
use Lintian::Util qw($PKGNAME_REGEX);
sub run {
my (undef, undef, $info) = @_;
my @dep_fields
= qw(depends pre-depends recommends suggests conflicts replaces);
foreach my $pkg1 ($info->binaries) {
my ($pkg1_is_any, $pkg2, $pkg2_is_any, $substvar_strips_binNMU);
$pkg1_is_any
= ($info->binary_field($pkg1, 'architecture', '') ne 'all');
foreach my $field (@dep_fields) {
next unless $info->binary_field($pkg1, $field);
my $rel = $info->binary_relation($pkg1, $field);
my $svid = 0;
my $visitor = sub {
if (m/\${Source-Version}/o and not $svid) {
$svid++;
tag 'substvar-source-version-is-deprecated', $pkg1;
}
if (
m/ ($PKGNAME_REGEX)(?: :any)? \s* # pkg-name $1
\(\s*[\>\<]?[=\>\<]\s* # REL
\${(?:Source-|source:|binary:)Version} # {subvar}
/x
) {
my $other = $1;
# We can't test dependencies on packages whose names are
# formed via substvars expanded during the build. Assume
# those maintainers know what they're doing.
tag 'version-substvar-for-external-package',
"$pkg1 -> $other"
unless $info->binary_field($other, 'architecture')
or $other =~ /\$\{\S+\}/;
}
};
$rel->visit($visitor, VISIT_PRED_FULL);
}
foreach (
split(
m/,/,
(
$info->binary_field($pkg1, 'pre-depends', '').', '
. $info->binary_field($pkg1, 'depends', '')))
) {
next
unless m/($PKGNAME_REGEX)(?: :any)? \s* # pkg-name
\(\s*(\>)?=\s* # rel
\${((?:Source-|source:|binary:)Version)} # subvar
/x;
my $gt = $2//'';
$pkg2 = $1;
$substvar_strips_binNMU = ($3 eq 'source:Version');
if (not $info->binary_field($pkg2, 'architecture')) {
# external relation or subst var package - either way,
# handled above.
next;
}
$pkg2_is_any
= ($info->binary_field($pkg2, 'architecture', '') ne 'all');
if ($pkg1_is_any) {
if ($pkg2_is_any and $substvar_strips_binNMU) {
unless ($gt) {
# (b1) any -> any (= ${source:Version})
tag 'not-binnmuable-any-depends-any', "$pkg1 -> $pkg2";
} else {
# any -> any (>= ${source:Version})
# technically this can be "binNMU'ed", though it is
# a bit weird.
1;
}
} elsif (not $pkg2_is_any and not $substvar_strips_binNMU) {
# (b2) any -> all ( = ${binary:Version}) [or S-V]
# or -- same -- (>= ${binary:Version}) [or S-V]
tag 'not-binnmuable-any-depends-all', "$pkg1 -> $pkg2";
}
} elsif ($pkg2_is_any && !$gt) {
# (b3) all -> any (= ${either-of-them})
tag 'not-binnmuable-all-depends-any', "$pkg1 -> $pkg2";
}
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/standards-version.pm 0000664 0000000 0000000 00000014416 12311317622 016724 0 ustar # standards-version -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz and Richard Braakman
# Copyright (C) 2008-2009 Russ Allbery
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::standards_version;
use strict;
use warnings;
use autodie;
use POSIX qw(strftime);
use List::Util qw(first);
use Date::Parse qw(str2time);
use Lintian::Data;
use Lintian::Tags qw(tag);
use Lintian::Util qw(fail);
# Any Standards Version released before this day is "ancient"
my $ANCIENT_DATE_DATA = Lintian::Data->new(
'standards-version/ancient-date',
qr{\s*<\s*},
sub {
my $date = str2time($_[1]) or fail "Cannot parse ANCIENT_DATE: $!";
return $date;
});
my $ANCIENT_DATE = $ANCIENT_DATE_DATA->value('ANCIENT')
or fail 'Cannot get ANCIENT_DATE';
my $STANDARDS= Lintian::Data->new('standards-version/release-dates', qr/\s+/o);
# In addition to the normal Lintian::Data structure, we also want a list of
# all standards and their release dates so that we can check things like the
# release date of the standard released after the one a package declared. Do
# that by pulling all data out of the Lintian::Data structure and sorting it
# by release date. We can also use this to get the current standards version.
my @STANDARDS = reverse sort { $a->[1] <=> $b->[1] }
map { [$_, $STANDARDS->value($_)] } $STANDARDS->all;
my $CURRENT_DATE = $STANDARDS[0][1];
# In scalar context you get the string (e.g. "3.9.2")
# and in list context you get it split into pieces (3, 9, 2)
my $CURRENT = $STANDARDS[0][0];
my @CURRENT = split(m/\./, $CURRENT);
sub run {
my (undef, undef, $info) = @_;
# udebs aren't required to conform to policy, so they don't need
# Standards-Version. (If they have it, though, it should be valid.)
my $version = $info->field('standards-version');
my $all_udeb = 1;
$all_udeb = 0
if first { $info->binary_package_type($_) ne 'udeb' } $info->binaries;
if (not defined $version) {
tag 'no-standards-version-field' unless $all_udeb;
return;
}
# Check basic syntax and strip off the fourth digit. People are allowed to
# include the fourth digit if they want, but it indicates a non-normative
# change in Policy and is therefore meaningless in the Standards-Version
# field.
unless ($version =~ m/^\s*(\d+\.\d+\.\d+)(?:\.\d+)?\s*$/) {
tag 'invalid-standards-version', $version;
return;
}
my $stdver = $1;
my ($major, $minor, $patch) = $stdver =~ m/^(\d+)\.(\d+)\.(\d+)/;
# To do some date checking, we have to get the package date from
# the changelog file. If we can't find the changelog file, assume
# that the package was released today, since that activates the
# most tags.
my $changes = $info->changelog;
my ($pkgdate, $dist);
if (defined $changes) {
my ($entry) = $changes->data;
$pkgdate
= ($entry && $entry->Timestamp) ? $entry->Timestamp : $CURRENT_DATE;
$dist = ($entry && $entry->Distribution)? $entry->Distribution : '';
} else {
$pkgdate = $CURRENT_DATE;
}
# Check for packages dated prior to the date of release of the standards
# version with which they claim to comply.
if ( defined $dist
&& $dist ne 'UNRELEASED'
&& $STANDARDS->known($stdver)
&& $STANDARDS->value($stdver) > $pkgdate) {
my $package = strftime('%Y-%m-%d', gmtime $pkgdate);
my $release = strftime('%Y-%m-%d', gmtime $STANDARDS->value($stdver));
tag 'timewarp-standards-version', "($package < $release)";
}
my $tag = "$version (current is $CURRENT)";
if (not $STANDARDS->known($stdver)) {
# Unknown standards version. Perhaps newer?
if (
($major > $CURRENT[0])
or ($major == $CURRENT[0] and $minor > $CURRENT[1])
or ( $major == $CURRENT[0]
and $minor == $CURRENT[1]
and $patch > $CURRENT[2])
) {
tag 'newer-standards-version', $tag;
} else {
tag 'invalid-standards-version', $version;
}
} elsif ($stdver eq $CURRENT) {
# Current standard. Nothing more to check.
return;
} else {
# Otherwise, we need to see if the standard that this package
# declares is both new enough to not be ancient and was the
# current standard at the time the package was uploaded.
#
# A given standards version is considered obsolete if the
# version following it has been out for at least two years (so
# the current version is never obsolete).
my $rdate = $STANDARDS->value($stdver);
if ($rdate < $ANCIENT_DATE) {
tag 'ancient-standards-version', $tag;
} else {
# We have to get the package date from the changelog file. If we
# can't find the changelog file, always issue the tag.
if (not defined $changes) {
tag 'out-of-date-standards-version', $tag;
return;
}
my ($entry) = $changes->data;
my $timestamp
= ($entry && $entry->Timestamp) ? $entry->Timestamp : 0;
for my $standard (@STANDARDS) {
last if $standard->[0] eq $stdver;
if ($standard->[1] < $timestamp) {
tag 'out-of-date-standards-version', $tag;
last;
}
}
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/copyright-file.desc 0000664 0000000 0000000 00000042061 12310413206 016474 0 ustar Check-Script: copyright-file
Author: Christian Schwarz
Abbrev: cpy
Type: binary
Needs-Info: copyright-file, index
Info: This script checks if a binary package conforms to policy
with regard to copyright files.
.
Each binary package must either have a
/usr/share/doc/<foo>/copyright file or must have a symlink
/usr/share/doc/<foo> -> <bar>, where <bar> comes
from the same source package and pkg foo declares a "Depends" relation on
bar.
Tag: no-copyright-file
Severity: serious
Certainty: certain
Info: Each binary package has to include a plain file
/usr/share/doc/pkg/copyright
Ref: policy 12.5
Tested: empty
Tag: copyright-refers-to-old-directory
Severity: serious
Certainty: certain
Info: The common licenses (GPL, BSD, Artistic, etc) have been moved from
/usr/doc/copyright to /usr/share/common-licenses.
Copyright files should be updated.
Ref: policy 12.5
Tag: copyright-file-compressed
Severity: serious
Certainty: certain
Info: The copyright file /usr/share/doc/pkg/copyright must not be
compressed.
Ref: policy 12.5
Tag: copyright-file-is-symlink
Severity: serious
Certainty: certain
Info: The copyright file /usr/share/doc/pkg/copyright must not be a
symbolic link.
Ref: policy 12.5
Tag: copyright-file-contains-full-gpl-license
Severity: important
Certainty: certain
Info: The copyright file /usr/share/doc/pkg/copyright contains the
complete text of the GPL v1, v2, or v3. It should refer to the file
/usr/share/common-licenses/GPL-1, GPL-2, or
GPL-3 instead.
Ref: policy 12.5
Tag: copyright-file-contains-full-gfdl-license
Severity: important
Certainty: certain
Info: The copyright file /usr/share/doc/pkg/copyright contains the
complete text of the GFDL v1.2. It should refer to the file
/usr/share/common-licenses/GFDL-1.2 instead.
Ref: policy 12.5
Tag: copyright-file-contains-full-apache-2-license
Severity: important
Certainty: certain
Info: The copyright file /usr/share/doc/pkg/copyright contains the
complete text of the Apache 2.0 license. It should refer to the file
/usr/share/common-licenses/Apache-2.0 instead.
Ref: policy 12.5
Tag: usr-share-doc-symlink-without-dependency
Severity: serious
Certainty: possible
Info: If the package installs a symbolic link
/usr/share/doc/pkg1 -> pkg2, then pkg1
must depend on pkg2 directory, with the same version as
pkg1.
.
Adding the dependency just to fix this bug is often not a good solution.
Usually, it's better to include a real /usr/share/doc/pkg1
directory within pkg1 and copy the copyright file into that
directory.
.
Transitive dependencies are not allowed here. In other words, if the
documentation directory is shipped in pkg3 and pkg1 depends
on pkg2, which in turn depends on pkg3, that's still an
error. Copyright file extractors are not required to go more than one
level deep when resolving dependencies. Each package should have a
direct dependency on the package which includes its documentation
directory.
Ref: policy 12.5
Tag: usr-share-doc-symlink-to-foreign-package
Severity: serious
Certainty: certain
Info: If the package installs a symbolic link
/usr/share/doc/pkg1 -> pkg2, then pkg1
and pkg2 must both come from the same source package.
.
The best solution is probably to stop symlinking the
/usr/share/doc directory for this package and instead include a
real /usr/share/doc/pkg1 directory within pkg1 with the
appropriate contents (such as the copyright and
changelog.Debian.gz files).
Ref: policy 12.5
Tag: cannot-check-whether-usr-share-doc-symlink-points-to-foreign-package
Severity: minor
Certainty: possible
Info: There is a symlink /usr/share/doc/pkg1 -> pkg2
in your package. This means that pkg1 and pkg2 must
both come from the same source package. Lintian cannot check this right now
however.
.
Please reprocess this binary together with its source package to avoid
this tag.
Tag: old-fsf-address-in-copyright-file
Severity: normal
Certainty: certain
Info: The /usr/share/doc/pkg/copyright file refers to the old postal
address of the Free Software Foundation (FSF). The new address is:
.
Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
MA 02110-1301, USA.
Tag: helper-templates-in-copyright
Severity: important
Certainty: certain
Info: The /usr/share/doc/pkg/copyright file still contains
template markers from a packaging helper. Please fill in the actual
license, upstream copyright holders, and download information about the
package and remove any remaining templates generated by the packaging
helper.
Tag: copyright-refers-to-compressed-license
Severity: important
Certainty: certain
Info: The /usr/share/doc/pkg/copyright file refers to a standard license
/usr/share/common-licenses/{GPL,LGPL,Artistic,BSD}.gz as a compressed
file. Please update the reference (the licenses are installed
uncompressed).
Tag: usr-share-doc-symlink-points-outside-of-usr-share-doc
Severity: important
Certainty: certain
Info: The /usr/share/doc/pkg symbolic link is pointing to a directory
outside of /usr/share/doc.
Ref: policy 12.5
Tag: copyright-does-not-refer-to-common-license-file
Severity: normal
Certainty: certain
Info: If your package uses any one of the licenses in
/usr/share/common-licenses, the copyright file should refer to
files therein.
Ref: policy 12.5
Tag: copyright-refers-to-incorrect-directory
Severity: serious
Certainty: certain
Ref: policy 12.5
Info: In the directory name /usr/share/common-licenses, licenses is spelled
with an "s", not as licences with a "c".
Tag: copyright-file-lacks-pointer-to-perl-license
Severity: important
Certainty: possible
Ref: policy 12.5
Info: If your package is released under the same terms as Perl itself,
it should refer to the Artistic and GPL license files in the
/usr/share/common-licenses directory.
Tag: copyright-should-refer-to-common-license-file-for-apache-2
Severity: important
Certainty: possible
Ref: policy 12.5
Info: The strings "Apache License, Version" or "Apache-2" appear in the
copyright file for this package, but the copyright file does not
reference /usr/share/common-licenses as the location of the
Apache-2 on Debian systems.
.
If the package uses some other license that just mentions the Apache-2 and
that Lintian should detect as an exception, please file a Lintian bug.
If the copyright file must mention the Apache-2 for reasons other than
stating the license of the package, please add a Lintian override.
Tag: copyright-should-refer-to-common-license-file-for-gpl
Severity: important
Certainty: possible
Ref: policy 12.5
Info: The strings "GNU General Public License" or "GPL" appear in the
copyright file for this package, but the copyright file does not
reference /usr/share/common-licenses as the location of the GPL
on Debian systems.
.
If the package uses some other license that just mentions the GPL and
that Lintian should detect as an exception, please file a Lintian bug.
If the copyright file must mention the GPL for reasons other than stating
the license of the package, please add a Lintian override.
Tag: copyright-should-refer-to-common-license-file-for-gfdl
Severity: important
Certainty: possible
Ref: policy 12.5
Info: The strings "GNU Free Documentation License" or "GFDL" appear in the
copyright file for this package, but the copyright file does not
reference /usr/share/common-licenses as the location of the GFDL
on Debian systems.
.
If the package uses some other license that just mentions the GFDL and
that Lintian should detect as an exception, please file a Lintian bug.
If the copyright file must mention the GFDL for reasons other than stating
the license of the package, please add a Lintian override.
Tag: copyright-should-refer-to-common-license-file-for-lgpl
Severity: important
Certainty: possible
Ref: policy 12.5
Info: The strings "GNU Lesser General Public License", "GNU Library
General Public License", or "LGPL" appear in the copyright file for this
package, but the copyright file does not reference
/usr/share/common-licenses as the location of the LGPL on Debian
systems.
.
If the package uses some other license that just mentions the LGPL and
that Lintian should detect as an exception, please file a Lintian bug.
If the copyright file must mention the LGPL for reasons other than stating
the license of the package, please add a Lintian override.
Tag: copyright-has-url-from-dh_make-boilerplate
Severity: normal
Certainty: certain
Ref: policy 12.5
Info: There is "url://example.com" in your copyright file. This was most
likely a remnant from the dh_make template.
.
Make sure you include the real location where you obtained the
upstream sources (if any).
Tag: debian-copyright-file-uses-obsolete-national-encoding
Severity: serious
Certainty: certain
Ref: policy 12.5
Info: The Debian copyright file must be valid UTF-8, an encoding of
the Unicode character set.
.
There are many ways to convert a copyright file from an obsoleted encoding
like ISO-8859-1; you may for example use "iconv" like:
.
$ iconv -f ISO-8859-1 -t UTF-8 copyright > copyright.new
$ mv copyright.new copyright
Tag: copyright-contains-dh_make-todo-boilerplate
Severity: serious
Certainty: possible
Ref: policy 12.5
Info: The string "Please also look if..." appears in the copyright
file, which indicates that you either didn't check the whole source
to find additional copyright/license, or that you didn't remove that
paragraph after having done so.
Tag: copyright-contains-dh-make-perl-boilerplate
Severity: normal
Certainty: certain
Ref: policy 12.5
Info: The string "This copyright info was automatically extracted"
appears in the copyright file, which indicates that you either didn't
check the whole source to find additional copyright/license, or that
you didn't remove that paragraph after having done so.
Tag: copyright-with-old-dh-make-debian-copyright
Severity: pedantic
Certainty: certain
Info: The copyright file contains the incomplete Debian packaging
copyright boilerplate from older versions of dh_make.
(C) alone is not considered a valid copyright notice in some
countries. The word Copyright or the © symbol should be used
instead or in addition to (C).
.
Copyright notices like this are, in any country that's a signatory to the
Berne Convention, not required to claim copyright on a work, but their
presence may allow claiming additional damages should a copyright case go
to court. If you provide a notice, you may as well provide one that's
legally recognized in a broader range of countries.
Tag: copyright-refers-to-bad-php-license
Severity: serious
Certainty: possible
Info: This package appears to be covered by version 2.x of the PHP license,
which is not appropriate for anything other than the PHP interpreter
itself.
.
Note that PEAR modules are not a part of the PHP interpreter and cannot
use this license.
Ref: http://ftp-master.debian.org/REJECT-FAQ.html, #616436
Tag: copyright-refers-to-problematic-php-license
Severity: serious
Certainty: wild-guess
Info: This package appears to be covered by version 3.0 (exactly) of the
PHP license. This license is not applicable to anything that is not PHP
and has no contributions from the PHP Group.
Ref: http://ftp-master.debian.org/REJECT-FAQ.html
Tag: copyright-without-copyright-notice
Severity: normal
Certainty: certain
Ref: http://ftp-master.debian.org/REJECT-FAQ.html
Info: The copyright file for this package does not appear to contain a
copyright notice. You should copy the copyright notice from the upstream
source (or add one of your own for a native package). A copyright notice
must consist of Copyright, Copr., or the Unicode symbol of C in a circle
followed by the years and the copyright holder. A copyright notice is
not required for a work to be copyrighted, but Debian requires the
copyright file include the authors and years of copyright, and including
a valid copyright notice is the best way to do that. Examples:
.
Copyright YYYY Firstname Lastname <address@example.com>
Copr. YYYY-YYYY Firstname Lastname <address@example.com>
© YYYY,YYYY Firstname Lastname <address@example.com>
.
If the package is in the public domain rather than copyrighted, be sure
to mention "public domain" in the copyright file. Please be aware that
this is very rare and not the same as a DFSG-free license. True public
domain software is generally limited to such special cases as a work
product of a United States government agency.
Tag: spelling-error-in-copyright
Severity: minor
Certainty: possible
Info: Lintian found a spelling error in the copyright file. Lintian has a
list of common misspellings that it looks for. It does not have a
dictionary like a spelling checker does. If this is a spelling error in
the upstream license, in supporting email messages, or a case of Lintian
being confused by non-English text, add an override.
Tag: possible-gpl-code-linked-with-openssl
Severity: serious
Certainty: wild-guess
Info: This package appears to be covered by the GNU GPL but depends on
the OpenSSL libssl package and does not mention a license exemption or
exception for OpenSSL in its copyright file. The GPL (including version
3) is incompatible with some terms of the OpenSSL license, and therefore
Debian does not allow GPL-licensed code linked with OpenSSL libraries
unless there is a license exception explicitly permitting this.
.
If only the Debian packaging, or some other part of the package not
linked with OpenSSL, is covered by the GNU GPL, please add a lintian
override for this tag. Lintian currently has no good way of
distinguishing between that case and problematic packages.
Tag: copyright-refers-to-symlink-license
Severity: pedantic
Certainty: possible
Info: The copyright file refers to the versionless symlink in
/usr/share/common-licenses for the full text of the GPL, LGPL,
or GFDL license. This symlink is updated to point to the latest version
of the license when a new one is released. The package appears to allow
relicensing under later versions of its license, so this is legally
consistent, but it implies that Debian will relicense the package under
later versions of those licenses as they're released. It is normally
better to point to the version of the license the package references in
its license statement.
.
For example, if the package says something like "you may redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2, or (at your
option) any later version", the debian/copyright file should
refer to /usr/share/common-licenses/GPL-2, not /GPL.
.
For packages released under the same terms as Perl, Perl references the
GPL version 1, so point to /usr/share/common-licenses/GPL-1.
Tag: copyright-refers-to-versionless-license-file
Severity: normal
Certainty: possible
Info: The copyright file refers to the versionless symlink in
/usr/share/common-licenses for the full text of the GPL, LGPL,
or GFDL license, but the package does not appear to allow distribution
under later versions of the license. This symlink will change with each
release of a new version of the license and may therefore point to a
different version than the package is released under.
debian/copyright should instead refers to the specific version
of the license that the package references.
.
For example, if the package says something like "you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; version 2 dated June, 1991,"
the debian/copyright file should refer to
/usr/share/common-licenses/GPL-2, not /GPL.
Tag: copyright-refers-to-nonexistent-license-file
Severity: normal
Certainty: certain
Info: The copyright file refers to a license in
/usr/share/common-licenses that doesn't exist. Usually this is
a typo, such as accidentally omitting the - between the license
name and the version number.
Tag: copyright-refers-to-deprecated-bsd-license-file
Severity: minor
Certainty: certain
Ref: policy 12.5
Info: The copyright file refers to
/usr/share/common-licenses/BSD. Due to the brevity of this
license, the specificity of this copy to code whose copyright is held by
the Regents of the University of California, and the frequency of minor
wording changes in the license, its text should be included in the
copyright file directly rather than referencing this file.
.
This file may be removed from a future version of base-files if
references to it drop sufficiently.
Tag: copyright-has-crs
Severity: pedantic
Certainty: certain
Info: The copyright file has lines ending in CRLF instead of just LF.
.
Running the following command against the given file removes any
CR character in the file:
.
sed -i 's/\r//g' path/to/file
lintian-2.5.22ubuntu1/checks/control-files.pm 0000664 0000000 0000000 00000006217 12313507507 016043 0 ustar # control-files -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz and Richard Braakman
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::control_files;
use strict;
use warnings;
use autodie;
use Lintian::Tags qw(tag);
sub octify {
my (undef, $val) = @_;
return oct($val);
}
my $DEB_PERMISSIONS
= Lintian::Data->new('control-files/deb-permissions', qr/\s++/o, \&octify);
my $UDEB_PERMISSIONS
= Lintian::Data->new('control-files/udeb-permissions', qr/\s++/o, \&octify);
sub run {
my (undef, $type, $info) = @_;
my $ctrl = $type eq 'udeb' ? $UDEB_PERMISSIONS : $DEB_PERMISSIONS;
my $ctrl_alt = $type eq 'udeb' ? $DEB_PERMISSIONS : $UDEB_PERMISSIONS;
# process control-index file
foreach my $file ($info->sorted_control_index) {
my ($owner, $operm, $experm);
# the control.tar.gz should only contain files (and the "root"
# dir, but that is excluded from the index)
if (not $file->is_regular_file) {
tag 'control-file-is-not-a-file', $file;
# Doing further checks is probably not going to yield anything
# remotely useful.
next;
}
# valid control file?
unless ($ctrl->known($file)) {
if ($ctrl_alt->known($file)) {
tag 'not-allowed-control-file', $file;
next;
} else {
tag 'unknown-control-file', $file;
next;
}
}
$experm = $ctrl->value($file);
if ($file->size == 0) {
tag 'control-file-is-empty', $file;
}
# skip `control' control file (that's an exception: dpkg
# doesn't care and this file isn't installed on the systems
# anyways)
next if $file eq 'control';
$operm = $file->operm;
# correct permissions?
unless ($operm == $experm) {
tag 'control-file-has-bad-permissions',
sprintf('%s %04o != %04o', $file, $operm, $experm);
}
$owner = $file->owner . '/' . $file->group;
# correct owner?
unless ($owner eq 'root/root') {
tag 'control-file-has-bad-owner', "$file $owner != root/root";
}
# for other maintainer scripts checks, see the scripts check
}
return;
} #
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/apache2.desc 0000664 0000000 0000000 00000014420 12310413144 015051 0 ustar Check-Script: apache2
Author: Arno Töll
Abbrev: apache2
Type: binary
Info: Checks various build mistakes in Apache2 reverse dependencies
Needs-Info: bin-pkg-control, index, scripts, unpacked
Tag: non-standard-apache2-module-package-name
Severity: normal
Certainty: certain
Info: The package appears to be an Apache2 HTTPD server module but it isn't
following the module naming scheme. Apache2 HTTPD modules should be called
libapache2-mod-name with mod-name being the actual
mod_name.so equivalent.
Tag: apache2-module-depends-on-real-apache2-package
Severity: serious
Certainty: certain
Info: The package is an Apache2 HTTPD server module but it depends on a real
Apache2 package. Binary module packages must depend on the virtual
apache2-api-YYYYMMNN package only in order to ease transitions in
future.
.
In particular, module packages must not pull the full web server or any of its
associated data packages as a dependency. That's left to the user.
Tag: apache2-module-does-not-depend-on-apache2-api
Severity: serious
Certainty: certain
Info: The package is an Apache2 HTTPD server module but does not declare a
strong binary relation against the Apache2 server binary it links against. Modules
must depend on the apache2-api-YYYYMMNN package provided as a virtual
package by apache2-bin.
Tag: apache2-module-does-not-ship-load-file
Severity: serious
Certainty: certain
Info: The package is an Apache2 HTTPD server module but does not ship a
".load" file or it was installed under an unexpected name. The load
files in "/etc/apache2/mods-available" are required to interact with
the server package to enable and disable the module and must match the module
name without "mod_ prefix, e.g. mod_foo must ship a load file
named "foo.load".
Tag: apache2-reverse-dependency-ships-file-in-not-allowed-directory
Severity: serious
Certainty: certain
Info: The package installs a piece of Apache2 configuration to
/etc/apache2/{sites,mods,conf}-enabled. This is not allowed. Instead
the respective /etc/apache2/{sites,mods,conf}-available counterparts
must be used.
Tag: non-standard-apache2-configuration-name
Severity: normal
Certainty: certain
Info: The package appears to be a web application which is installing a
configuration file for the Apache2 HTTPD server. To avoid name clashes, any file
installed to /etc/apache2/{sites,conf}-available should match the binary package
name and must not start with local-.
Tag: apache2-reverse-dependency-calls-wrapper-script
Severity: normal
Certainty: certain
Info: The package is calling an Apache2 configuration wrapper script (e.g.
a2enmod, a2enconf, a2enconf, ...). Maintainer
scripts should not be calling these scripts directly. To achieve a uniform and
consolidated behavior these scripts should be invoked indirectly by using
apache2-maintscript-helper.
Tag: web-application-depends-on-apache2-data-package
Severity: normal
Certainty: certain
Info: The package appears to be a web application but declares a package
relation with apache2-bin, apache2-data or any of its
transitional packages. However, web applications are rarely bound to a specific
web server version. Thus, they should depend on apache2 only instead.
If a web application is actually tied to a particular binary version of the web
server a dependency against the virtual apache2-api-YYYYMMDD package
is more appropriate.
Tag: web-application-should-not-depend-unconditionally-on-apache2
Severity: normal
Certainty: certain
Info: The package appears to be a web application but declares a dependency
against apache2 without any alternative. Most web applications should
work with any decent web server, thus such a package should be satisfied if any
web server providing the virtual "httpd" package is installed. This
can be accomplished by declaring a package relation in the form "apache2 |
httpd".
Tag: apache2-reverse-dependency-calls-invoke-rc.d
Severity: normal
Certainty: certain
Info: The package is invoking apache2's init script in its maintainer script
albeit it shouldn't do so. Reverse dependencies installing apache2
configuration pieces should not restart the web server unconditionally in
maintainer scripts. Instead they should be using apache2-maintscript-helper
which correctly obeys local policies.
Tag: apache2-reverse-dependency-uses-obsolete-directory
Severity: normal
Certainty: certain
Info: The package is installing a file into the obsolete
/etc/apache2/conf.d/ directory. This file is not read by the Apache2
2.4 web server anymore. Instead /etc/apache2/conf-available/ should be
used.
Tag: apache2-configuration-files-need-conf-suffix
Severity: important
Certainty: certain
Info: The package is installing an Apache2 configuration but that file does not
end with a '.conf' suffix. Starting with Apache2 2.4 all configuration
files except module '.load' files need that suffix or are ignored otherwise.
Tag: apache2-unparsable-dependency
Severity: normal
Certainty: certain
Info: The package is declaring a module dependency within an Apache
configuration file which does not meet the requirements. Dependencies must be
declared without paths, leading "mod_" prefix and without file
extension.
Tag: apache2-unsupported-dependency
Severity: normal
Certainty: certain
Info: The package is declaring a module dependency within an Apache
configuration file which is not supported there. Dependencies are supported in
module '.load' files, and web application '.conf' files,
conflicts in '.load files only.
Tag: apache2-deprecated-auth-config
Severity: normal
Certainty: certain
Info: The package is using some of the deprecated authentication configuration
directives Order, Satisfy, Allow, Deny, <Limit> or <LimitExcept>
.
These do not integrate well with the new authorization scheme of Apache
2.4 and, in the case of <Limit> and <LimitExcept> have confusing
semantics. The configuration directives should be replaced with a suitable
combination of <RequireAll>, <RequireAny>, Require all, Require local,
Require ip, and Require method.
lintian-2.5.22ubuntu1/checks/rules.pm 0000664 0000000 0000000 00000044554 12311317616 014421 0 ustar # rules -- lintian check script -*- perl -*-
# Copyright (C) 2006 Russ Allbery
# Copyright (C) 2005 René van Bevern
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
package Lintian::rules;
use strict;
use warnings;
use autodie;
use Carp qw(croak);
use List::MoreUtils qw(any);
use Lintian::Data;
use Lintian::Tags qw(tag);
use Lintian::Util qw(is_ancestor_of rstrip);
our $PYTHON_DEPEND = 'python | python-dev | python-all | python-all-dev';
our $PYTHON3_DEPEND = 'python3 | python3-dev | python3-all | python3-all-dev';
our $PYTHON2X_DEPEND = 'python2.7 | python2.7-dev';
our $PYTHON3X_DEPEND = join(' | ', map { "python$_ | python$_-dev" } qw(3.2));
our $ANYPYTHON_DEPEND
= "$PYTHON_DEPEND | $PYTHON2X_DEPEND | $PYTHON3_DEPEND | $PYTHON3X_DEPEND";
my $KNOWN_MAKEFILES = Lintian::Data->new('rules/known-makefiles', '\|\|');
my $DEPRECATED_MAKEFILES = Lintian::Data->new('rules/deprecated-makefiles');
my $POLICYRULES = Lintian::Data->new('rules/policy-rules', qr/\s++/);
# forbidden construct in rules
my $BAD_CONSTRUCT_IN_RULES
= Lintian::Data->new('rules/rules-should-not-use', qr/\s*~~\s*/,
sub { return qr/$_[1]/xs });
# Certain build tools must be listed in Build-Depends even if there are no
# arch-specific packages because they're required in order to run the clean
# rule. (See Policy 7.6.) The following is a list of package dependencies;
# regular expressions that, if they match anywhere in the debian/rules file,
# say that this package is allowed (and required) in Build-Depends; and
# optional tags to use for reporting the problem if some information other
# than the default is required.
our @GLOBAL_CLEAN_DEPENDS = (
[ant => qr'^include\s*/usr/share/cdbs/1/rules/ant\.mk'],
[cdbs => qr'^include\s+/usr/share/cdbs/'],
[cdbs => qr'^include\s+/usr/share/R/debian/r-cran\.mk'],
[dbs => qr'^include\s+/usr/share/dbs/'],
['dh-make-php' => qr'^include\s+/usr/share/cdbs/1/class/pear\.mk'],
[debhelper => qr'^include\s+/usr/share/cdbs/1/rules/debhelper\.mk'],
[debhelper => qr'^include\s+/usr/share/R/debian/r-cran\.mk'],
[dpatch => qr'^include\s+/usr/share/cdbs/1/rules/dpatch\.mk'],
['gnome-pkg-tools' => qr'^include\s+/usr/share/gnome-pkg-tools/'],
[quilt => qr'^include\s+/usr/share/cdbs/1/rules/patchsys-quilt\.mk'],
[dpatch => qr'^include\s+/usr/share/dpatch/'],
['mozilla-devscripts' => qr'^include\s+/usr/share/mozilla-devscripts/'],
[quilt => qr'^include\s+/usr/share/quilt/'],
['ruby-pkg-tools' => qr'^include\s+/usr/share/ruby-pkg-tools/1/class/'],
['r-base-dev' => qr'^include\s+/usr/share/R/debian/r-cran\.mk'],
[
$ANYPYTHON_DEPEND => qr'/usr/share/cdbs/1/class/python-distutils\.mk',
'missing-python-build-dependency'
],
);
# A list of packages; regular expressions that, if they match anywhere in the
# debian/rules file, this package must be listed in either Build-Depends or
# Build-Depends-Indep as appropriate; and optional tags as above.
my @GLOBAL_DEPENDS =(
['dh-ocaml, ocaml-nox | ocaml' => qr'^\t\s*dh_ocaml(?:init|doc)\s'],
['python-central' => qr'^DEB_PYTHON_SYSTEM\s*:?=\s*pycentral'],
['python-support' => qr'^DEB_PYTHON_SYSTEM\s*:?=\s*pysupport'],
);
# Similarly, this list of packages, regexes, and optional tags say that if the
# regex matches in one of clean, build-arch, binary-arch, or a rule they
# depend on, this package is allowed (and required) in Build-Depends.
my @RULE_CLEAN_DEPENDS =(
[ant => qr'^\t\s*(\S+=\S+\s+)*ant\s'],
[debhelper => qr'^\t\s*dh_.+'],
['dh-ocaml, ocaml-nox | ocaml' => qr'^\t\s*dh_ocamlinit\s'],
[dpatch => qr'^\t\s*(\S+=\S+\s+)*dpatch\s'],
['po-debconf' => qr'^\t\s*debconf-updatepo\s'],
[$PYTHON_DEPEND => qr'^\t\s*python\s', 'missing-python-build-dependency'],
[
$PYTHON3_DEPEND => qr'^\t\s*python3\s',
'missing-python-build-dependency'
],
[
$ANYPYTHON_DEPEND => qr'\ssetup\.py\b',
'missing-python-build-dependency'
],
[quilt => qr'^\t\s*(\S+=\S+\s+)*quilt\s'],
);
# Rules about required debhelper command ordering. Each command is put into a
# class and the tag is issued if they're called in the wrong order for the
# classes. Unknown commands won't trigger this flag.
my %debhelper_order = (
dh_makeshlibs => 1,
dh_shlibdeps => 2,
dh_installdeb => 2,
dh_gencontrol => 2,
dh_builddeb => 3
);
sub run {
my (undef, undef, $info, undef, $group) = @_;
my $rules = $info->debfiles('rules');
# Policy could be read as allowing debian/rules to be a symlink to
# some other file, and in a native Debian package it could be a
# symlink to a file that we didn't unpack. Warn if it's a symlink
# (dpkg-source does as well) and skip all the tests if we then
# can't read it.
if (-l $rules) {
tag 'debian-rules-is-symlink';
return unless -f $rules and is_ancestor_of($info->debfiles, $rules);
}
my $architecture = $info->field('architecture', '');
my $version = $info->field('version');
# If the version field is missing, we assume a neutral non-native one.
$version = '0-1' unless defined $version;
open(my $rules_fd, '<', $rules);
# Check for required #!/usr/bin/make -f opening line. Allow -r or -e; a
# strict reading of Policy doesn't allow either, but they seem harmless.
my $start = <$rules_fd>;
tag 'debian-rules-not-a-makefile'
unless $start =~ m%^\#!\s*/usr/bin/make\s+-[re]?f[re]?\s*$%;
# Holds which dependencies are required. The keys in %needed and
# %needed_clean are the dependencies; the values are the tags to use or the
# empty string to use the default tag.
my (%needed, %needed_clean);
# Scan debian/rules. We would really like to let make do this for
# us, but unfortunately there doesn't seem to be a way to get make
# to syntax-check and analyze a makefile without running at least
# $(shell) commands.
#
# We skip some of the rule analysis if debian/rules includes any
# other files, since to chase all includes we'd have to have all
# of its build dependencies installed.
local $_;
my @arch_rules = (qr/^clean$/, qr/^binary-arch$/, qr/^build-arch$/);
my @indep_rules = (qr/^build$/, qr/^build-indep$/, qr/^binary-indep$/);
my (@current_targets, %rules_per_target, %debhelper_group);
my %seen;
my $maybe_skipping;
my %variables;
my $uses_makefile_pl = 0;
my $includes = 0;
while (<$rules_fd>) {
while (s,\\$,, and defined(my $cont = <$rules_fd>)) {
$_ .= $cont;
}
my $line = $_;
next if /^\s*\#/;
if (m/^\s*[s-]?include\s+(\S++)/o){
my $makefile = $1;
my $targets = $KNOWN_MAKEFILES->value($makefile);
if (defined $targets){
foreach my $target (split m/\s*+,\s*+/o, $targets){
$seen{$target}++ if $POLICYRULES->known($target);
}
} else {
$includes = 1;
}
if ($DEPRECATED_MAKEFILES->known($makefile)){
tag 'debian-rules-uses-deprecated-makefile', "line $.",
$makefile;
}
}
$uses_makefile_pl = 1 if m/Makefile\.PL/o;
# Check for DH_COMPAT settings outside of any rule, which are now
# deprecated. It's a bit easier structurally to do this here than in
# debhelper.
if (/^\s*(?:export\s+)?DH_COMPAT\s*:?=/ && keys(%seen) == 0) {
tag 'debian-rules-sets-DH_COMPAT', "line $.";
}
# Check for problems that can occur anywhere in debian/rules.
if ( m/^\t\s*-(?:\$[\(\{]MAKE[\}\)]|make)\s.*(?:dist)?clean/s
|| m/^\t\s*(?:\$[\(\{]MAKE[\}\)]|make)\s(?:.*\s)?-(\w*)i.*(?:dist)?clean/s
) {
# Ignore "-C" (#671537)
if (not $1 or $1 !~ m,^C,) {
tag 'debian-rules-ignores-make-clean-error', "line $.";
}
}
# check generic problem
foreach my $bad_construct ($BAD_CONSTRUCT_IN_RULES->all) {
my $badregex = $BAD_CONSTRUCT_IN_RULES->value($bad_construct);
if ($line =~ m/$badregex/) {
tag $bad_construct, "line $.";
}
}
if ($uses_makefile_pl && m/install.*PREFIX/s && !/DESTDIR/) {
tag 'debian-rules-makemaker-prefix-is-deprecated', "line $.";
}
# General assignment - save the variable
if (/^\s*(?:\S+\s+)*?(\S+)\s*([:\?\+])?=\s*(.*+)?$/so) {
# This is far too simple from a theoretical PoV, but should do
# rather well.
my ($var, $atype, $value) = ($1, $2, $3);
$variables{$var} = $value;
}
# Keep track of whether this portion of debian/rules may be optional
if (/^ifn?(?:eq|def)\s/) {
$maybe_skipping++;
} elsif (/^endif\s/) {
$maybe_skipping--;
}
# Check for strings anywhere in debian/rules that have implications for
# our dependencies.
for my $rule (@GLOBAL_CLEAN_DEPENDS) {
if (/$rule->[1]/ and not $maybe_skipping) {
$needed_clean{$rule->[0]}
= $rule->[2] || $needed_clean{$rule->[0]} || '';
}
}
for my $rule (@GLOBAL_DEPENDS) {
if (/$rule->[1]/ && !$maybe_skipping) {
$needed{$rule->[0]} = $rule->[2] || $needed{$rule->[0]} || '';
}
}
# Listing a rule as a dependency of .PHONY is sufficient to make it
# present for the purposes of GNU make and therefore the Policy
# requirement.
if (/^(?:[^:]+\s)?\.PHONY(?:\s[^:]+)?:(.+)/s) {
my @targets = split(' ', $1);
local $_;
for (@targets) {
# Is it $(VAR) ?
if (m/^\$[\(\{]([^\)\}]++)[\)\}]$/) {
my $name = $1;
my $val = $variables{$name};
if ($val) {
# we think we know what it will expand to - note
# we ought to "delay" it was a "=" variable rather
# than ":=" or "+=".
for (split m/\s++/o, rstrip($val)) {
$seen{$_}++ if $POLICYRULES->known($_);
}
last;
}
# We don't know, so just mark the target as seen.
}
$seen{$_}++ if $POLICYRULES->known($_);
}
next; #.PHONY implies the rest will not match
}
if (!/^ifn?(?:eq|def)\s/ && m/^([^\s:][^:]*):+(.*)/s) {
my ($target_names, $target_dependencies) = ($1, $2);
@current_targets = split ' ', $target_names;
my @depends = map {
$_ = quotemeta $_;
s/\\\$\\\([^\):]+\\:([^=]+)\\=([^\)]+)\1\\\)/$2.*/g;
qr/^$_$/;
} split(' ', $target_dependencies);
for my $target (@current_targets) {
if ($target =~ m/%/o) {
my $pattern = quotemeta $target;
$pattern =~ s/\\%/.*/g;
for my $rulebypolicy ($POLICYRULES->all) {
$seen{$rulebypolicy}++ if $rulebypolicy =~ m/$pattern/;
}
} else {
# Is it $(VAR) ?
if ($target =~ m/^\$[\(\{]([^\)\}]++)[\)\}]$/) {
my $name = $1;
my $val = $variables{$name};
if ($val) {
# we think we know what it will expand to - note
# we ought to "delay" it was a "=" variable rather
# than ":=" or "+=".
local $_;
for (split m/\s++/o, rstrip($val)) {
$seen{$_}++ if $POLICYRULES->known($_);
}
last;
}
# We don't know, so just mark the target as seen.
}
$seen{$target}++ if $POLICYRULES->known($target);
}
if (any { $target =~ /$_/ } @arch_rules) {
push(@arch_rules, @depends);
}
}
undef %debhelper_group;
} elsif (/^define /) {
# We don't want to think the body of the define is part of
# the previous rule or we'll get false positives on tags
# like binary-arch-rules-but-pkg-is-arch-indep. Treat a
# define as the end of the current rule, although that
# isn't very accurate either.
@current_targets = ();
} else {
# If we have non-empty, non-comment lines, store them for
# all current targets and check whether debhelper programs
# are called in a reasonable order.
if (m/^\s+[^\#]/) {
my ($arch, $indep) = (0, 0);
for my $target (@current_targets) {
$rules_per_target{$target} ||= [];
push @{$rules_per_target{$target}}, $_;
$arch = 1 if (any { $target =~ /$_/ } @arch_rules);
$indep = 1 if (any { $target =~ /$_/ } @indep_rules);
$indep = 1 if $target eq '%';
$indep = 1 if $target =~ /^override_/;
}
if (not $maybe_skipping and ($arch or $indep)) {
my $table = \%needed;
$table = \%needed_clean if $arch;
for my $rule (@RULE_CLEAN_DEPENDS) {
my ($dep, $pattern, $tagname) = @$rule;
next unless /$pattern/;
$table->{$dep} = $tagname || $table->{$dep} || '';
}
}
if (m/^\s+(dh_\S+)\b/ and $debhelper_order{$1}) {
my $command = $1;
my ($package) = /\s(?:-p|--package=)(\S+)/;
$package ||= '';
my $group = $debhelper_order{$command};
$debhelper_group{$package} ||= 0;
if ($group < $debhelper_group{$package}) {
tag 'debian-rules-calls-debhelper-in-odd-order',
$command, "(line $.)";
} else {
$debhelper_group{$package} = $group;
}
}
}
}
}
close($rules_fd);
unless ($includes) {
my $rec_allindep = 0;
# Make sure all the required rules were seen.
for my $target ($POLICYRULES->all) {
unless ($seen{$target}) {
my $typerule = $POLICYRULES->value($target);
if($typerule eq 'required') {
tag 'debian-rules-missing-required-target', $target;
} elsif ($typerule eq 'recommended_allindep') {
tag 'debian-rules-missing-recommended-target', $target;
$rec_allindep++;
} elsif ($typerule eq 'goodpractice_dfsg') {
if ($version =~ /(dfsg|debian|ds)/) {
tag 'debian-rules-missing-good-practice-target-dfsg',
$target;
}
} else {
$typerule ||= '';
croak(
join(' ',
'unknown type of policy rules:',
"$typerule (target: $target)"));
}
}
}
if ($rec_allindep) {
my $all = 0;
my $notall = 0;
foreach my $p ($group->get_processables) {
next if $p->pkg_type eq 'source' or $p->pkg_type eq 'changes';
$all++ if $p->pkg_arch eq 'all';
$notall++ if $p->pkg_arch ne 'all';
}
tag 'package-would-benefit-from-build-arch-targets'
if $all && $notall;
}
}
# Make sure we have no content for binary-arch if we are arch-indep:
$rules_per_target{'binary-arch'} ||= [];
if ($architecture eq 'all' && scalar @{$rules_per_target{'binary-arch'}}) {
my $nonempty = 0;
foreach (@{$rules_per_target{'binary-arch'}}) {
# dh binary-arch is actually a no-op if there is no
# Architecture: any package in the control file
unless (m/^\s*dh\s+(?:binary-arch|\$\@)/) {
$nonempty = 1;
}
}
tag 'binary-arch-rules-but-pkg-is-arch-indep' if $nonempty;
}
# Make sure that all the required build dependencies are there. Don't
# issue missing-build-dependency errors for debhelper, since there's
# another test that does that and it would just be a duplicate.
my $build_regular = $info->relation('build-depends');
my $build_indep = $info->relation('build-depends-indep');
for my $package (keys %needed_clean) {
delete $needed{$package};
my $tag = $needed_clean{$package} || 'missing-build-dependency';
unless ($build_regular->implies($package)) {
if ($build_indep->implies($package)) {
tag 'clean-should-be-satisfied-by-build-depends', $package;
} else {
if ($tag eq 'missing-build-dependency') {
tag $tag, $package if $package ne 'debhelper';
} else {
tag $tag;
}
}
}
}
my $noarch = $info->relation_noarch('build-depends-all');
for my $package (keys %needed) {
my $tag = $needed{$package} || 'missing-build-dependency';
unless ($noarch->implies($package)) {
if ($tag eq 'missing-build-dependency') {
tag $tag, $package;
} else {
tag $tag;
}
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/control-file.pm 0000664 0000000 0000000 00000041105 12314366011 015645 0 ustar # control-file -- lintian check script -*- perl -*-
#
# Copyright (C) 2004 Marc Brockschmidt
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::control_file;
use strict;
use warnings;
use autodie;
use List::MoreUtils qw(any);
use List::Util qw(first);
use Lintian::Data ();
use Lintian::Relation ();
use Lintian::Tags qw(tag);
use Lintian::Util qw(file_is_encoded_in_non_utf8 read_dpkg_control
rstrip strip);
# The list of libc packages, used for checking for a hard-coded dependency
# rather than using ${shlibs:Depends}.
my @LIBCS = qw(libc6 libc6.1 libc0.1 libc0.3);
my $LIBCS = Lintian::Relation->new(join(' | ', @LIBCS));
my $src_fields = Lintian::Data->new('common/source-fields');
sub run {
my ($pkg, undef, $info) = @_;
my $dcontrol = $info->debfiles('control');
if (-l $dcontrol) {
tag 'debian-control-file-is-a-symlink';
}
# check that control is UTF-8 encoded
my $line = file_is_encoded_in_non_utf8($dcontrol);
if ($line) {
tag 'debian-control-file-uses-obsolete-national-encoding',
"at line $line";
}
# Nag about dh_make Vcs comment only once
my $seen_vcs_comment = 0;
open(my $fd, '<', $dcontrol);
while (<$fd>) {
s/\s*\n$//;
if (
m{\A \# \s* Vcs-(?:Git|Browser): \s*
(?:git|http)://git\.debian\.org/
(?:\?p=)?collab-maint/\.git}osmx
) {
# Emit it only once per package
tag 'control-file-contains-dh_make-vcs-comment'
unless $seen_vcs_comment++;
next;
}
next if /^\#/;
# line with field:
if (/^(\S+):/) {
my $field = lc($1);
if ($field =~ /^xs-vcs-/) {
my $base = $field;
$base =~ s/^xs-//;
tag 'xs-vcs-header-in-debian-control', $field
if $src_fields->known($base);
}
if ($field eq 'xc-package-type') {
tag 'xc-package-type-in-debian-control', "line $.";
}
unless (/^\S+: \S/ || /^\S+:$/) {
tag 'debian-control-has-unusual-field-spacing', "line $.";
}
# something like "Maintainer: Maintainer: bad field"
if (/^\Q$field\E: \s* \Q$field\E \s* :/xsmi) {
tag 'debian-control-repeats-field-name-in-value', "line $.";
}
}
}
close($fd);
eval {
# check we can parse it, but ignore the result - we will fetch
# the fields we need from $info.
read_dpkg_control($dcontrol);
};
if ($@) {
chomp $@;
$@ =~ s/^internal error: //;
$@ =~ s/^syntax error in //;
tag 'syntax-error-in-control-file', "debian/control: $@";
return;
}
my @package_names = $info->binaries;
foreach my $bin (@package_names) {
my $bfields = $info->binary_field($bin);
tag 'build-info-in-binary-control-file-section', "Package $bin"
if (first { $bfields->{"build-$_"} }
qw(depends depends-indep conflicts conflicts-indep));
foreach my $field (keys %$bfields) {
tag 'binary-control-field-duplicates-source',
"field \"$field\" in package $bin"
if ( $info->source_field($field)
&& $bfields->{$field} eq $info->source_field($field));
}
}
# Check that fields which should be comma-separated or
# pipe-separated have separators. Places where this tends to
# cause problems are with wrapped lines such as:
#
# Depends: foo, bar
# baz
#
# or with substvars. If two substvars aren't separated by a
# comma, but at least one of them expands to an empty string,
# there will be a lurking bug. The result will be syntactically
# correct, but as soon as both expand into something non-empty,
# there will be a syntax error.
#
# The architecture list can contain things that look like packages
# separated by spaces, so we have to remove any architecture
# restrictions first. This unfortunately distorts our report a
# little, but hopefully not too much.
#
# Also check for < and > relations. dpkg-gencontrol warns about
# them and then transforms them in the output to <= and >=, but
# it's easy to miss the error message. Similarly, check for
# duplicates, which dpkg-source eliminates.
for my $field (
qw(build-depends build-depends-indep
build-conflicts build-conflicts-indep)
) {
my $raw = $info->source_field($field);
my $rel;
next unless $raw;
$rel = Lintian::Relation->new($raw);
check_relation('source', $field, $raw, $rel);
}
for my $bin (@package_names) {
for my $field (
qw(pre-depends depends recommends suggests breaks
conflicts provides replaces enhances)
) {
my $raw = $info->binary_field($bin, $field);
my $rel;
next unless $raw;
$rel = $info->binary_relation($bin, $field);
check_relation($bin, $field, $raw, $rel);
}
}
# Make sure that a stronger dependency field doesn't imply any of
# the elements of a weaker dependency field. dpkg-gencontrol will
# fix this up for us, but we want to check the source package
# since dpkg-gencontrol may silently "fix" something that's a more
# subtle bug.
#
# Also check if a package declares a simple dependency on itself,
# since similarly dpkg-gencontrol will clean this up for us but it
# may be a sign of another problem, and check that the package
# doesn't hard-code a dependency on libc. We have to do the
# latter check here rather than in checks/fields to distinguish
# from dependencies created by ${shlibs:Depends}.
my @dep_fields = qw(pre-depends depends recommends suggests);
foreach my $bin (@package_names) {
for my $strong (0 .. $#dep_fields) {
next unless $info->binary_field($bin, $dep_fields[$strong]);
my $relation = $info->binary_relation($bin, $dep_fields[$strong]);
tag 'package-depends-on-itself', $bin, $dep_fields[$strong]
if $relation->implies($bin);
tag 'package-depends-on-hardcoded-libc', $bin, $dep_fields[$strong]
if $relation->implies($LIBCS)
and $pkg !~ /^e?glibc$/;
for my $weak (($strong + 1) .. $#dep_fields) {
next unless $info->binary_field($bin, $dep_fields[$weak]);
for my $dependency (split /\s*,\s*/,
$info->binary_field($bin, $dep_fields[$weak])) {
next unless $dependency;
tag 'stronger-dependency-implies-weaker', $bin,
"$dep_fields[$strong] -> $dep_fields[$weak]", $dependency
if $relation->implies($dependency);
}
}
}
}
# Check that every package is in the same archive area, except
# that sources in main can deliver both main and contrib packages.
# The source package may or may not have a section specified; if
# it doesn't, derive the expected archive area from the first
# binary package by leaving $area undefined until parsing the
# first binary section. Missing sections will be caught by other
# checks.
#
# Check any package that looks like a library -dev package for a
# dependency on a shared library package built from the same
# source. If found, such a dependency should have a tight version
# dependency on that package.
#
# Also accumulate short and long descriptions for each package so
# that we can check for duplication, but skip udeb packages.
# Ideally, we should check the udeb package descriptions
# separately for duplication, but udeb packages should be able to
# duplicate the descriptions of non-udeb packages and the package
# description for udebs is much less important or significant to
# the user.
my $area = $info->source_field('section');
if (defined $area) {
if ($area =~ m%^([^/]+)/%) {
$area = $1;
} else {
$area = 'main';
}
} else {
tag 'no-section-field-for-source';
}
my @descriptions;
foreach my $bin (@package_names) {
# Accumulate the description.
my $desc = $info->binary_field($bin, 'description');
my $bin_area;
if ($desc and $info->binary_package_type($bin) ne 'udeb') {
push @descriptions, [$bin, split("\n", $desc, 2)];
}
# If this looks like a -dev package, check its dependencies.
if ($bin =~ /-dev$/ and $info->binary_field($bin,'depends')) {
check_dev_depends($info, $bin,$info->binary_field($bin, 'depends'),
@package_names);
}
# Check mismatches in archive area.
$bin_area = $info->binary_field($bin, 'section');
next unless $area && $bin_area;
if ($bin_area =~ m%^([^/]+)/%) {
$bin_area = $1;
} else {
$bin_area = 'main';
}
next
if $area eq $bin_area
or ($area eq 'main' and $bin_area eq 'contrib');
tag 'section-area-mismatch', 'Package', $bin;
}
# Check for duplicate descriptions.
my (%seen_short, %seen_long);
for my $i (0 .. $#descriptions) {
my (@short, @long);
for my $j (($i + 1) .. $#descriptions) {
if ($descriptions[$i][1] eq $descriptions[$j][1]) {
my $package = $descriptions[$j][0];
push(@short, $package) unless $seen_short{$package};
}
next unless ($descriptions[$i][2] and $descriptions[$j][2]);
if ($descriptions[$i][2] eq $descriptions[$j][2]) {
my $package = $descriptions[$j][0];
push(@long, $package) unless $seen_long{$package};
}
}
if (@short) {
tag 'duplicate-short-description', $descriptions[$i][0], @short;
for (@short) { $seen_short{$_} = 1 }
}
if (@long) {
tag 'duplicate-long-description', $descriptions[$i][0], @long;
for (@long) { $seen_long{$_} = 1 }
}
}
# check the Build-Profiles field
# this has to checked here because the Build-Profiles field does not appear
# in DEBIAN/control and even if it should in the future, some binary
# packages might never be built in the first place because of build
# profiles
# check which profile names are supposedly supported according to the build
# dependencies
my %used_profiles;
for my $field (
qw(build-depends build-depends-indep build-conflicts build-conflicts-indep)
) {
if (my $value = $info->source_field($field)) {
# If the field does not contain "profile." then skip this
# part. They rarely do, so this is just a little
# "common-case" optimisation.
next if index($value, 'profile.') < 0;
for my $dep (split /\s*,\s*/, $value) {
for my $alt (split /\s*\|\s*/, $dep) {
while ($alt =~ /<([^>]+)>/g) {
for my $restr (split /\s+/, $1) {
if ($restr =~ m/^!?profile\.(.*)/) {
$used_profiles{$1} = 0;
}
}
}
}
}
}
}
# find those packages that do not get built because of a certain build
# profile
for my $bin (@package_names) {
my $raw = $info->binary_field($bin, 'build-profiles');
next unless $raw;
for my $prof (split /\s+/, $raw) {
if ($prof =~ s/^!//) {
$used_profiles{$prof} = 1;
}
}
}
# find out if the developer forgot to mark binary packages as not being
# built
while (my ($k, $v) = each(%used_profiles)) {
tag 'stageX-profile-used-but-no-binary-package-dropped'
if (($k eq 'stage1' || $k eq 'stage2') && $v == 0);
}
return;
}
# Check the dependencies of a -dev package. Any dependency on one of the
# packages in @packages that looks like the underlying library needs to
# have a version restriction that's at least as strict as the same upstream
# version.
sub check_dev_depends {
my ($info, $package, $depends, @packages) = @_;
strip($depends);
for my $target (@packages) {
next
unless ($target =~ /^lib[\w.+-]+\d/
and $target !~ /-(?:dev|docs?|common)$/);
my @depends = grep { /(?:^|[\s|])\Q$target\E(?:[\s|\(]|\z)/ }
split(/\s*,\s*/, $depends);
# If there are any alternatives here, something special is
# going on. Assume that the maintainer knows what they're
# doing. Otherwise, separate out just the versions.
next if any { /\|/ } @depends;
my @versions = sort map {
if (/^[\w.+-]+(?:\s*\(([^\)]+)\))/) {
$1;
} else {
'';
}
} @depends;
# If there's only one mention of this package, the dependency
# should be tight. Otherwise, there should be both >>/>= and
# <<= dependencies that mention the source, binary, or
# upstream version. If there are more than three mentions of
# the package, again something is weird going on, so we assume
# they know what they're doing.
if (@depends == 1) {
unless ($versions[0]
=~ /^\s*=\s*\$\{(?:binary:Version|Source-Version)\}/) {
# Allow "pkg (= ${source:Version})" if (but only if)
# the target is an arch:all package. This happens
# with a lot of mono-packages.
#
# Note, we do not check if the -dev package is
# arch:all as well. The version-substvars check
# handles that for us.
next
if $info->binary_field($target, 'architecture', '') eq 'all'
&& $versions[0] =~ /^\s*=\s*\$\{source:Version\}/;
tag 'weak-library-dev-dependency', "$package on $depends[0]";
}
} elsif (@depends == 2) {
unless (
$versions[0] =~ m/^\s*<[=<]\s* \$\{
(?: (?:binary|source):(?:Upstream-)?Version
|Source-Version)\}/xsm
&& $versions[1] =~ m/^\s*>[=>]\s* \$\{
(?: (?:binary|source):(?:Upstream-)?Version
|Source-Version)\}/xsm
) {
tag 'weak-library-dev-dependency',
"$package on $depends[0], $depends[1]";
}
}
}
return;
}
# Checks for duplicates in a relation, for missing separators and
# obsolete relation forms.
sub check_relation {
my ($pkg, $field, $rawvalue, $relation) = @_;
for my $dup ($relation->duplicates) {
tag 'duplicate-in-relation-field', 'in', $pkg,
"$field:", join(', ', @$dup);
}
$rawvalue =~ s/\n(\s)/$1/g;
$rawvalue =~ s/\[[^\]]*\]//g;
if (
$rawvalue =~ /(?:^|\s)
(
(?:\w[^\s,|\$\(]+|\$\{\S+:Depends\})\s*
(?:\([^\)]*\)\s*)?
)
\s+
(
(?:\w[^\s,|\$\(]+|\$\{\S+:Depends\})\s*
(?:\([^\)]*\)\s*)?
)/x
) {
my ($prev, $next) = ($1, $2);
for ($prev, $next) {
rstrip;
}
tag 'missing-separator-between-items', 'in', $pkg,
"$field field between '$prev' and '$next'";
}
while ($rawvalue =~ /([^\s\(]+\s*\([<>]\s*[^<>=]+\))/g) {
tag 'obsolete-relation-form-in-source', 'in', $pkg,"$field: $1";
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/infofiles.desc 0000664 0000000 0000000 00000005700 12310413144 015525 0 ustar Check-Script: infofiles
Author: Josip Rodin
Abbrev: info
Type: binary
Needs-Info: unpacked, file-info, index
Info: This script checks if a binary package conforms to info document policy.
Tag: info-document-not-compressed
Severity: important
Certainty: certain
Info: Info documents should be compressed with gzip -9.
Ref: policy 12.2
Tag: info-document-not-compressed-with-gzip
Severity: important
Certainty: certain
Info: Info documents should be compressed with gzip -9. This
file ends in .gz but doesn't appear to be a gzip-compressed
file.
Ref: policy 12.2
Tag: info-document-not-compressed-with-max-compression
Severity: important
Certainty: certain
Info: Info documents should be compressed with gzip -9. This
file is compressed with gzip, but without using maximum compression.
Ref: policy 12.2
Tag: info-document-has-wrong-extension
Severity: normal
Certainty: certain
Info: The info document has an extension other than info*.gz.
Tag: info-document-missing-dir-section
Severity: important
Certainty: certain
Info: This info document has no INFO-DIR-SECTION line.
install-info will be unable to determine the section into which
this info page should be put. The best solution is to add a line like:
.
@dircategory Development
.
to the texinfo source so that the generated info file will contain a
section. See /usr/share/info/dir for sections to choose from.
You will have to ensure that the build process builds new info files
rather than using ones built by upstream.
Tag: info-document-missing-dir-entry
Severity: important
Certainty: certain
Info: This info document has no directory entry. This is text between
START-INFO-DIR-ENTRY and END-INFO-DIR-ENTRY lines which is copied into
the dir file in /usr/share/info by
install-info. The best solution is to add lines like:
.
@direntry
* foo: (foo). Foo creator and editor
@end direntry
.
to the texinfo source so that the generated info file will contain an
appropriate entry. You will have to ensure that the build process builds
new info files rather than using ones built by upstream.
Tag: info-document-missing-image-file
Severity: normal
Certainty: certain
Info: This info document contains an "[image]" but the image file it
specifies is missing. Texinfo @image{} becomes
.
[image src="filename.png"]
.
in the .info. Emacs 22 and up info
mode can display this in a GUI if filename.png is in
/usr/share/info or if the src gives a path to the file
elsewhere.
.
If you put an image file in /usr/share/info then please name
it like the document so as to avoid name clashes. Eg. foo.info might
call an image foo-example1.png. If upstream does not do this already
then it may be easier to sed the src="" to a path
elsewhere, perhaps to share with a HTML rendition under say
/usr/share/doc/foo/html/.
lintian-2.5.22ubuntu1/checks/duplicate-files.pm 0000664 0000000 0000000 00000004212 12311317603 016320 0 ustar # duplicate-files -- lintian check script -*- perl -*-
# Copyright (C) 2011 Niels Thykier
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::duplicate_files;
use strict;
use warnings;
use autodie;
use List::MoreUtils qw(any);
use Lintian::Tags qw(tag);
sub run {
my (undef, undef, $info) = @_;
my %hashmap;
foreach my $file ($info->sorted_index){
my $md5 = $info->md5sums->{$file};
my $fs;
next unless defined $md5;
next unless $info->index($file)->is_regular_file;
# Ignore empty files; in some cases (e.g. python) a file is
# required even if it is empty and we are never looking at a
# substantial gain in such a case. Also see #632789
next unless $info->index($file)->size;
next unless $file =~ m{\A usr/share/doc/}xsmo;
$fs = $hashmap{$md5};
unless (defined $fs){
$fs = [$file];
$hashmap{$md5} = $fs;
} else {
push @$fs, $file;
}
}
foreach my $hash (keys %hashmap){
my @files = @{ $hashmap{$hash} };
next if scalar(@files) < 2;
if (any { m,changelog,io} @files) {
tag 'duplicate-changelog-files', sort @files;
} else {
tag 'duplicate-files', sort @files;
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/manpages.desc 0000664 0000000 0000000 00000026126 12310413144 015347 0 ustar Check-Script: manpages
Author: Christian Schwarz
Abbrev: man
Type: binary
Needs-Info: unpacked, file-info, index
Info: This script checks if a binary package conforms to manual page policy.
Tag: bad-link-to-undocumented-manpage
Severity: important
Certainty: certain
Info: The symbolic link should reference
"../man[237]/undocumented.[237].gz" for manual pages in
/usr/share/man or
"../../../share/man/man[237]/undocumented.[237].gz" for manual
pages in /usr/X11R6/man.
Tag: link-to-undocumented-manpage
Severity: normal
Certainty: certain
Info: Symbolic links to the undocumented(7) manual page may be provided
if no manual page is available, but that is deprecated.
.
The lack of a manual page is still a bug, and if at all possible you
should write one yourself.
.
For help with writing manual pages, refer to the Man-Page-HOWTO at
http://www.schweikhardt.net/man_page_howto.html, the examples created
by dh_make, or the
/usr/share/doc/man-db/examples directory.
If the package provides --help output, you might want to use
the help2man utility to generate a simple manual page.
Ref: policy 12.1
Tag: binary-without-manpage
Severity: normal
Certainty: possible
Info: Each binary in /usr/bin, /usr/sbin, /bin,
/sbin or /usr/games should have a manual page
.
Note that though the man program has the capability to check for
several program names in the NAMES section, each of these programs
should have its own manual page (a symbolic link to the appropriate
manual page is sufficient) because other manual page viewers such as
xman or tkman don't support this.
.
If the name of the man page differs from the binary by case, man may
be able to find it anyway; however, it is still best practice to make the
case of the man page match the case of the binary.
.
If the man pages are provided by another package on which this package
depends, lintian may not be able to determine that man pages are
available. In this case, after confirming that all binaries do have
man pages after this package and its dependencies are installed, please
add a lintian override.
Ref: policy 12.1
Tag: manpage-in-wrong-directory
Severity: important
Certainty: certain
Info: The manual page should be installed in the correct directory below
/usr/share/man/ or /usr/share/man/locale.
Only sections 1 through 9 should be used.
.
The section number in the filename should correspond with the section
number in the directory name.
Ref: policy 12.1
Tag: manpage-has-wrong-extension
Severity: important
Certainty: certain
Info: The manual page has an extension other than
"section[program].gz".
Ref: policy 12.1
Tag: manpage-not-compressed
Severity: important
Certainty: certain
Info: Manual pages have to be installed compressed (using "gzip -9").
Ref: policy 12.1
Tag: manpage-not-compressed-with-gzip
Severity: important
Certainty: certain
Info: Manual pages should be compressed with gzip -9.
Ref: policy 12.1
Tag: manpage-not-compressed-with-max-compression
Severity: important
Certainty: certain
Info: Manual pages should be compressed with gzip -9.
Ref: policy 12.1
Tag: manpage-has-bad-whatis-entry
Severity: normal
Certainty: certain
Info: Each manual page should start with a "NAME" section, which lists the
name and a brief description of the page separated by "\-". The "NAME"
section is parsed by lexgrog and used to generate a database that's
queried by commands like apropos and whatis. This tag indicates that
lexgrog was unable to parse the NAME section of this manual page.
.
For manual pages that document multiple programs, functions, files, or
other things, the part before "\-" should list each separated by a comma
and a space. Each thing listed must not contain spaces; a man page for a
two-part command like "fs listacl" must use something like "fs_listacl"
in the "NAME" section so that it can be parsed by lexgrog.
Ref: lexgrog(1), groff_man(7), groff_mdoc(7)
Tag: manpage-has-useless-whatis-entry
Severity: normal
Certainty: certain
Info: The whatis entry for this manual page (the brief description found
in the NAME section) is of the form:
.
program - manual page for program
.
This conveys no information about what the program is for and is
repetitive. The short description should contain brief information about
what the program is for to aid in searching with apropos and similar
programs.
.
If this manpage was generated by help2man, use the -n option to provide a
more meaningful description.
Tag: manpage-is-dh_make-template
Severity: important
Certainty: certain
Info: This manual page appears to be an unmodified or insufficiently
modified copy of the dh_make manual page template. It has a whatis entry
(the brief description found in the NAME section) of the form:
.
package - program to do something
.
Please double-check the manual page and replace the template language
with specific information about this program.
Tag: manpage-has-errors-from-man
Severity: normal
Certainty: certain
Info: This man page provokes warnings or errors from man.
.
"cannot adjust" or "can't break" are trouble with paragraph filling,
usually related to long lines. Adjustment can be helped by left
justifying, breaks can be helped with hyphenation, see "Manipulating
Filling and Adjusting" and "Manipulating Hyphenation" in the manual.
.
"can't find numbered character" usually means latin1 etc in the input, and
this warning indicates characters will be missing from the output. You can
change to escapes like \[:a] described on the groff_char man page.
.
Other warnings are often formatting typos, like missing quotes around a
string argument to .IP. These are likely to result in lost or malformed
output. See the groff_man (or groff_mdoc if using mdoc) man page for
information on macros.
.
This test uses man's --warnings option to enable groff
warnings that catch common mistakes, such as putting . or
' characters at the start of a line when they are intended as
literal text rather than groff commands. This can be fixed either by
reformatting the paragraph so that these characters are not at the start of
a line, or by adding a zero-width space (\&) immediately before
them.
.
At worst, warning messages can be disabled with the .warn directive, see
"Debugging" in the groff manual.
.
Lintian also stricter in regards to declaring manpage preprocessors.
.
To test this for yourself you can use the following command:
LC_ALL=en_US.UTF-8 MANROFFSEQ='' MANWIDTH=80 \
man --warnings -E UTF-8 -l -Tutf8 -Z <file> >/dev/null
Tag: manpage-has-errors-from-pod2man
Severity: normal
Certainty: certain
Info: This man page contains a section "POD ERRORS" generated by pod2man.
This sections lists errors in the POD syntax found by pod2man during the
generation of the man page.
Tag: bad-so-link-within-manual-page
Severity: important
Certainty: certain
Info: Manual files that use the .so links to include other pages should
only point to a path relative to the top-level manual hierarchy, e.g.
.
.so man3/boo.1.gz
Tag: empty-manual-page
Severity: important
Certainty: certain
Info: The referenced manual page is empty.
Tag: manpage-section-mismatch
Severity: normal
Certainty: certain
Info: A man page usually should contain a .TH header, specifying the
section. The section in this manpage doesn't match with the section in the
filename.
Ref: groff_man(7), man(1)
Tag: hyphen-used-as-minus-sign
Severity: wishlist
Certainty: possible
Info: This manual page seems to contain a hyphen where a minus sign was
intended. By default, "-" chars are interpreted as hyphens (U+2010) by
groff, not as minus signs (U+002D). Since options to programs use minus
signs (U+002D), this means for example in UTF-8 locales that you cannot
cut and paste options, nor search for them easily. The Debian groff
package currently forces "-" to be interpreted as a minus sign due to the
number of manual pages with this problem, but this is a Debian-specific
modification and hopefully eventually can be removed.
.
"-" must be escaped ("\-") to be interpreted as minus. If you really
intend a hyphen (normally you don't), write it as "\(hy" to emphasise
that fact. See groff(7) and especially groff_char(7) for details, and
also the thread starting with
http://lists.debian.org/debian-devel/2003/debian-devel-200303/msg01481.html
.
If you use some tool that converts your documentation to groff format,
this tag may indicate a bug in the tool. Some tools convert dashes of
any kind to hyphens. The safe way of converting dashes is to convert
them to "\-".
.
Because this error can occur very often, Lintian shows only the
first 10 occurrences for each man page and give the number of suppressed
occurrences. If you want to see all warnings, run Lintian with the
-d/--debug option.
Ref: /usr/share/doc/groff-base/README.Debian, groff_char(7)
Tag: FSSTND-dir-in-manual-page
Severity: wishlist
Certainty: certain
Info: The manual page references a directory that is specified
in the FSSTND but not in the FHS which is used by Debian.
This can be an indicator of a mismatch of the location of
files as installed for Debian and as described by the man page.
.
If you have to change file locations to abide by Debian Policy
please also patch the man page to mention these new locations.
Tag: binary-without-english-manpage
Severity: normal
Certainty: certain
Info: Each binary in /usr/bin, /usr/sbin, /bin,
/sbin or /usr/games should have a manual page. You don't
provide an english, only a translated manpage. Since english is fallback,
shipping only a non-english man page leaves most users without a man page
at all.
Tag: manpage-locale-dir-country-specific
Severity: normal
Certainty: certain
Ref: policy 12.1
Info: This package installs a manual page in a locale directory that
includes the country name. A country name should not be included in the
directory name unless it indicates a significant difference in the
language. The known cases where country names are appropriate are pt_BR
and zh_*. Please file a bug against Lintian if this is another case
where a country name is appropriate.
Tag: spelling-error-in-manpage
Severity: minor
Certainty: possible
Info: Lintian found a spelling error in the manpage. Lintian has a list
of common misspellings that it looks for. It does not have a
dictionary like a spelling checker does.
.
If the string containing the spelling error is translated with the help
of gettext (with the help of po4a, for example) or a similar tool,
please fix the error in the translations as well as the English text to
avoid making the translations fuzzy. With gettext, for example, this
means you should also fix the spelling mistake in the corresponding
msgids in the *.po files.
Tag: manpage-named-after-build-path
Severity: important
Certainty: certain
Info: The manual page appears to be named after its build path and
not after its content.
.
Please check your debian/rules or upstream Makefile.
lintian-2.5.22ubuntu1/checks/phppear.pm 0000664 0000000 0000000 00000020036 12311317615 014712 0 ustar # phppear -- lintian check script -*- perl -*-
# Copyright (C) 2013 Mathieu Parent
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::phppear;
use strict;
use warnings;
use autodie;
use Lintian::Tags qw(tag);
use Lintian::Relation;
sub run {
my ($pkg, $type, $info) = @_;
my $bdepends = $info->relation('build-depends');
my $package_type = 'unknown';
# PEAR or PECL package
my $package_xml = $info->index('package.xml');
my $package2_xml = $info->index('package2.xml');
if (defined($package_xml) || defined($package2_xml)) {
# Checking source builddep
if (!$bdepends->implies('pkg-php-tools')) {
tag 'pear-package-without-pkg-php-tools-builddep';
} else {
# Checking first binary relations
my @binaries = $info->binaries;
my $binary = $binaries[0];
my $depends = $info->binary_relation($binary, 'depends');
my $recommends = $info->binary_relation($binary, 'recommends');
my $breaks = $info->binary_relation($binary, 'breaks');
if (!$depends->implies('${phppear:Debian-Depends}')) {
tag 'pear-package-but-missing-dependency', 'Depends';
}
if (!$recommends->implies('${phppear:Debian-Recommends}')) {
tag 'pear-package-but-missing-dependency', 'Recommends';
}
if (!$breaks->implies('${phppear:Debian-Breaks}')) {
tag 'pear-package-but-missing-dependency', 'Breaks';
}
# Checking description
my $description = $info->binary_field($binary, 'description');
if ($description !~ /\$\{phppear:summary\}/) {
tag 'pear-package-not-using-substvar', '${phppear:summary}';
}
if ($description !~ /\$\{phppear:description\}/) {
tag 'pear-package-not-using-substvar','${phppear:description}';
}
# Checking overrides
my $overrides = $info->debfiles('pkg-php-tools-overrides');
if (-f $overrides) {
if (!$bdepends->implies('pkg-php-tools (>= 1~)')) {
tag 'pear-package-feature-requires-newer-pkg-php-tools',
'(>= 1~)', 'for package name overrides';
}
}
# Checking package2.xml
if (defined($package2_xml)) {
if (!$bdepends->implies('pkg-php-tools (>= 1.4~)')) {
tag 'pear-package-feature-requires-newer-pkg-php-tools',
'(>= 1.4~)', 'for package2.xml';
}
}
if (defined($package_xml) && $package_xml->is_regular_file) {
# Wild guess package type as in PEAR_PackageFile_v2::getPackageType()
open(my $package_xml_fd, '<', $info->unpacked($package_xml));
while (<$package_xml_fd>) {
if (
m{\A \s* <
(php|extsrc|extbin|zendextsrc|zendextbin)
release \s* /? > }xsm
) {
$package_type = $1;
last;
}
if (/^\s*/){
$package_type = 'bundle';
last;
}
}
close($package_xml_fd);
if ($package_type eq 'extsrc') { # PECL package
if (!$bdepends->implies('php5-dev')) {
tag 'pecl-package-requires-build-dependency',
'php5-dev';
}
if (!$bdepends->implies('dh-php5')) {
tag 'pecl-package-requires-build-dependency','dh-php5';
}
if (!$bdepends->implies('pkg-php-tools (>= 1.5~)')) {
tag
'pear-package-feature-requires-newer-pkg-php-tools',
'(>= 1.5~)', 'for PECL support';
}
}
}
}
}
# PEAR channel
my $channel_xml = $info->index('channel.xml');
if (defined($channel_xml)) {
if (!$bdepends->implies('pkg-php-tools')) {
tag 'pear-channel-without-pkg-php-tools-builddep';
} elsif (!$bdepends->implies('pkg-php-tools (>= 1.3~)')) {
tag 'pear-package-feature-requires-newer-pkg-php-tools',
'(>= 1.3~)', 'for PEAR channels support';
}
}
# Composer package
my $composer_json = $info->index('composer.json');
if ( !defined($package_xml)
&& !defined($package2_xml)
&& defined($composer_json)) {
if (!$bdepends->implies('pkg-php-tools')) {
tag 'composer-package-without-pkg-php-tools-builddep';
} elsif (!$bdepends->implies('pkg-php-tools (>= 1.7~)')) {
tag 'pear-package-feature-requires-newer-pkg-php-tools',
'(>= 1.7~)', 'for Composer package support';
}
}
# Check rules
if (
$bdepends->implies('pkg-php-tools')
&& ( defined($package_xml)
|| defined($package2_xml)
|| defined($channel_xml)
|| defined($composer_json))
) {
my $rules = $info->debfiles('rules');
if (not -l $rules
or (-f $rules and is_ancestor_of($info->debfiles, $rules))) {
my $has_buildsystem_phppear = 0;
my $has_addon_phppear = 0;
my $has_addon_phpcomposer= 0;
my $has_addon_php5 = 0;
open(my $rules_fd, '<', $rules);
while (<$rules_fd>) {
while (s,\\$,, and defined(my $cont = <$rules_fd>)) {
$_ .= $cont;
}
next if /^\s*\#/;
if (m/^\t\s*dh\s.*--buildsystem(?:=|\s+)(?:\S+,)*phppear\s/) {
$has_buildsystem_phppear = 1;
}
if (m/^\t\s*dh\s.*--with(?:=|\s+)(?:\S+,)*phppear\s/) {
$has_addon_phppear = 1;
}
if (m/^\t\s*dh\s.*--with(?:=|\s+)(?:\S+,)*phpcomposer\s/) {
$has_addon_phpcomposer = 1;
}
if (m/^\t\s*dh\s.*--with(?:=|\s+)(?:\S+,)*php5\s/) {
$has_addon_php5 = 1;
}
}
close($rules_fd);
if ( defined($package_xml)
|| defined($package2_xml)
|| defined($channel_xml)) {
if (!$has_buildsystem_phppear) {
tag 'missing-pkg-php-tools-buildsystem', 'phppear';
}
if (!$has_addon_phppear) {
tag 'missing-pkg-php-tools-addon', 'phppear';
}
if (($package_type eq 'extsrc') and not $has_addon_php5) {
tag 'missing-pkg-php-tools-addon', 'php5';
}
}
if ( !defined($package_xml)
&& !defined($package2_xml)
&& defined($composer_json)) {
if (!$has_addon_phpcomposer) {
tag 'missing-pkg-php-tools-addon', 'phpcomposer';
}
}
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/md5sums.desc 0000664 0000000 0000000 00000003716 12310413144 015151 0 ustar Check-Script: md5sums
Author: Christian Schwarz
Abbrev: md5
Type: binary
Needs-Info: md5sums, bin-pkg-control, index
Info: This script checks if md5sum control files are valid, if they are
provided by a binary package.
Tag: no-md5sums-control-file
Severity: wishlist
Certainty: certain
Info: This package does not contain an md5sums control file. This control
file listing the MD5 checksums of the contents of the package is not
required, but if present debsums can use it to verify that no files
shipped with your package have been modified. Providing it is
recommended.
.
If you are using debhelper to create your package, just add a call to
dh_md5sums at the end of your binary-indep or binary-arch
target, right before dh_builddeb.
Tag: malformed-md5sums-control-file
Severity: important
Certainty: certain
Info: The indicated line of the md5sums control file for this package was
malformed. Each line of an md5sums control file should contain an MD5
checksum, some whitespace, and then the path to the file corresponding to
that checksum.
Tag: md5sum-mismatch
Severity: important
Certainty: certain
Info: The md5sum listed for the file does not match the actual file
contents.
.
Usually, this error occurs during the package build process, if the
debian/tmp/ directory is touched after dh_md5sums
is run.
Tag: md5sums-lists-nonexistent-file
Severity: important
Certainty: certain
Info: The md5sums control file lists a file which is not included in the
package.
.
Usually, this error occurs during the package build process, if the
debian/tmp/ directory is touched after dh_md5sums
is run.
Tag: file-missing-in-md5sums
Severity: normal
Certainty: certain
Info: The package contains a file which isn't listed in the md5sums control
file.
.
Usually, this error occurs during the package build process, if the
debian/tmp/ directory is touched after dh_md5sums
is run.
lintian-2.5.22ubuntu1/checks/nmu.pm 0000664 0000000 0000000 00000011401 12311317614 014045 0 ustar # nmu -- lintian check script -*- perl -*-
# Copyright (C) 2004 Jeroen van Wolffelaar
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::nmu;
use strict;
use warnings;
use autodie;
use List::MoreUtils qw(any);
use List::Util qw(first);
use Lintian::Tags qw(tag);
sub run {
my (undef, undef, $info) = @_;
my $changelog_mentions_nmu = 0;
my $changelog_mentions_local = 0;
my $changelog_mentions_qa = 0;
my $changelog_mentions_team_upload = 0;
# This isn't really an NMU check, but right now no other check
# looks at debian/changelog in source packages. Catch a
# debian/changelog file that's a symlink.
if (-l $info->debfiles('changelog')) {
tag 'changelog-is-symlink';
return;
}
# Get some data from the changelog file.
my ($entry) = $info->changelog->data;
my $uploader = canonicalize($entry->Maintainer);
my $changes = $entry->Changes;
$changes =~ s/^(\s*\n)+//;
my $firstline = first { /^\s*\*/ } split('\n', $changes);
# Check the first line for QA, NMU or team upload mentions.
if ($firstline) {
local $_ = $firstline;
if (/\bnmu\b/i or /non-maintainer upload/i or m/LowThresholdNMU/io) {
unless (
m/
(?:ackno|\back\b|confir|incorporat).*
(?:\bnmu\b|non-maintainer)/xi
) {
$changelog_mentions_nmu = 1;
}
}
$changelog_mentions_local = 1 if /\blocal\s+package\b/i;
$changelog_mentions_qa = 1 if /orphan/i or /qa (?:group )?upload/i;
$changelog_mentions_team_upload = 1 if /team upload/i;
}
my $version = $info->field('version');
my $maintainer = canonicalize($info->field('maintainer', ''));
my $uploaders = $info->field('uploaders');
my $version_nmuness = 0;
my $version_local = 0;
# If the version field is missing, assume it to be a native,
# maintainer upload as it is probably the most likely case.
$version = '0-1' unless defined $version;
if ($version =~ /-[^.-]+(\.[^.-]+)?(\.[^.-]+)?$/) {
$version_nmuness = 1 if defined $1;
$version_nmuness = 2 if defined $2;
}
if ($version =~ /\+nmu\d+$/) {
$version_nmuness = 1;
}
if ($version =~ /\+b\d+$/) {
$version_nmuness = 2;
}
if ($version =~ /local/i) {
$version_local = 1;
}
my $upload_is_nmu = $uploader ne $maintainer;
if (defined $uploaders) {
my @uploaders = map { canonicalize($_) } split />\K\s*,\s*/,$uploaders;
$upload_is_nmu = 0 if any { /^\s*\Q$uploader\E\s*$/ } @uploaders;
}
if ($maintainer =~ /packages\@qa.debian.org/) {
tag 'orphaned-package-should-not-have-uploaders'
if defined $uploaders;
tag 'qa-upload-has-incorrect-version-number', $version
if $version_nmuness == 1;
tag 'changelog-should-mention-qa'
if !$changelog_mentions_qa;
} elsif ($changelog_mentions_team_upload) {
tag 'team-upload-has-incorrect-version-number', $version
if $version_nmuness == 1;
} else {
# Local packages may be either NMUs or not.
unless ($changelog_mentions_local || $version_local) {
tag 'changelog-should-mention-nmu'
if !$changelog_mentions_nmu && $upload_is_nmu;
tag 'source-nmu-has-incorrect-version-number', $version
if $upload_is_nmu && $version_nmuness != 1;
}
tag 'changelog-should-not-mention-nmu'
if $changelog_mentions_nmu && !$upload_is_nmu;
tag 'maintainer-upload-has-incorrect-version-number', $version
if !$upload_is_nmu && $version_nmuness;
}
return;
}
# Canonicalize a maintainer address with respect to case. E-mail addresses
# are case-insensitive in the right-hand side.
sub canonicalize {
my ($maintainer) = @_;
$maintainer =~ s/(<[^>\@]+\@)([\w.-]+)>/$1 . lc ($2)/e;
return $maintainer;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/fields.desc 0000664 0000000 0000000 00000131377 12314366011 015033 0 ustar Check-Script: fields
Author: Marc 'HE' Brockschmidt
Abbrev: fld
Type: binary, udeb, source
Needs-Info: debfiles, index
Info: This script checks the syntax of the fields in package control files,
as described in the Policy Manual.
Tag: unsupported-source-format
Severity: serious
Certainty: certain
Info: This package uses a different source package format than "1.0",
"3.0 (quilt)" or "3.0 (native)". Other package formats are supported by
dpkg-source, but they are not allowed in the Debian archive.
Tag: no-package-name
Severity: serious
Certainty: certain
Info: The package does not have a "Package:" field in its control file.
Ref: policy 5.3
Tag: bad-package-name
Severity: serious
Certainty: certain
Info: A package name should be at least two characters long, must consist
of the alphanumerics and "+" "-" and ".", and must start with an
alphanumeric character.
Ref: policy 5.6.7
Tag: package-not-lowercase
Severity: serious
Certainty: certain
Info: New packages should not use uppercase characters in their names.
Ref: policy 5.6.7
Tag: bad-provided-package-name
Severity: serious
Certainty: certain
Info: A package name should be at least two characters long, must consist
of the alphanumerics (lowercase characters only) and "+" "-" and ".", and
must start with an alphanumeric character.
Ref: policy 5.6.7
Tag: no-version-field
Severity: serious
Certainty: certain
Info: The package does not have a "Version:" field in its control file.
Ref: policy 5.3
Tag: bad-version-number
Severity: serious
Certainty: certain
Info: The version number fails one of the syntactic requirements of dpkg.
Ref: policy 5.6.12
Tag: debian-revision-not-well-formed
Severity: normal
Certainty: certain
Info: The debian version part (the part after the -) should consist of one
or two dot-separated parts: one for a regular maintainer release or two
for a source-NMU.
Ref: devref 5.11.2, policy 5.6.12
Tag: debian-revision-should-not-be-zero
Severity: important
Certainty: certain
Info: The debian version part (the part after the -) should start with one,
not with zero. This is to ensure that a correctly-done Maintainer Upload will
always have a higher version number than a Non-Maintainer upload: a NMU could
have been prepared which introduces this upstream version with
Debian-revision -0.1
Ref: devref 5.11.2
Tag: no-architecture-field
Severity: serious
Certainty: certain
Info: The package does not have an "Architecture:" field in its control file.
Ref: policy 5.3
Tag: magic-arch-in-arch-list
Severity: serious
Certainty: certain
Info: The special architecture value "any" only makes sense if it occurs
alone or (in a *.dsc file) together with "all". The value "all" may
appear together with other architectures in a *.dsc file but must
occur alone if used in a binary package.
Ref: policy 5.6.8, #626775
Tag: unknown-architecture
Severity: normal
Certainty: possible
Info: This package claims to be for an unknown architecture. The
architecture should be one of the values supported by dpkg or one of the
special values "all" or "any". The special value "source" is only used
in *.changes files and does not make sense in a binary package or a *.dsc
file.
Tag: too-many-architectures
Severity: serious
Certainty: certain
Info: A binary package should list exactly one architecture (the one it is
compiled for), or the special value "all" if it is architecture-independent.
Ref: policy 5.6.8
Tag: arch-wildcard-in-binary-package
Severity: serious
Certainty: certain
Info: Architecture wildcards, including the special architecture value
"any", do not make sense in a binary package. A binary package must
either be architecture-independent or built for a specific architecture.
Ref: policy 5.6.8
Tag: unknown-multi-arch-value
Severity: serious
Certainty: certain
Info: The package has an unknown value in its Multi-Arch field. The
value must be one of "no", "same", "foreign" or "allowed".
Tag: illegal-multi-arch-value
Severity: serious
Certainty: certain
Info: The package is architecture all and has the Multi-Arch same value.
.
This combination is not allowed by the Multi-Arch specification.
Ref: https://wiki.ubuntu.com/MultiarchSpec
Tag: font-package-not-multi-arch-foreign
Severity: normal
Certainty: certain
Info: This package is architecture all and hence requires a Multi-Arch
foreign value.
.
An Architecture: all package to satisfy the dependencies of a
foreign-architecture package, it must be marked Multi-Arch: foreign
or Multi-Arch: allowed.
Ref: https://wiki.ubuntu.com/MultiarchSpec#Dependencies_involving_Architecture:_all_packages/
Tag: aspell-package-not-arch-all
Severity: normal
Certainty: certain
Info: This package appears to be an aspell dictionary package, but it is
not Architecture: all. The binary hashes should be built at install-time
by calling aspell-autobuildhash, so the contents of the package should be
architecture-independent.
Ref: aspell-autobuildhash(8)
Tag: no-maintainer-field
Severity: serious
Certainty: certain
Info: The package does not have a "Maintainer:" field in its control file.
Ref: policy 5.3
Tag: maintainer-name-missing
Severity: serious
Certainty: certain
Info: The maintainer field seems to contain just an email address. It must
contain the package maintainer's name and email address.
Ref: policy 5.6.2
Tag: maintainer-address-missing
Severity: serious
Certainty: certain
Info: The maintainer field must contain the package maintainer's name and
email address, with the name followed by the address inside angle
brackets (< and >). The address seems to be missing.
Ref: policy 5.6.2
Tag: maintainer-address-malformed
Severity: serious
Certainty: certain
Info: The maintainer field could not be parsed according to the rules in
the Policy Manual.
Ref: policy 5.6.2
Tag: maintainer-address-looks-weird
Severity: normal
Certainty: possible
Info: The maintainer address does not have whitespace between the name
and the email address.
Tag: maintainer-address-is-on-localhost
Severity: serious
Certainty: certain
Info: The maintainer address includes localhost(.localdomain), which is
an invalid e-mail address.
Ref: policy 5.6.2
Tag: maintainer-address-causes-mail-loops-or-bounces
Severity: serious
Certainty: certain
Info: The maintainer e-mail address either loops back to itself because
it is set to package@packages.debian.org or
package@packages.qa.debian.org or references an email address
(typically a mailing list) which is known to bounce mails. Policy
states: The email address given in the Maintainer control field must
accept mail from those role accounts in Debian used to send automated
mails regarding the package. This includes non-spam mail from the bug-
tracking system.
Ref: policy 3.3
Tag: uploader-name-missing
Severity: serious
Certainty: certain
Info: The uploader field seems to contain just an email address. It must
contain the package uploader's name and email address.
Ref: policy 5.6.3
Tag: uploader-address-malformed
Severity: serious
Certainty: certain
Info: The uploader field could not be parsed according to the rules in
the Policy Manual.
Ref: policy 5.6.3
Tag: uploader-address-looks-weird
Severity: normal
Certainty: possible
Info: The uploader address does not have whitespace between the name
and the email address.
Tag: uploader-address-is-on-localhost
Severity: serious
Certainty: certain
Info: The uploader address includes localhost(.localdomain), which is
an invalid e-mail address.
Ref: policy 5.6.3
Tag: uploader-address-causes-mail-loops-or-bounces
Severity: serious
Certainty: certain
Info: The maintainer e-mail address either loops back to itself because
it is set to package@packages.debian.org or
package@packages.qa.debian.org or references an email address
(typically a mailing list) which is known to bounce mails. Policy
states: The email address given in the Maintainer control field must
accept mail from those role accounts in Debian used to send automated
mails regarding the package. This includes non-spam mail from the bug-
tracking system.
Ref: policy 3.3
Tag: wrong-debian-qa-address-set-as-maintainer
Severity: important
Certainty: certain
Info: Orphaned packages should no longer have the address
<debian-qa@lists.debian.org> in the Maintainer field.
.
The correct Maintainer field for orphaned packages is
Debian QA Group <packages@qa.debian.org>.
Ref: devref 5.9.4
Tag: wrong-debian-qa-group-name
Severity: important
Certainty: certain
Info: Orphaned packages should have "Debian QA Group
<packages@qa.debian.org>" in the maintainer field.
Ref: devref 5.9.4
Tag: no-human-maintainers
Severity: serious
Certainty: possible
Info: The Maintainer address for this package is a mailing list and there
are no Uploaders listed. Team-maintained packages must list the human
maintainers in the Uploaders field.
Ref: policy 3.3, devref 5.12
Tag: source-field-does-not-match-pkg-name
Severity: serious
Certainty: certain
Info: The source package's filename is not the same as the name given
in its Source field. The Source field should name the package.
Ref: policy 5.6.1
Tag: source-field-malformed
Severity: serious
Certainty: certain
Info: In debian/control or a .dsc file, the Source field
must contain only the name of the source package. In a binary package,
the Source field may also optionally contain the version number of the
corresponding source package in parentheses.
.
Source package names must consist only of lowercase letters, digits,
plus and minus signs, and periods. They must be at least two characters
long and must start with an alphanumeric character.
Ref: policy 5.6.1
Tag: essential-in-source-package
Severity: important
Certainty: certain
Info: This field should only appear in binary packages.
Ref: policy 5.6.9
Tag: essential-no-not-needed
Severity: normal
Certainty: certain
Info: Having "Essential: no" is the same as not having the field at all,
so it just makes the Packages file longer with no benefit.
Ref: policy 5.6.9
Tag: unknown-essential-value
Severity: important
Certainty: certain
Info: The only valid values for the Essential field are yes and no.
Ref: policy 5.6.9
Tag: no-section-field
Severity: normal
Certainty: certain
Info: The package does not have a "Section:" field in its control file.
.
The field is mandatory for source packages and optional for binary
packages, which use the source package's value as default is nothing
else is specified.
Ref: policy 5.3
Tag: unknown-section
Severity: normal
Certainty: certain
Info: The "Section:" field in this package's control file is not one of
the sections in use on the ftp archive. Valid sections are currently
admin, comm, cli-mono, database, debug, devel, doc,
editors, electronics, embedded, fonts, games, gnome, gnu-r,
gnustep, graphics, hamradio, haskell, httpd, interpreters,
java, kde, libdevel, libs, lisp, localization, kernel, mail,
math, misc, net, news, ocaml, oldlibs, otherosfs, perl,
php, python, ruby, science, shells, sound, tex, text,
utils, vcs, video, web, x11, xfce, zope.
.
The section name should be preceded by "non-free/" if the package
is in the non-free archive area, and by "contrib/" if the package
is in the contrib archive area.
Ref: policy 2.4
Tag: section-is-dh_make-template
Severity: serious
Certainty: certain
Info: The "Section:" field in this package's control file is set to
unknown. This is not a valid section, and usually means a dh_make
template control file was used and never modified to set the correct
section.
Ref: policy 2.4
Tag: wrong-section-for-udeb
Severity: normal
Certainty: certain
Info: udeb packages should have "Section: debian-installer".
Tag: no-priority-field
Severity: normal
Certainty: certain
Info: The package does not have a "Priority:" field in its control file.
.
The Priority field can be included in a binary package by passing
the -ip or -isp flags to dpkg-gencontrol when building the package.
The field is optional in binary packages.
Ref: policy 5.3
Tag: unknown-priority
Severity: important
Certainty: certain
Info: The "Priority:" field in this package's control file is not one of
the priorities defined in the Policy Manual.
Ref: policy 2.5
Tag: superfluous-clutter-in-homepage
Severity: normal
Certainty: certain
Info: The "Homepage:" field in this package's control file contains
superfluous markup around the URL, like enclosing < and >.
This is unnecessary and needlessly complicates using this information.
Ref: policy 5.6.23
Tag: bad-homepage
Severity: normal
Certainty: certain
Info: The "Homepage:" field in this package's control file does not
contain a valid absolute URL. Most probably you forgot to specify
the scheme (e.g. http).
.
This tag is also triggered if the scheme is not known by Lintian.
.
Please file a bug against Lintian, if this tag is triggered for a
valid homepage URL.
Tag: no-homepage-field
Severity: pedantic
Certainty: possible
Info: This non-native package lacks a Homepage field. If the
package has an upstream home page that contains useful information or
resources for the end user, consider adding a Homepage control
field to debian/control.
Ref: policy 5.6.23
Tag: homepage-in-binary-package
Severity: wishlist
Certainty: possible
Info: This non-native source package produces at least one binary package
with a Homepage field. However, the source package itself has
no Homepage field. Unfortunately, this results in some
source-based tools/services (e.g. the PTS) not linking to the homepage
of the upstream project.
.
If you move the Homepage field to the source paragraph in
debian/control then all binary packages from this source
will inherit the value by default.
Ref: policy 5.6.23
Tag: homepage-for-cpan-package-contains-version
Severity: minor
Certainty: certain
Info: The Homepage field for this package points to CPAN and the URL
includes the version. It's better to link to the unversioned CPAN page
so that the URL doesn't have to be updated for each new release. For
example, use:
.
http://search.cpan.org/dist/HTML-Template/
.
or
.
https://metacpan.org/release/HTML-Template/
.
not:
.
http://search.cpan.org/~samtregar/HTML-Template-2.9/
Tag: unknown-field-in-dsc
Severity: minor
Certainty: certain
Info: See the Policy Manual for a list of the possible fields in
a source package control file.
Ref: policy 5.4
Tag: unknown-field-in-control
Severity: minor
Certainty: possible
Info: See the Policy Manual for a list of the possible fields in
a binary package control file.
.
In udeb packages the fields pre-depends, conflicts, essential and
suggests are disallowed, but they can contain the new fields
subarchitecture and installer-menu-item.
Ref: policy 5.3
Tag: multiline-field
Severity: important
Certainty: certain
Info: Most control fields must have only a single line of data.
Ref: policy 5.1
Tag: alternates-not-allowed
Severity: important
Certainty: certain
Info: Only the "Depends", "Recommends", "Suggests" and "Pre-Depends"
fields may specify alternate dependencies using the "|" symbol.
Ref: policy 7.1
Tag: versioned-provides
Severity: important
Certainty: certain
Ref: policy 7.1
Info: The "Provides" field may not specify a version range.
Tag: obsolete-relation-form
Ref: policy 7.1
Severity: normal
Certainty: certain
Info: The forms "<" and ">" mean "<=" and ">=", not "<<"
and ">>" as one might expect. For that reason these forms are
obsolete, and should not be used in new packages. Use the longer forms
instead.
Tag: bad-version-in-relation
Ref: policy 5.6.12
Severity: important
Certainty: certain
Info: The version number used in this relationship does not match the
defined format of a version number.
Tag: package-relation-with-self
Severity: normal
Certainty: possible
Info: The package declares a relationship with itself. This is not very
useful, except in the case of a package Conflicting with itself, if its
package name doubles as a virtual package.
Tag: bad-relation
Severity: serious
Certainty: certain
Info: The package declares a relationship that could not be parsed according
to the rules given in the Policy Manual.
Ref: policy 7.1
Tag: new-essential-package
Severity: important
Certainty: possible
Info: This package has the Essential flag set. New Essential packages
are sufficiently rare that it seems worth warning about. They should
be discussed on debian-devel first.
Ref: policy 3.8
Tag: doc-package-depends-on-main-package
Severity: normal
Certainty: possible
Info: The name of this package suggests that it is a documentation package.
It is usually not desirable for documentation packages to depend on the
packages they document, because users may want to install the docs before
they decide whether they want to install the package. Also, documentation
packages are often architecture-independent, so on other architectures
the package on which it depends may not even exist.
Tag: depends-on-obsolete-package
Severity: important
Certainty: possible
Info: The package depends on a package that has been superseded.
If the superseded package is part of an ORed group, it should not be
the first package in the group.
Tag: ored-depends-on-obsolete-package
Severity: minor
Certainty: possible
Info: The package depends on an ORed group of packages which includes
a package that has been superseded.
Tag: build-depends-on-obsolete-package
Severity: important
Certainty: possible
Info: The package build-depends on a package that has been superseded.
If the superseded package is part of an ORed group, it should not be
the first package in the group.
Tag: ored-build-depends-on-obsolete-package
Severity: minor
Certainty: possible
Info: The package build-depends on an ORed group of packages which includes
a package that has been superseded.
Tag: depends-on-old-emacs
Severity: normal
Certainty: possible
Info: The package lists an old version of Emacs as its first dependency.
It should probably be updated to support the current version of Emacs
in the archive and then list that version first in the list of Emacs
flavors it supports.
.
If the package intentionally only supports older versions of Emacs (if,
for example, it was included with later versions of Emacs), add a lintian
override.
Tag: depends-on-metapackage
Severity: important
Certainty: possible
Info: This package is one of the packages that Lintian believes is a
metapackage: a package that exists for the convenience of users or
installers to install a set of related packages. Packages that are not
themselves metapackages must not depend on metapackages, since this may
prevent the user from removing portions of the package set they don't
need.
Tag: build-depends-on-metapackage
Severity: important
Certainty: certain
Info: Packages must not build-depend on metapackages.
.
Metapackages such as xorg, xorg-dev, x-window-system,
x-window-system-dev and x-window-system-core exist only for the
benefit of users and should not be used in package build
dependencies.
Tag: depends-on-essential-package-without-using-version
Severity: important
Certainty: certain
Ref: policy 3.5
Info: The package declares a depends on an essential package, e.g. dpkg,
without using a versioned depends. Packages do not need to depend on
essential packages; essential means that they will always be present.
The only reason to list an explicit dependency on an essential package
is if you need a particular version of that package, in which case the
version should be given in the dependency.
Tag: build-depends-on-essential-package-without-using-version
Severity: important
Certainty: certain
Ref: policy 4.2
Info: The package declares a build-depends on an essential package, e.g. dpkg,
without using a versioned depends. Packages do not need to build-depend on
essential packages; essential means that they will always be present.
The only reason to list an explicit dependency on an essential package
is if you need a particular version of that package, in which case the
version should be given in the dependency.
Tag: build-depends-on-an-obsolete-java-package
Severity: normal
Certainty: certain
Ref: java-policy 2.2
Info: The package build-depends on an obsolete Java dependency.
It should build-depend on default-jdk instead.
Tag: build-depends-on-non-build-package
Severity: important
Certainty: certain
Info: The package declares a build dependency on a package that is not
appropriate for build dependencies, usually because it's only for
interactive use or cannot be correctly installed in a build environment.
See the description or documentation of the package for more
information.
Tag: virtual-package-depends-without-real-package-depends
Severity: normal
Certainty: possible
Info: The package declares a depends on a virtual package without listing a
real package as an alternative first.
.
If this package could ever be a build dependency, it should list a real
package as the first alternative to any virtual package in its Depends.
Otherwise, the build daemons will not be able to provide a consistent
build environment.
.
If it will never be a build dependency, this isn't necessary, but you may
want to consider doing so anyway if there is a real package providing
that virtual package that most users will want to use.
Tag: invalid-arch-string-in-source-relation
Severity: important
Certainty: possible
Ref: policy 5.6.8
Info: The architecture string in the source relation includes an unknown
architecture. This may be a typo, or it may be an architecture that dpkg
doesn't know about yet. A common problem is incorrectly separating
architectures with a comma, such as [i386, m68k]. Architectures
are separated by spaces; this should instead be [i386 m68k].
Tag: conflicting-negation-in-source-relation
Severity: serious
Certainty: certain
Ref: policy 7.1
Info: The architecture string in this source relation has some
negated architectures (prepended by !) and others that are not
negated. This is not permitted by Policy. Either all architectures must
be negated or none of them may be.
Tag: invalid-restriction-term-in-source-relation
Severity: important
Certainty: certain
Info: The restriction list in the source relation includes a term which
does not contain exactly one dot separating restriction namespace and label.
A term in a restriction list is of the form "namespace.label" (without the
quotes).
Tag: invalid-restriction-namespace-in-source-relation
Severity: important
Certainty: possible
Info: The restriction list in the source relation includes a term with
an unknown namespace. The only allowed namespace is "profile" (without the
quotes).
Tag: invalid-restriction-label-in-source-relation
Severity: important
Certainty: possible
Info: The restriction list in the source relation includes a term with
an unknown label. The only allowed labels are "stage1", "stage2", "notest"
and "cross".
Tag: restriction-list-without-versioned-dpkg-dev-dependency
Severity: normal
Certainty: certain
Info: If a restriction list appears in the build dependencies, then the
source package has to build depend on dpkg-dev (>= 1.17.2) for minimal
restriction list support.
Tag: restriction-list-with-versioned-dpkg-dev-conflict
Severity: normal
Certainty: certain
Info: If a restriction list appears in the build dependencies, then the
source package has to build depend on dpkg-dev (>= 1.17.2) for minimal
restriction list support. It must not conflict with version 1.17.2.
Tag: restriction-list-with-debhelper-without-debhelper-version
Severity: normal
Certainty: certain
Info: If a restriction list appears in the build dependencies and the
package uses debhelper, then the source package has to depend on at least
debhelper 9.20140227.
Tag: restriction-list-with-debhelper-with-conflicting-debhelper-version
Severity: normal
Certainty: certain
Info: If a restriction list appears in the build dependencies and the
package uses debhelper, then the source package has to depend on at least
debhelper 9.20140227. It must not conflict with version 9.20140227.
Tag: depends-on-build-essential-package-without-using-version
Severity: important
Certainty: certain
Ref: policy 4.2
Info: The package declares a depends on a build essential package without
using a versioned depends. Packages do not have to build-depend on any
package included in build-essential. It is the responsibility of anyone
building packages to have all build-essential packages installed. The
only reason for an explicit dependency on a package included in
build-essential is if a particular version of that package is required,
in which case the dependency should include the version.
Tag: package-depends-on-an-x-font-package
Severity: important
Certainty: certain
Info: Packages must not depend on X Window System font packages.
.
If one or more of the fonts so packaged are necessary for proper operation
of the package with which they are associated the font package may be
Recommended; if the fonts merely provide an enhancement, a Suggests
relationship may be used.
Ref: policy 11.8.5
Tag: build-depends-indep-without-arch-indep
Severity: important
Certainty: certain
Ref: policy 7.7
Info: The control file specifies source relations for architecture-independent
packages, but no architecture-independent packages are built.
Tag: build-conflicts-with-build-dependency
Severity: important
Certainty: certain
Ref: policy 7.7
Info: The package build-conflicts with a package that it also
build-depends on.
Tag: package-has-a-duplicate-build-relation
Severity: normal
Certainty: possible
Info: The package declares the given build relations on the same package
in either Build-Depends or Build-Depends-Indep, but the build relations
imply each other and are therefore redundant.
Tag: build-depends-on-1-revision
Severity: normal
Certainty: possible
Info: The package declares a build dependency on a version of a package
with a -1 Debian revision such as "libfoo (>= 1.2-1)". Such a
dependency will not be satisfied by a backport of libfoo 1.2-1 and
therefore makes backporting unnecessarily difficult. Normally, the -1
version is unneeded and a dependency such as "libfoo (>= 1.2)" would
be sufficient. If there was an earlier -0.X version of libfoo that would
not satisfy the dependency, use "libfoo (>= 1.2-1~)" instead.
Tag: needlessly-depends-on-awk
Severity: important
Certainty: certain
Info: The package seems to declare a relation on awk. awk is a virtual
package, but it is special since it's de facto essential. If you don't
need to depend on a specific version of awk (which wouldn't work anyway,
as dpkg doesn't support versioned provides), you should remove the
dependency on awk.
Tag: package-depends-on-multiple-libstdc-versions
Severity: important
Certainty: possible
Info: The package seems to declare several relations to a libstdc version.
This is not only sloppy but in the case of libraries, it may well break
the runtime execution of programs.
Tag: package-depends-on-multiple-tcl-versions
Severity: important
Certainty: possible
Info: The package seems to declare several relations to a tcl version.
This is not only sloppy but in the case of libraries, it may well break
the runtime execution of programs.
Tag: package-depends-on-multiple-tclx-versions
Severity: important
Certainty: possible
Info: The package seems to declare several relations to a tclx version.
This is not only sloppy but in the case of libraries, it may well break
the runtime execution of programs.
Tag: package-depends-on-multiple-tk-versions
Severity: important
Certainty: possible
Info: The package seems to declare several relations to a tk version.
This is not only sloppy but in the case of libraries, it may well break
the runtime execution of programs.
Tag: package-depends-on-multiple-tkx-versions
Severity: important
Certainty: possible
Info: The package seems to declare several relations to a tkx version.
This is not only sloppy but in the case of libraries, it may well break
the runtime execution of programs.
Tag: package-depends-on-multiple-libpng-versions
Severity: important
Certainty: possible
Info: The package seems to declare several relations to a libpng version.
This is not only sloppy but in the case of libraries, it may well break
the runtime execution of programs.
Tag: depends-on-libdb1-compat
Severity: important
Certainty: certain
Info: The package seems to declare a relation on libdb1-compat.
This library exists for compatibility with applications built against
glibc 2.0 or 2.1. There is intentionally no corresponding development
package. Do not link new applications against this library!
Tag: depends-on-python-minimal
Severity: important
Certainty: certain
Info: The python-minimal package (and versioned variants thereof) exists
only to possibly become an Essential package. Depending on it is always
an error since it should never be installed without python. If it
becomes Essential, there is no need to depend on it, and until then,
packages that require Python must depend on python.
Tag: depends-exclusively-on-makedev
Severity: normal
Certainty: certain
Info: This package depends on makedev without a udev alternative. This
probably means that it doesn't have udev rules and relies on makedev to
create devices, which won't work if udev is installed and running.
Alternatively, it may mean that there are udev rules, but udev was not
added as an alternative to the makedev dependency.
Tag: dbg-package-missing-depends
Severity: normal
Certainty: certain
Info: The given binary package has a name of the form of "X-dbg", indicating it
contains detached debugging symbols for the package X. If so, it should
depend on the corresponding package, generally with (= ${binary:Version})
since the debugging symbols are only useful with the binaries created by
the same build.
.
If this package provides debugging symbols for multiple other
packages, it should normally depend on all of those packages as
alternatives. In other words, pkga (= ${binary:Version}) | pkgb (=
${binary:Version}) and so forth.
Tag: conflicts-with-dependency
Severity: important
Certainty: certain
Ref: policy 7.4
Info: The package seems to conflict with one of its dependencies,
recommendations, or suggestions by listing it in Conflicts or Breaks.
Tag: breaks-without-version
Severity: normal
Certainty: possible
Ref: policy 7.3, policy 7.4, #605744
Info: This package declares a Breaks relationship with another package
that has no version number. Normally, Breaks should be used to indicate
an incompatibility with a specific version of another package, or with
all versions predating a fix. If the two packages can never be installed
at the same time, Conflicts should normally be used instead.
.
Note this tag can also be issued, if a package has been split into two
completely new ones. In this case, this package is missing a Replaces
on the old package.
Tag: conflicts-with-version
Severity: normal
Certainty: wild-guess
Ref: policy 7.4
Info: An earlier-than version clause is normally an indication that Breaks
should be used instead of Conflicts. Breaks is a weaker requirement that
provides the package manager more leeway to find a valid upgrade path.
Conflicts should only be used if two packages can never be unpacked at
the same time, or for some situations involving virtual packages (where a
version clause is not appropriate). In particular, when moving files
between packages, use Breaks plus Replaces, not Conflicts plus Replaces.
Tag: bad-menu-item
Severity: important
Certainty: certain
Info: The field Installer-Menu-Item should only contain positive integer
values.
Tag: redundant-origin-field
Severity: normal
Certainty: certain
Info: You use the Origin field though the field value is the default (Debian).
In this case the field is redundant and should be removed.
Tag: binary-nmu-debian-revision-in-source
Severity: normal
Certainty: certain
Ref: devref 5.10.2.1
Info: The version number of your source package ends in +b and a number or
has a Debian revision containing three parts. These version numbers are
used by binary NMUs and should not be used as the source version. (The
+b form is the current standard; the three-part version number now
obsolete.)
Tag: dfsg-version-in-native-package
Severity: normal
Certainty: certain
Info: The version number of this package contains "dfsg", but it's a
native package. "dfsg" is conventionally used in the upstream version of
packages that are repackaged for Debian Free Software Guidelines
compliance reasons. The convention doesn't make sense in native
packages.
Tag: dfsg-version-with-period
Severity: minor
Certainty: possible
Info: The version number of this package contains ".dfsg", probably in a
form like "1.2.dfsg1". There is a subtle sorting problem with this
version method: 1.2.dfsg1 is considered a later version than 1.2.1. If
upstream adds another level to its versioning, finding a good version
number for the next upstream release will be awkward.
.
Upstream may never do this, in which case this isn't a problem, but it's
normally better to use "+dfsg" instead (such as "1.2+dfsg1"). "+" sorts
before ".", so 1.2 < 1.2+dfsg1 < 1.2.1 as normally desired.
Tag: dfsg-version-misspelled
Severity: minor
Certainty: certain
Info: The version number of this package contains "dsfg". You probably
meant "dfsg", the conventional marker for upstream packages that are
repackaged for Debian Free Software Guidelines compliance reasons.
Tag: redundant-bugs-field
Severity: normal
Certainty: certain
Info: You use the Bugs field though the field value is the default
(debbugs://bugs.debian.org/). In this case the field is redundant and
should be removed.
Tag: build-depends-on-build-essential
Info: You depend on the build-essential package, which is only a
metapackage depending on build tools that have to be installed in all
build environments.
Severity: important
Certainty: certain
Ref: policy 7.7
Tag: depends-on-packaging-dev
Info: You depend/recommend/build-depend on packaging-dev, which is
only a metapackage to install common packages needed for packaging.
Severity: normal
Certainty: certain
Tag: malformed-python-version
Severity: important
Certainty: certain
Ref: python-policy 2.3
Info: The Python-Version control field is not in one of the valid
formats. It should be in one of the following formats:
.
all
current
current, >= X.Y
>= X.Y
>= A.B, << X.Y
A.B, X.Y
.
(One or more specific versions may be listed with the last form.) A.B
and X.Y should be Python versions.
Tag: malformed-dm-upload-allowed
Severity: important
Certainty: certain
Ref: http://www.debian.org/vote/2007/vote_003
Info: The Dm-Upload-Allowed field in this package is set to something
other than "yes". The only standardized value for this field in the
Debian GR is "yes" and other values (including capitalization variants)
may not work as expected.
Tag: wrong-section-according-to-package-name
Severity: normal
Certainty: possible
Info: This package has a name suggesting that it belongs to a section
other than the one it is currently categorized in.
Tag: debug-package-should-be-priority-extra
Severity: normal
Certainty: certain
Info: This package has a name suggesting that it contains detached
debugging symbols. If so, it should have priority "extra" since users
normally do not need such packages.
Tag: maintainer-also-in-uploaders
Severity: minor
Certainty: certain
Info: The maintainer value also appears on the Uploaders field.
There were some reasons why this was useful when Uploaders support was
first introduced, but those have long-since been fixed and there is no
longer any need to list the maintainer in Uploaders. The duplicate
information should probably be removed.
Tag: duplicate-uploader
Severity: minor
Certainty: certain
Info: The uploader appears more than once in the Uploaders
field. The duplicate information should be removed.
Tag: versioned-dependency-satisfied-by-perl
Severity: normal
Certainty: certain
Info: This package declares an unnecessary versioned dependency
on a package that is also provided by one of the Perl core packages
(perl, perl-base, perl-modules) with at least the required version.
.
As versioned dependencies are not satisfied by provided packages,
this unnecessarily pulls in a separately packaged newer version
of the module.
.
The recommended way to express the dependency without needless
complications on backporting packages is to use alternative dependencies.
The perl package should be the preferred alternative and the
versioned dependency a secondary one.
.
Example: perl (>= 5.10.0) | libmodule-build-perl (>= 0.26)
.
An exception to this is when the dependency is only satisfied in a
version of perl in experimental. In this case, the dependency on perl
should come second.
.
Example: libextutils-parsexs-perl (>= 2.210000) | perl (>= 5.14)
.
Running cme fix dpkg -from control -filter Depends should be able
to update these dependencies.
Ref: policy 7.5
Tag: package-superseded-by-perl
Severity: normal
Certainty: certain
Info: This package is also provided by one of the Perl core packages
(perl, perl-base, perl-modules), and the core version is at least
as new as this one.
.
The package should either be upgraded to a newer upstream version
or removed from the archive as unnecessary. In the removal case, any
versioned dependencies on this package must first be changed to include
the Perl core package (because versioned dependencies are not satisfied
by provided packages).
.
The recommended way to express the dependency without needless
complications on backporting packages is to use alternative dependencies.
The perl package should be the preferred alternative and the
versioned dependency a secondary one.
.
Example: perl (>= 5.10.0) | libmodule-build-perl (>= 0.26)
.
Running cme fix dpkg -from control -filter Depends should be able
to update these dependencies.
Ref: policy 7.5
Tag: vcs-field-uses-not-recommended-uri-format
Severity: normal
Certainty: possible
Info: The VCS-* field uses a URI which doesn't match the recommended
format, but still looks valid. Examples for not recommended URI formats
are protocols that require authentication (like SSH). Instead where
possible you should provide a URI that is accessible for everyone
without authentication.
.
This renders debcheckout(1) unusable in these cases.
Tag: vcs-field-uses-unknown-uri-format
Severity: normal
Certainty: possible
Info: The VCS-* field uses an URI which doesn't match any known format.
You might have forgotten the protocol before the hostname.
Tag: vcs-field-has-unexpected-spaces
Severity: normal
Certainty: possible
Info: The VCS-* field contains more spaces than expected or spaces at
places where they were not expected. Where possible escape valid spaces
in URIs to avoid any ambiguity with respect to possible future additional
optional fields.
Tag: vcs-field-not-canonical
Severity: minor
Certainty: possible
Info: The VCS-* field contains an uncanonical URI. Please update to use
the current canonical URI instead. This reduces the network bandwidth used
and makes debcheckout work independent of the port forwarding and
redirections properly working.
.
The definition of canonical used here is the URIs announced by the Alioth
admins (see reference).
.
Note that this check is based on a list of known URIs. Lintian did not
send a HTTP request to the URI to test this. Should the canonical URI
have changed, please file a bug against Lintian so the check can be
updated accordingly.
Ref: https://lists.debian.org/debian-devel-announce/2011/05/msg00009.html
Tag: vcs-field-bitrotted
Severity: normal
Certainty: certain
Info: The VCS-* field uses an address which no longer works. Please
update it to use the current canonical URI instead.
.
Note that this check is based on a list of known URIs or/and
patterns. Lintian did not send a HTTP request to the URI to test
this. Should the URI actually work, please file a bug against
Lintian so the check can be updated accordingly.
Tag: vcs-git-uses-invalid-user-uri
Severity: normal
Certainty: certain
Info: The Vcs-Git field is pointing to a personal repository using
a git://(git|anonscm).debian.org/~$LOGIN/$PRJ.git style URI. This is not
recommended since the repository this points is not automatically updated
when pushing to the personal repository. The recommended URI for anonymous
access is git://anonscm.debian.org/users/$LOGIN/$PRJ.git.
Tag: lib-recommends-documentation
Severity: normal
Certainty: possible
Info: The given package appears to be a library package, but it recommends
a documentation package. Doing this can pull in unwanted (and often
large) documentation packages since recommends are installed by default
and library packages are pulled by applications that use them. Users
usually only care about the library documentation if they're developing
against the library, not just using it, so the development package should
recommend the documentation instead. If there is no development package
(for modules for scripting languages, for example), consider Suggests
instead of Recommends.
Tag: build-depends-on-python-dev-with-no-arch-any
Severity: minor
Certainty: possible
Info: The given package appears to have a Python development package
(python-dev, python-all-dev or pythonX.Y-dev) listed in its Build-Depends
or Build-Depends-Indep fields, but only "Architecture: all" packages are
built by this source package. Python applications and modules do not
usually require those dev packages, so you should consider removing them
in favour of python, python-all or pythonX.Y.
.
If you are building a Python extension instead, you should have
development packages listed in Build-Depends, but normally there should
be at least one Architecture: any package.
Tag: build-depends-on-specific-java-doc-package
Severity: normal
Certainty: certain
Info: The given package declares a build dependency on either openjdk-
X-doc or classpath-doc instead of using default-jdk-doc. default-jdk-doc
provides a symlink to the API via /usr/share/default-jdk-doc/api.
Tag: depends-on-specific-java-doc-package
Severity: normal
Certainty: certain
Info: The package should use default-jdk-doc instead of classpath-doc
or openjdk-X-doc to ease transitions when the providing doc package
is replaced (e.g. openjdk-6-doc being replaced by openjdk-7-doc).
Tag: needless-dependency-on-jre
Severity: normal
Certainty: possible
Info: The package appear to be a Java library and depending on one
or more JRE/JDK packages. As of 05 Apr 2010, the Java Policy no
longer mandates that Java libraries depend on Java Runtimes.
.
If the library package ships executables along with the library,
then please consider making this an application package or move the
binaries to a (new) application package.
.
If there is otherwise a valid reason for this dependency, please override
the tag.
Ref: http://packages.qa.debian.org/j/java-common/news/20100405T221415Z.html,
#227587
Tag: documentation-package-not-architecture-independent
Severity: normal
Certainty: certain
Info: Documentation packages usually shouldn't carry anything that requires
recompiling on various architectures, in order to save space on mirrors.
Tag: build-depends-on-versioned-berkeley-db
Severity: normal
Certainty: possible
Info: The package build-depends on a versioned development package of
Berkeley DB (libdbX.Y-dev) instead of versionless package
(libdb-dev). Unfortunately this prevents binNMUs when default
Berkeley DB version changes.
.
Unless the package absolutely have to depend on specific Berkeley DB
version, it should build-depends on libdb-dev. For more information
on the upgrade process, please see the references.
.
The package can usually be made Berkeley DB version agnostic by the
following steps:
.
1. note the version of Berkeley DB used to compile the package on build time
2. on first install copy the used version to active version
3. on upgrades compare the versions and if they differ do the upgrade procedure
.
If you are unsure you can contact Berkeley DB maintainer, who would be
glad to help.
.
Should the package have a legitimate reason for using the versioned development
package, please add an override.
Ref: http://download.oracle.com/docs/cd/E17076_02/html/upgrading/upgrade_process.html
Tag: transitional-package-should-be-oldlibs-extra
Severity: normal
Certainty: possible
Ref: #645438, devref 6.7.7
Info: The package appears to be a transitional package, but it is not
priority extra and in the oldlibs section.
.
Using oldlibs/extra assists package managers in handling the
transition package correctly.
Tag: rc-version-greater-than-expected-version
Severity: normal
Certainty: possible
Ref: policy 5.6.12
Info: The package appears to be a release candidate or preview release, but
the version sorts higher than the expected final release.
.
Note this check is limited to new upstream releases of non-native packages.
Tag: dm-upload-allowed-is-obsolete
Severity: normal
Certainty: certain
Info: The implementation of the "Debian Maintainers" GR has changed
and the "DM-Upload-Allowed" field is now obsolete.
.
Instead these permissions are granted via "dak-commands" files.
Ref: https://lists.debian.org/debian-devel-announce/2012/09/msg00008.html
lintian-2.5.22ubuntu1/checks/fields.pm 0000664 0000000 0000000 00000150512 12314366011 014521 0 ustar # fields -- lintian check script (rewrite) -*- perl -*-
#
# Copyright (C) 2004 Marc Brockschmidt
#
# Parts of the code were taken from the old check script, which
# was Copyright (C) 1998 Richard Braakman (also licensed under the
# GPL 2 or higher)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::fields;
use strict;
use warnings;
use autodie;
use Dpkg::Version qw(version_check);
use List::MoreUtils qw(any true);
use Lintian::Architecture qw(:all);
use Lintian::Data ();
use Lintian::Check qw(check_maintainer);
use Lintian::Relation qw(:constants);
use Lintian::Relation::Version qw(versions_compare);
use Lintian::Tags qw(tag);
use Lintian::Util qw($PKGNAME_REGEX);
our $KNOWN_ESSENTIAL = Lintian::Data->new('fields/essential');
our $KNOWN_METAPACKAGES = Lintian::Data->new('fields/metapackages');
our $NO_BUILD_DEPENDS = Lintian::Data->new('fields/no-build-depends');
our $KNOWN_SECTIONS = Lintian::Data->new('fields/archive-sections');
our $known_build_essential
= Lintian::Data->new('fields/build-essential-packages');
our $KNOWN_BINARY_FIELDS = Lintian::Data->new('fields/binary-fields');
our $KNOWN_UDEB_FIELDS = Lintian::Data->new('fields/udeb-fields');
our $KNOWN_DEPENDENCY_RESTRICTIONS
= Lintian::Data->new('fields/dependency-restrictions',
qr/\./, \&_load_dependency_restrictions);
our %KNOWN_ARCHIVE_PARTS = map { $_ => 1 } ('non-free', 'contrib');
my $KNOWN_PRIOS = Lintian::Data->new('common/priorities', qr/\s*=\s*/o);
our @supported_source_formats = (qr/1\.0/, qr/3\.0\s*\((quilt|native)\)/);
# Still in the archive but shouldn't be the primary Emacs dependency.
our %known_obsolete_emacs = map { $_ => 1 } ('emacs21', 'emacs22');
our %known_libstdcs = map { $_ => 1 } (
'libstdc++2.9-glibc2.1', 'libstdc++2.10',
'libstdc++2.10-glibc2.2','libstdc++3',
'libstdc++3.0', 'libstdc++4',
'libstdc++5','libstdc++6',
'lib64stdc++6',
);
our %known_tcls = map { $_ => 1 }
('tcl74', 'tcl8.0', 'tcl8.2', 'tcl8.3', 'tcl8.4', 'tcl8.5',);
our %known_tclxs
= map { $_ => 1 } ('tclx76', 'tclx8.0.4', 'tclx8.2', 'tclx8.3', 'tclx8.4',);
our %known_tks
= map { $_ => 1 } ('tk40', 'tk8.0', 'tk8.2', 'tk8.3', 'tk8.4', 'tk8.5',);
our %known_tkxs = map { $_ => 1 } ('tkx8.2', 'tkx8.3',);
our %known_libpngs = map { $_ => 1 } ('libpng12-0', 'libpng2', 'libpng3',);
our @known_java_pkg = map { qr/$_/ } (
'default-jre(?:-headless)?', 'default-jdk', # default java
'java\d*-runtime(?:-headless)?'
, # java-runtime and javaX-runtime alternatives (virtual)
'(openjdk-|sun-java)\d+-jre(?:-headless)?',
'(openjdk-|sun-java)\d+-jdk', # openjdk-X and sun-javaX
'gcj-(?:\d+\.\d+-)?jre(?:-headless)?', 'gcj-(?:\d+\.\d+-)?jdk', # gcj
'gij',
'java-gcj-compat(?:-dev|-headless)?', # deprecated/transitional packages
'kaffe', 'cacao', 'jamvm',
'classpath', # deprecated packages (removed in Squeeze)
);
# Mapping of package names to section names
my @NAME_SECTION_MAPPINGS = (
[qr/-docs?$/ => 'doc'],
[qr/-dbg$/ => 'debug'],
[qr/^(?:python-)?zope/ => 'zope'],
[qr/^python-/ => 'python'],
[qr/^r-cran-/ => 'gnu-r'],
[qr/^lib.*-perl$/ => 'perl'],
[qr/^lib.*-cil(?:-dev)?$/ => 'cli-mono'],
[qr/^lib.*-(?:java|gcj)$/ => 'java'],
[qr/^(?:lib)php-/ => 'php'],
[qr/^lib(?:hugs|ghc6?)-/ => 'haskell'],
[qr/^lib.*-ruby(?:1\.\d)?$/ => 'ruby'],
[qr/^lib.*-(?:ocaml|camlp4)-dev$/ => 'ocaml'],
[qr/^lib.*-dev$/ => 'libdevel'],
[qr/^gir\d+\.\d+-.*-\d+\.\d+$/ => 'introspection'],
);
my %VCS_EXTRACT = (
browser => sub { return @_;},
arch => sub { return @_;},
bzr => sub { return @_;},
# cvs rootdir followed by optional module name:
cvs => sub { return shift =~ /^(.+?)(?:\s+(\S*))?$/;},
darcs => sub { return @_;},
hg => sub { return @_;},
# git uri followed by optional " -b " + branchname:
git => sub { return shift =~ /^(.+?)(?:\s+-b\s+(\S*))?$/;},
svn => sub { return @_;},
# that's a hostname followed by a module name:
mtn => sub { return shift =~ /^(.+?)\s+(\S+)$/;},
);
my %VCS_CANONIFY = (
browser => sub {
$_[0] =~ s{https?://svn\.debian\.org/wsvn/}
{http://anonscm.debian.org/viewvc/};
$_[0] =~ s{\Qhttp://git.debian.org/?p=\E}
{http://anonscm.debian.org/gitweb/?p=};
$_[0] =~ s{\Qhttp://bzr.debian.org/loggerhead/\E}
{http://anonscm.debian.org/loggerhead/};
if ($_[0] =~ m{\Qhttp://anonscm.debian.org/viewvc/\E}xsm) {
if ($_[0] =~ s{\?(.*[;\&])?op=log(?:[;\&](.*))?\Z}{}xsm) {
my (@keep) = ($1, $2, $3);
my $final = join('', grep {defined} @keep);
$_[0] .= '?' . $final if ($final ne '');
$_[1] = 'vcs-field-bitrotted';
}
}
},
cvs => sub {
if (
$_[0] =~ s{\@(?:cvs.alioth|anonscm)\.debian\.org:/cvsroot/}
{\@anonscm.debian.org:/cvs/}
) {
$_[1] = 'vcs-field-bitrotted';
}
$_[0] =~ s{\@cvs.alioth.debian.org:/cvs/}{\@anonscm.debian.org:/cvs/};
},
arch => sub {
$_[0] =~ s{\Qhttp://arch.debian.org/arch/\E}
{http://anonscm.debian.org/arch/};
},
bzr => sub {
$_[0] =~ s{\Qhttp://bzr.debian.org/\E}
{http://anonscm.debian.org/bzr/};
$_[0] =~ s{\Qhttp://anonscm.debian.org/bzr/bzr/\E}
{http://anonscm.debian.org/bzr/};
},
git => sub {
if (
$_[0] =~ s{git://(?:git|anonscm)\.debian\.org/~}
{git://anonscm.debian.org/users/}
) {
$_[1] = 'vcs-git-uses-invalid-user-uri';
}
$_[0] =~ s{\Qhttp://git.debian.org/\E}
{http://anonscm.debian.org/git/};
$_[0] =~ s{\Qhttp://anonscm.debian.org/git/git/\E}
{http://anonscm.debian.org/git/};
$_[0] =~ s{\Qgit://git.debian.org/\E}
{git://anonscm.debian.org/};
$_[0] =~ s{\Qgit://anonscm.debian.org/git/\E}
{git://anonscm.debian.org/};
},
hg => sub {
$_[0] =~ s{\Qhttp://hg.debian.org/\E}
{http://anonscm.debian.org/hg/};
$_[0] =~ s{\Qhttp://anonscm.debian.org/hg/hg/\E}
{http://anonscm.debian.org/hg/};
},
svn => sub {
$_[0] =~ s{\Qsvn://cvs.alioth.debian.org/\E}
{svn://anonscm.debian.org/};
$_[0] =~ s{\Qsvn://svn.debian.org/\E}
{svn://anonscm.debian.org/};
$_[0] =~ s{\Qsvn://anonscm.debian.org/svn/\E}
{svn://anonscm.debian.org/};
},
);
# Valid URI formats for the Vcs-* fields
# currently only checks the protocol, not the actual format of the URI
my %VCS_RECOMMENDED_URIS = (
browser => qr;^https?://;,
arch => qr;^https?://;,
bzr => qr;^(?:lp:|(?:nosmart\+)?https?://);,
cvs => qr;^:(?:pserver:|ext:_?anoncvs);,
darcs => qr;^https?://;,
hg => qr;^https?://;,
git => qr;^(?:git|https?|rsync)://;,
svn => qr;^(?:svn|(?:svn\+)?https?)://;,
mtn => qr;^[\w.-]+$;,
);
my %VCS_VALID_URIS = (
arch => qr;^https?://;,
bzr => qr;^(?:sftp|(?:bzr\+)?ssh)://;,
cvs => qr;^(?:-d\s*)?:(?:ext|pserver):;,
hg => qr;^ssh://;,
git => qr;^(?:git\+)?ssh://;,
svn => qr;^(?:svn\+)?ssh://;,
);
# Python development packages that are used almost always just for building
# architecture-dependent modules. Used to check for unnecessary build
# dependencies for architecture-independent source packages.
our $PYTHON_DEV = join(' | ',
qw(python-dev python-all-dev python3-dev python3-all-dev),
map { "python$_-dev" } qw(2.7 3 3.2));
our $PERL_CORE_PROVIDES = Lintian::Data->new('fields/perl-provides', '\s+');
our $OBSOLETE_PACKAGES = Lintian::Data->new('fields/obsolete-packages');
our $VIRTUAL_PACKAGES = Lintian::Data->new('fields/virtual-packages');
our $SOURCE_FIELDS = Lintian::Data->new('common/source-fields');
sub run {
my ($pkg, $type, $info, $proc, $group) = @_;
my ($version, $arch_indep);
#---- Format
if ($type eq 'source') {
my $format = $info->field('format');
if (defined($format)) {
my $supported = 0;
foreach my $f (@supported_source_formats){
if($format =~ /^\s*$f\s*\z/){
$supported = 1;
}
}
tag 'unsupported-source-format', $format
unless $supported;
}
}
#---- Package
if ($type eq 'binary') {
if (not defined $info->field('package')) {
tag 'no-package-name';
} else {
my $name = $info->field('package');
unfold('package', \$name);
tag 'bad-package-name' unless $name =~ /^$PKGNAME_REGEX$/i;
tag 'package-not-lowercase' if ($name =~ /[A-Z]/);
}
}
#---- Version
if (not defined $info->field('version')) {
tag 'no-version-field';
} else {
$version = $info->field('version');
unfold('version', \$version);
my $dversion = Dpkg::Version->new($version);
if ($dversion->is_valid) {
my ($epoch, $upstream, $debian)
= ($dversion->epoch, $dversion->version, $dversion->revision);
# Dpkg::Version sets the debian revision to 0 if there is
# no revision. So we need to check if the raw version
# ends with "-0".
tag 'debian-revision-should-not-be-zero', $version
if $version =~ m/-0$/o;
my $ubuntu;
if($debian =~ m/^(?:[^.]+)(?:\.[^.]+)?(?:\.[^.]+)?(\..*)?$/o){
my $extra = $1;
if (
defined $extra
&& $debian =~ m/\A
(?:[^.]+ubuntu[^.]+)(?:\.\d+){1,3}(\..*)?
\Z/oxsm
) {
$ubuntu = 1;
$extra = $1;
}
if (defined $extra) {
tag 'debian-revision-not-well-formed', $version;
}
} else {
tag 'debian-revision-not-well-formed', $version;
}
if ($debian =~ /^[^.-]+\.[^.-]+\./o and not $ubuntu) {
tag 'binary-nmu-debian-revision-in-source', $version
if $type eq 'source';
}
if ($version =~ /\+b\d+$/ && $type eq 'source') {
tag 'binary-nmu-debian-revision-in-source', $version;
}
if (
$upstream =~ m/[^~a-z]
(rc|alpha|beta|dev|pre(?:view|release)?)
([^a-z].*|\Z)
/xsm
) {
my $expected = $upstream;
my $rc = $1;
my $rest = $2//'';
my $suggestion;
# Remove the rc-part and the preceeding symbol (if any).
$expected =~ s/[\.\+\-\:]?\Q$rc\E.*//;
$suggestion = "$expected~$rc$rest";
tag 'rc-version-greater-than-expected-version', $upstream, '>',
$expected, "(consider using $suggestion)",
if $info->native
or ($debian eq q{1} or $debian =~ m,^0(?:\.1|ubuntu1)?$,);
}
# Checks for the dfsg convention for repackaged upstream
# source. Only check these against the source package to not
# repeat ourselves too much.
if ($type eq 'source') {
if ($version =~ /dfsg/ and $info->native) {
tag 'dfsg-version-in-native-package', $version;
} elsif ($version =~ /\.dfsg/) {
tag 'dfsg-version-with-period', $version;
} elsif ($version =~ /dsfg/) {
tag 'dfsg-version-misspelled', $version;
}
}
my $name = $info->field('package');
if ( $name
&& $PERL_CORE_PROVIDES->known($name)
&& perl_core_has_version($name, '>=', "$epoch:$upstream")) {
my $core_version = $PERL_CORE_PROVIDES->value($name);
tag 'package-superseded-by-perl', "with $core_version";
}
} else {
tag 'bad-version-number', $version;
}
}
#---- Multi-Arch
if (defined $info->field('multi-arch')){
my $march = $info->field('multi-arch');
unfold('multi-arch', \$march);
tag 'unknown-multi-arch-value', $pkg, $march
unless $march =~ m/^no|foreign|allowed|same$/o;
if ( $march eq 'same'
&& $type eq 'binary'
&& defined $info->field('architecture')) {
my $arch = $info->field('architecture');
# Do not use unfold to avoid duplicate warning
$arch =~ s/\n//o;
tag 'illegal-multi-arch-value', $arch, $march if ($arch eq 'all');
}
}
if ($type eq 'binary'){
if ($pkg =~ /^fonts-/) {
tag 'font-package-not-multi-arch-foreign'
unless $info->field('multi-arch', 'no') =~ m/^foreign|allowed$/o;
}
}
#---- Architecture
if (not defined $info->field('architecture')) {
tag 'no-architecture-field';
} else {
my $archs = $info->field('architecture');
unfold('architecture', \$archs);
my @archs = split(m/ /o, $archs);
if (@archs > 1) { # Check for magic architecture combinations.
my %archmap;
my $magic = 0;
$archmap{$_}++ for (@archs);
$magic++ if ($type ne 'source' && $archmap{'all'});
if ($archmap{'any'}){
delete $archmap{'any'};
# Allow 'all' to be present in source packages as well
# (#626775)
delete $archmap{'all'} if $type eq 'source';
$magic++ if %archmap;
}
tag 'magic-arch-in-arch-list' if $magic;
}
for my $arch (@archs) {
tag 'unknown-architecture', $arch
unless is_arch_or_wildcard($arch);
tag 'arch-wildcard-in-binary-package', $arch
if ($type eq 'binary' && is_arch_wildcard($arch));
}
if ($type eq 'binary') {
tag 'too-many-architectures' if (@archs > 1);
if (@archs > 0) {
tag 'aspell-package-not-arch-all'
if ( $pkg =~ /^aspell-[a-z]{2}(?:-.*)?$/
&& $archs[0] ne 'all');
if ($pkg =~ /-docs?$/ && $archs[0] ne 'all') {
tag 'documentation-package-not-architecture-independent';
}
}
}
# Used for later tests.
$arch_indep = 1 if (@archs == 1 && $archs[0] eq 'all');
}
#---- Subarchitecture (udeb)
if (defined $info->field('subarchitecture')) {
my $subarch = $info->field('subarchitecture');
unfold('subarchitecture', \$subarch);
}
#---- Maintainer
#---- Uploaders
for my $f (qw(maintainer uploaders)) {
if (not defined $info->field($f)) {
tag 'no-maintainer-field' if $f eq 'maintainer';
} else {
my $maintainer = $info->field($f);
# Note, not expected to hit on uploaders anymore, as dpkg
# now strips newlines for the .dsc, and the newlines don't
# hurt in debian/control
unfold($f, \$maintainer);
if ($f eq 'uploaders') {
my %duplicate_uploaders;
my @uploaders = map { split /\@\S+\K\s*,\s*/ }
split />\K\s*,\s*/, $maintainer;
for my $uploader (@uploaders) {
check_maintainer($uploader, 'uploader');
if ( ((true { $_ eq $uploader } @uploaders) > 1)
and($duplicate_uploaders{$uploader}++ == 0)) {
tag 'duplicate-uploader', $uploader;
}
}
} else {
check_maintainer($maintainer, $f);
if ( $type eq 'source'
&& $maintainer =~ /\@lists(?:\.alioth)?\.debian\.org\b/
&& !defined $info->field('uploaders')) {
tag 'no-human-maintainers';
}
}
}
}
if ( defined $info->field('uploaders')
&& defined $info->field('maintainer')) {
my $maint = $info->field('maintainer');
tag 'maintainer-also-in-uploaders'
if $info->field('uploaders') =~ m/\Q$maint/;
}
#---- Source
if (not defined $info->field('source')) {
# Optional in binary packages, required in source packages, but we
# cannot check it as dpkg-source(1) refuses to unpack source packages
# without this field (and fields indirectly depends on unpacked). So
# "pass"...
1;
} else {
my $source = $info->field('source');
unfold('source', \$source);
if ($type eq 'source') {
my $filename = $proc->pkg_path;
my ($base) = ($filename =~ m,(?:\a|/)([^/]+)$,o);
my ($n) = ($base =~ m/^([^_]+)_/o);
if ($source ne $n) {
tag 'source-field-does-not-match-pkg-name', "$source != $n";
}
if ($source !~ /^[a-z0-9][-+\.a-z0-9]+\z/) {
tag 'source-field-malformed', $source;
}
} elsif (
$source !~ /^ $PKGNAME_REGEX
\s*
# Optional Version e.g. (1.0)
(?:\((?:\d+:)?(?:[-\.+:a-zA-Z0-9~]+?)(?:-[\.+a-zA-Z0-9~]+)?\))?\s*$/x
) {
tag 'source-field-malformed', $source;
}
}
#---- Essential
if (defined $info->field('essential')) {
my $essential = $info->field('essential');
unfold('essential', \$essential);
tag 'essential-in-source-package' if ($type eq 'source');
tag 'essential-no-not-needed' if ($essential eq 'no');
tag 'unknown-essential-value'
if ($essential ne 'no' and $essential ne 'yes');
if ($essential eq 'yes' and not $KNOWN_ESSENTIAL->known($pkg)) {
tag 'new-essential-package';
}
}
#---- Section
if (not defined $info->field('section')) {
tag 'no-section-field' if ($type eq 'binary');
} else {
my $section = $info->field('section');
unfold('section', \$section);
if ($type eq 'udeb') {
unless ($section eq 'debian-installer') {
tag 'wrong-section-for-udeb', $section;
}
} else {
my @parts = split(m{/}, $section, 2);
if (scalar @parts > 1) {
tag 'unknown-section', $section
unless $KNOWN_ARCHIVE_PARTS{$parts[0]};
tag 'unknown-section', $section
unless $KNOWN_SECTIONS->known($parts[1]);
} elsif ($parts[0] eq 'unknown') {
tag 'section-is-dh_make-template';
} else {
tag 'unknown-section', $section
unless $KNOWN_SECTIONS->known($parts[0]);
}
# Check package name <-> section. oldlibs is a special case; let
# anything go there.
if ($parts[-1] ne 'oldlibs') {
foreach my $map (@NAME_SECTION_MAPPINGS) {
next unless ($pkg =~ $map->[0]);
my $area = '';
$area = "$parts[0]/" if (scalar @parts == 2);
tag 'wrong-section-according-to-package-name',
"$pkg => ${area}$map->[1]"
unless $parts[-1] eq $map->[1];
last;
}
}
if ($info->is_pkg_class('transitional')) {
my $pri = $info->field('priority', '');
# Cannot use "unfold" as it could emit a tag for priority,
# which will be duplicated below.
$pri =~ s/\n//;
tag 'transitional-package-should-be-oldlibs-extra',
"$parts[-1]/$pri"
unless $pri eq 'extra' && $parts[-1] eq 'oldlibs';
}
}
}
#---- Priority
if (not defined $info->field('priority')) {
tag 'no-priority-field' if $type eq 'binary';
} else {
my $priority = $info->field('priority');
unfold('priority', \$priority);
tag 'unknown-priority', $priority
unless $KNOWN_PRIOS->known($priority);
if ($pkg =~ /-dbg$/) {
tag 'debug-package-should-be-priority-extra', $pkg
unless $priority eq 'extra';
}
}
#---- Standards-Version
# handled in checks/standards-version
#---- Description
# handled in checks/description
#--- Homepage
if (defined $info->field('homepage')) {
my $homepage = $info->field('homepage');
my $orig = $homepage;
unfold('homepage', \$homepage);
if ($homepage =~ /^<(?:UR[LI]:)?.*>$/i) {
tag 'superfluous-clutter-in-homepage', $orig;
$homepage = substr($homepage, 1, length($homepage) - 2);
}
require URI;
my $uri = URI->new($homepage);
# not an absolute URI or (most likely) an invalid protocol
unless ($uri->scheme && $uri->scheme =~ m/^ftp|https?|gopher$/o) {
tag 'bad-homepage', $orig;
}
if ($homepage=~ m,/(?:search\.cpan\.org|metacpan\.org)/.*-[0-9._]+/*$,)
{
tag 'homepage-for-cpan-package-contains-version', $orig;
}
} elsif (not $info->native) {
if ($type eq 'source') {
my $binary_has_homepage_field = 0;
for my $binary ($info->binaries) {
if (defined $info->binary_field($binary, 'homepage')) {
$binary_has_homepage_field = 1;
last;
}
}
if ($binary_has_homepage_field) {
tag 'homepage-in-binary-package';
}
} elsif ($type eq 'binary') {
tag 'no-homepage-field';
}
}
#---- Installer-Menu-Item (udeb)
if (defined $info->field('installer-menu-item')) {
my $menu_item = $info->field('installer-menu-item');
unfold('installer-menu-item', \$menu_item);
$menu_item =~ /^\d+$/ or tag 'bad-menu-item', $menu_item;
}
#---- Package relations (binary package)
# Check whether the package looks like a metapackage, used for later
# dependency checks. We consider a package to possibly be a metapackage if
# it is a binary package with no files outside of /usr/share/doc and a few
# other directories found in metapackges. This also catches documentation
# packages, but that doesn't matter for our purposes.
my $metapackage = 0;
if ($type eq 'binary') {
$metapackage = 1;
for my $file ($info->sorted_index) {
next if $file->is_dir;
next if $file =~ m%^usr/share/doc/%;
next if $file =~ m%^usr/share/lintian/overrides/%;
next if $file =~ m%^usr/share/cdd/%;
$metapackage = 0;
last;
}
# Packages we say are metapackages are always metapackages even if
# they don't look like it.
$metapackage = 1 if $KNOWN_METAPACKAGES->known($pkg);
}
if (($type eq 'binary') || ($type eq 'udeb')) {
my $javalib = 0;
my $replaces = $info->relation('replaces');
my %nag_once = ();
$javalib = 1 if($pkg =~ m/^lib.*-java$/o);
for my $field (
qw(depends pre-depends recommends suggests conflicts provides enhances replaces breaks)
) {
next unless defined $info->field($field);
#Get data and clean it
my $data = $info->field($field);
my $javadep = 0;
unfold($field, \$data);
my (@seen_libstdcs, @seen_tcls, @seen_tclxs, @seen_tks, @seen_tkxs,
@seen_libpngs);
my $is_dep_field = sub {
any { $_ eq $_[0] }qw(depends pre-depends recommends suggests);
};
tag 'alternates-not-allowed', $field
if ($data =~ /\|/ && !&$is_dep_field($field));
for my $dep (split /\s*,\s*/, $data) {
my (@alternatives, @seen_obsolete_packages);
push @alternatives, [_split_dep($_), $_]
for (split /\s*\|\s*/, $dep);
if (&$is_dep_field($field)) {
push @seen_libstdcs, $alternatives[0]->[0]
if defined $known_libstdcs{$alternatives[0]->[0]};
push @seen_tcls, $alternatives[0]->[0]
if defined $known_tcls{$alternatives[0]->[0]};
push @seen_tclxs, $alternatives[0]->[0]
if defined $known_tclxs{$alternatives[0]->[0]};
push @seen_tks, $alternatives[0]->[0]
if defined $known_tks{$alternatives[0]->[0]};
push @seen_tkxs, $alternatives[0]->[0]
if defined $known_tkxs{$alternatives[0]->[0]};
push @seen_libpngs, $alternatives[0]->[0]
if defined $known_libpngs{$alternatives[0]->[0]};
}
# Only for (Pre-)?Depends.
tag 'virtual-package-depends-without-real-package-depends',
"$field: $alternatives[0]->[0]"
if (
$VIRTUAL_PACKAGES->known($alternatives[0]->[0])
&& ($field eq 'depends' || $field eq 'pre-depends')
&& ($pkg ne 'base-files' || $alternatives[0]->[0] ne 'awk')
# ignore phpapi- dependencies as adding an
# alternative, real, package breaks its pourpose
&& $alternatives[0]->[0] !~ m/^phpapi-/
);
# Check defaults for transitions. Here, we only care
# that the first alternative is current.
tag 'depends-on-old-emacs', "$field: $alternatives[0]->[0]"
if ( &$is_dep_field($field)
&& $known_obsolete_emacs{$alternatives[0]->[0]});
for my $part_d (@alternatives) {
my ($d_pkg, $d_march, $d_version, $d_arch, undef, $rest,
$part_d_orig)
= @$part_d;
tag 'versioned-provides', $part_d_orig
if ($field eq 'provides' && $d_version->[0]);
tag 'bad-provided-package-name', $d_pkg
if $d_pkg !~ /^[a-z0-9][-+\.a-z0-9]+$/;
tag 'breaks-without-version', $part_d_orig
if ( $field eq 'breaks'
&& !$d_version->[0]
&& !$VIRTUAL_PACKAGES->known($d_pkg)
&& !$replaces->implies($part_d_orig));
tag 'conflicts-with-version', $part_d_orig
if ($field eq 'conflicts' && $d_version->[0]);
tag 'obsolete-relation-form', "$field: $part_d_orig"
if ($d_version && any { $d_version->[0] eq $_ }
('<', '>'));
tag 'bad-version-in-relation', "$field: $part_d_orig"
if ($d_version->[0] && !version_check($d_version->[1]));
tag 'package-relation-with-self', "$field: $part_d_orig"
if ($pkg eq $d_pkg)
&& ( $field ne 'conflicts'
&& $field ne 'replaces'
&& $field ne 'provides');
tag 'bad-relation', "$field: $part_d_orig"
if $rest;
push @seen_obsolete_packages, $part_d_orig
if ( $OBSOLETE_PACKAGES->known($d_pkg)
&& &$is_dep_field($field));
tag 'depends-on-metapackage', "$field: $part_d_orig"
if ( $KNOWN_METAPACKAGES->known($d_pkg)
and not $metapackage
and &$is_dep_field($field));
# diffutils is a special case since diff was
# renamed to diffutils, so a dependency on
# diffutils effectively is a versioned one.
tag 'depends-on-essential-package-without-using-version',
"$field: $part_d_orig"
if ( $KNOWN_ESSENTIAL->known($d_pkg)
&& !$d_version->[0]
&& &$is_dep_field($field)
&& $d_pkg ne 'diffutils'
&& $d_pkg ne 'dash');
tag 'package-depends-on-an-x-font-package',
"$field: $part_d_orig"
if ( $field =~ /^(pre-)?depends$/
&& $d_pkg =~ /^xfont.*/
&& $d_pkg ne 'xfonts-utils'
&& $d_pkg ne 'xfonts-encodings');
tag 'depends-on-packaging-dev',
$field
if ((
$field =~ /^(?:pre-)?depends$/
|| $field eq 'recommends'
)
&& $d_pkg eq 'packaging-dev'
&& !$info->is_pkg_class('any-meta'));
tag 'needlessly-depends-on-awk', $field
if ( $d_pkg eq 'awk'
&& !$d_version->[0]
&& &$is_dep_field($field)
&& $pkg ne 'base-files');
tag 'depends-on-libdb1-compat', $field
if ( $d_pkg eq 'libdb1-compat'
&& $pkg !~ /^libc(?:6|6.1|0.3)/
&& $field =~ m/^(?:pre-)?depends$/o);
tag 'depends-on-python-minimal', $field,
if ( $d_pkg =~ /^python[\d.]*-minimal$/
&& &$is_dep_field($field)
&& $pkg !~ /^python[\d.]*-minimal$/);
tag 'doc-package-depends-on-main-package', $field
if ("$d_pkg-doc" eq $pkg
&& $field =~ /^(?:pre-)?depends$/);
# only trigger this for the the preferred alternative
tag 'versioned-dependency-satisfied-by-perl',
"$field: $part_d_orig"
if $alternatives[0][-1] eq $part_d_orig
&& &$is_dep_field($field)
&& perl_core_has_version($d_pkg, $d_version->[0],
$d_version->[1]);
tag 'depends-exclusively-on-makedev', $field,
if ( $field eq 'depends'
&& $d_pkg eq 'makedev'
&& @alternatives == 1);
tag 'lib-recommends-documentation', "$field: $part_d_orig"
if ( $field eq 'recommends'
&& $pkg =~ m/^lib/
&& $pkg !~ m/-(?:dev|docs?|tools|bin)$/
&& $part_d_orig =~ m/-docs?$/);
# default-jdk-doc must depend on openjdk-X-doc (or
# classpath-doc) to be useful; other packages
# should depend on default-jdk-doc if they want
# the Java Core API.
tag 'depends-on-specific-java-doc-package',
$field
if (
&$is_dep_field($field)
&& $pkg ne 'default-jdk-doc'
&& ( $d_pkg eq 'classpath-doc'
|| $d_pkg =~ m/openjdk-\d+-doc/o));
if ($javalib && $field eq 'depends'){
foreach my $reg (@known_java_pkg){
if($d_pkg =~ m/$reg/){
$javadep++;
last;
}
}
}
}
for my $pkg (@seen_obsolete_packages) {
if ($pkg eq $alternatives[0]->[0]
or scalar @seen_obsolete_packages
== scalar @alternatives) {
tag 'depends-on-obsolete-package', "$field: $pkg";
} else {
tag 'ored-depends-on-obsolete-package', "$field: $pkg";
}
}
# Only emit the tag if all the alternatives are
# JVM/JRE/JDKs
# - assume that | openjdk-X-jre-headless
# makes sense for now.
if (scalar(@alternatives) == $javadep
&& !exists $nag_once{'needless-dependency-on-jre'}){
$nag_once{'needless-dependency-on-jre'} = 1;
tag 'needless-dependency-on-jre';
}
}
tag 'package-depends-on-multiple-libstdc-versions', @seen_libstdcs
if (scalar @seen_libstdcs > 1);
tag 'package-depends-on-multiple-tcl-versions', @seen_tcls
if (scalar @seen_tcls > 1);
tag 'package-depends-on-multiple-tclx-versions', @seen_tclxs
if (scalar @seen_tclxs > 1);
tag 'package-depends-on-multiple-tk-versions', @seen_tks
if (scalar @seen_tks > 1);
tag 'package-depends-on-multiple-tkx-versions', @seen_tkxs
if (scalar @seen_tkxs > 1);
tag 'package-depends-on-multiple-libpng-versions', @seen_libpngs
if (scalar @seen_libpngs > 1);
}
# If Conflicts or Breaks is set, make sure it's not inconsistent with
# the other dependency fields.
for my $conflict (qw/conflicts breaks/) {
next unless $info->field($conflict);
for my $field (qw(depends pre-depends recommends suggests)) {
next unless $info->field($field);
my $relation = $info->relation($field);
for my $package (split /\s*,\s*/, $info->field($conflict)) {
tag 'conflicts-with-dependency', $field, $package
if $relation->implies($package);
}
}
}
}
#---- Package relations (source package)
if ($type eq 'source') {
my @binpkgs = $info->binaries;
#Get number of arch-indep packages:
my $arch_indep_packages = 0;
my $arch_dep_packages = 0;
foreach my $binpkg (@binpkgs) {
my $arch = $info->binary_field($binpkg, 'architecture', '');
if ($arch eq 'all') {
$arch_indep_packages++;
} else {
$arch_dep_packages++;
}
}
tag 'build-depends-indep-without-arch-indep'
if (defined $info->field('build-depends-indep')
&& $arch_indep_packages == 0);
my $is_dep_field = sub {
any { $_ eq $_[0] } qw(build-depends build-depends-indep);
};
my $restrictions_used = 0;
my %depend;
for my $field (
qw(build-depends build-depends-indep build-conflicts build-conflicts-indep)
) {
if (defined $info->field($field)) {
#Get data and clean it
my $data = $info->field($field);
unfold($field, \$data);
$depend{$field} = $data;
for my $dep (split /\s*,\s*/, $data) {
my (@alternatives, @seen_obsolete_packages);
push @alternatives, [_split_dep($_), $_]
for (split /\s*\|\s*/, $dep);
tag 'virtual-package-depends-without-real-package-depends',
"$field: $alternatives[0]->[0]"
if ( $VIRTUAL_PACKAGES->known($alternatives[0]->[0])
&& &$is_dep_field($field));
for my $part_d (@alternatives) {
my ($d_pkg, $d_march, $d_version, $d_arch, $d_restr,
$rest,$part_d_orig)
= @$part_d;
my $negated = 0;
for my $arch (@{$d_arch->[0]}) {
if ($arch eq 'all' || !is_arch_or_wildcard($arch)){
tag 'invalid-arch-string-in-source-relation',
"$arch [$field: $part_d_orig]";
}
}
if (scalar @{$d_restr} >= 1) {
$restrictions_used = 1;
}
for my $restr (@{$d_restr}) {
my $dotcount = $restr =~ tr/.//;
if ($dotcount != 1) {
#<<< no tidy, tag name too long
tag 'invalid-restriction-term-in-source-relation',
#>>>
"$restr [$field: $part_d_orig]";
next;
}
$restr =~ s/^!//;
my ($ns, $label) = split(/\./, $restr, 2);
if ($KNOWN_DEPENDENCY_RESTRICTIONS->known($ns)) {
#<<< no tidy, tag name too long
tag 'invalid-restriction-label-in-source-relation',
#>>>
"$label [$field: $part_d_orig]"
unless any { $_ eq $label }
@{$KNOWN_DEPENDENCY_RESTRICTIONS->value($ns)};
} else {
#<<< no tidy, tag name too long
tag 'invalid-restriction-namespace-in-source-relation',
#>>>
"$ns [$field: $part_d_orig]";
}
}
if ( $d_pkg =~ m/^openjdk-\d+-doc$/o
or $d_pkg eq 'classpath-doc'){
tag 'build-depends-on-specific-java-doc-package',
$d_pkg;
}
if ($d_pkg =~ m/^java-compiler$/o){
tag 'build-depends-on-an-obsolete-java-package',
$d_pkg;
}
if ( $d_pkg =~ m/^libdb\d+\.\d+.*-dev$/o
and &$is_dep_field($field)) {
tag 'build-depends-on-versioned-berkeley-db',
"$field:$d_pkg";
}
tag 'conflicting-negation-in-source-relation',
"$field: $part_d_orig"
unless (not $d_arch
or $d_arch->[1] == 0
or $d_arch->[1] eq @{ $d_arch->[0] });
tag 'depends-on-packaging-dev', $field
if ($d_pkg eq 'packaging-dev');
tag 'build-depends-on-build-essential', $field
if ($d_pkg eq 'build-essential');
#<<< no tidy, tag name too long
tag 'depends-on-build-essential-package-without-using-version',
#>>>
"$d_pkg [$field: $part_d_orig]"
if ($known_build_essential->known($d_pkg)
&& !$d_version->[1]);
#<<< no tidy, tag name too long
tag 'build-depends-on-essential-package-without-using-version',
#>>>
"$field: $part_d_orig"
if ( $KNOWN_ESSENTIAL->known($d_pkg)
&& !$d_version->[0]
&& $d_pkg ne 'dash');
push @seen_obsolete_packages, $part_d_orig
if ( $OBSOLETE_PACKAGES->known($d_pkg)
&& &$is_dep_field($field));
tag 'build-depends-on-metapackage',
"$field: $part_d_orig"
if ( $KNOWN_METAPACKAGES->known($d_pkg)
and &$is_dep_field($field));
tag 'build-depends-on-non-build-package',
"$field: $part_d_orig"
if ( $NO_BUILD_DEPENDS->known($d_pkg)
and &$is_dep_field($field));
tag 'build-depends-on-1-revision',
"$field: $part_d_orig"
if ( $d_version->[0] eq '>='
&& $d_version->[1] =~ /-1$/
&& &$is_dep_field($field));
tag 'bad-relation', "$field: $part_d_orig"
if $rest;
# only trigger this for the the preferred alternative
tag 'versioned-dependency-satisfied-by-perl',
"$field: $part_d_orig"
if $alternatives[0][-1] eq $part_d_orig
&& &$is_dep_field($field)
&& perl_core_has_version($d_pkg, $d_version->[0],
$d_version->[1]);
}
my $all_obsolete = 0;
$all_obsolete = 1
if scalar @seen_obsolete_packages == @alternatives;
for my $pkg (@seen_obsolete_packages) {
if ( $pkg eq $alternatives[0]->[0]
or $all_obsolete) {
tag 'build-depends-on-obsolete-package',
"$field: $pkg";
} else {
tag 'ored-build-depends-on-obsolete-package',
"$field: $pkg";
}
}
}
}
}
# Check for duplicates.
my $build_all = $info->relation('build-depends-all');
my @dups = $build_all->duplicates;
for my $dup (@dups) {
tag 'package-has-a-duplicate-build-relation', join(', ', @$dup);
}
# Make sure build dependencies and conflicts are consistent.
for ($depend{'build-conflicts'}, $depend{'build-conflicts-indep'}) {
next unless $_;
for my $conflict (split /\s*,\s*/, $_) {
if ($build_all->implies($conflict)) {
tag 'build-conflicts-with-build-dependency', $conflict;
}
}
}
# if restrictions are found in the build-depends/conflicts, then
# package must build-depend on dpkg (>= 1.17.2)
if ($restrictions_used) {
my $build_conflicts_all = $info->relation('build-conflicts-all');
tag 'restriction-list-without-versioned-dpkg-dev-dependency'
unless ($build_all->implies('dpkg-dev (>= 1.17.2)'));
tag 'restriction-list-with-versioned-dpkg-dev-conflict'
if (
$build_conflicts_all->implies_inverse('dpkg-dev (<< 1.17.2)'));
# if the package uses debhelper then it must require and not
# conflict with version >= 9.20140227
if ($build_all->implies('debhelper')) {
tag 'restriction-list-with-debhelper-without-debhelper-version'
unless ($build_all->implies('debhelper (>= 9.20140227)'));
#<<< no tidy, tag name too long
tag 'restriction-list-with-debhelper-with-conflicting-debhelper-version'
#>>>
if (
$build_conflicts_all->implies_inverse(
'debhelper (<< 9.20140227)'));
}
}
my (@arch_dep_pkgs, @dbg_pkgs);
foreach my $gproc ($group->get_binary_processables) {
my $binpkg = $gproc->pkg_name;
if ($binpkg =~ m/-dbg$/) {
push(@dbg_pkgs, $gproc);
} elsif ($info->binary_field($binpkg, 'architecture', '') ne 'all')
{
push @arch_dep_pkgs, $binpkg;
}
}
my $dstr = join('|', map { quotemeta($_) } @arch_dep_pkgs);
my $depregex = qr/^(?:$dstr)$/;
for my $dbg_proc (@dbg_pkgs) {
my $deps = $info->binary_relation($dbg_proc->pkg_name, 'strong');
my $missing = 1;
$missing = 0 if $deps->matches($depregex, VISIT_PRED_NAME);
if ($missing and $dbg_proc->info->is_pkg_class('transitional')) {
# If it is a transitional package, allow it to depend
# on another -dbg instead.
$missing = 0
if $deps->matches(qr/-dbg \Z/xsm, VISIT_PRED_NAME);
}
tag 'dbg-package-missing-depends', $dbg_proc->pkg_name
if $missing;
}
# Check for a python*-dev build dependency in source packages that
# build only arch: all packages.
if ($arch_dep_packages == 0 and $build_all->implies($PYTHON_DEV)) {
tag 'build-depends-on-python-dev-with-no-arch-any';
}
}
#----- Origin
if (defined $info->field('origin')) {
my $origin = $info->field('origin');
unfold('origin', \$origin);
tag 'redundant-origin-field' if lc($origin) eq 'debian';
}
#----- Bugs
if (defined $info->field('bugs')) {
my $bugs = $info->field('bugs');
unfold('bugs', \$bugs);
tag 'redundant-bugs-field'
if $bugs =~ m,^debbugs://bugs.debian.org/?$,i;
}
#----- Python-Version
if (defined $info->field('python-version')) {
my $pyversion = $info->field('python-version');
unfold('python-version', \$pyversion);
my @valid = (
['\d+\.\d+', '\d+\.\d+'],['\d+\.\d+'],
['\>=\s*\d+\.\d+', '\<\<\s*\d+\.\d+'],['\>=\s*\d+\.\d+'],
['current', '\>=\s*\d+\.\d+'],['current'],
['all']);
my @pyversion = split(/\s*,\s*/, $pyversion);
if (@pyversion > 2) {
if (any { !/^\d+\.\d+$/ } @pyversion) {
tag 'malformed-python-version', $pyversion;
}
} else {
my $okay = 0;
for my $rule (@valid) {
if (
$pyversion[0] =~ /^$rule->[0]$/
&& ((
$pyversion[1]
&& $rule->[1]
&& $pyversion[1] =~ /^$rule->[1]$/
)
|| (!$pyversion[1] && !$rule->[1]))
) {
$okay = 1;
last;
}
}
tag 'malformed-python-version', $pyversion unless $okay;
}
}
#----- Dm-Upload-Allowed
if (defined $info->field('dm-upload-allowed')) {
my $dmupload = $info->field('dm-upload-allowed');
tag 'dm-upload-allowed-is-obsolete';
unfold('dm-upload-allowed', \$dmupload);
unless ($dmupload eq 'yes') {
tag 'malformed-dm-upload-allowed', $dmupload;
}
}
#----- Vcs-*
while (my ($vcs, $splitter) = each %VCS_EXTRACT) {
if (defined $info->field("vcs-$vcs")) {
my $uri = $info->field("vcs-$vcs");
unfold("vcs-$vcs", \$uri);
my @parts = &$splitter($uri);
if (not @parts or not $parts[0]) {
tag 'vcs-field-uses-unknown-uri-format', "vcs-$vcs", $uri;
} else {
if ( $VCS_RECOMMENDED_URIS{$vcs}
and $parts[0] !~ $VCS_RECOMMENDED_URIS{$vcs}) {
if ( $VCS_VALID_URIS{$vcs}
and $parts[0] =~ $VCS_VALID_URIS{$vcs}) {
tag 'vcs-field-uses-not-recommended-uri-format',
"vcs-$vcs", $uri;
} else {
tag 'vcs-field-uses-unknown-uri-format', "vcs-$vcs",
$uri;
}
}
if (any { $_ and /\s/} @parts) {
tag 'vcs-field-has-unexpected-spaces', "vcs-$vcs", $uri;
}
}
if ($VCS_CANONIFY{$vcs}) {
my $canonicalized = $parts[0];
my $tag = 'vcs-field-not-canonical';
foreach my $canonify ($VCS_CANONIFY{$vcs}) {
&$canonify($canonicalized, $tag);
}
if ($canonicalized ne $parts[0]) {
tag $tag, $parts[0], $canonicalized;
}
}
}
}
#----- Field checks (without checking the value)
for my $field (keys %{$info->field}) {
tag 'unknown-field-in-dsc', $field
if ($type eq 'source' && !$SOURCE_FIELDS->known($field));
tag 'unknown-field-in-control', $field
if ($type eq 'binary' && !$KNOWN_BINARY_FIELDS->known($field));
tag 'unknown-field-in-control', $field
if ($type eq 'udeb' && !$KNOWN_UDEB_FIELDS->known($field));
}
return;
}
# splits "foo:bar (>= 1.2.3) [!i386 ia64] " into
# ( "foo", "bar", [ ">=", "1.2.3" ], [ [ "i386", "ia64" ], 1 ], [ "!profile.stage1" "!profile.notest" ], "" )
# ^^^ ^^
# count of negated arches, if ! was given ||
# rest (should always be "" for valid dependencies)
sub _split_dep {
my $dep = shift;
my ($pkg, $dmarch, $version, $darch, $restr)
= ('', '', ['',''], [[], 0], []);
my $pkgname = $1 if $dep =~ s/^\s*([^<\s\[\(]+)\s*//;
if (defined $pkgname) {
($pkg, $dmarch) = split /:/, $pkgname, 2;
$dmarch //= ''; # Ensure it is defined (in case there is no ":")
}
if (length $dep) {
if ($dep
=~ s/\s* \( \s* (<<|<=|<|=|>=|>>|>) \s* ([^\s(]+) \s* \) \s*//x) {
@$version = ($1, $2);
}
if ($dep && $dep =~ s/\s*\[([^\]]+)\]\s*//) {
my $t = $1;
$darch->[0] = [split /\s+/, $t];
my $negated = 0;
for my $arch (@{ $darch->[0] }) {
$negated++ if $arch =~ s/^!//;
}
$darch->[1] = $negated;
}
if ($dep && $dep =~ s/\s*<([^>]+)>\s*//) {
my $t = $1;
$restr = [split /\s+/, $t];
}
}
return ($pkg, $dmarch, $version, $darch, $restr, $dep);
}
sub _load_dependency_restrictions {
my ($key, $value, $pval) = @_;
my $ret = undef;
if (not defined $pval) {
$ret = $pval = [];
}
push @{$pval}, $value;
return $ret;
}
sub perl_core_has_version {
my ($package, $op, $version) = @_;
my $core_version = $PERL_CORE_PROVIDES->value($package);
return 0 if !defined $core_version;
return 0 unless version_check($version);
return versions_compare($core_version, $op, $version);
}
sub unfold {
my ($field, $line) = @_;
$$line =~ s/\n$//;
if ($$line =~ s/\n//g) {
tag 'multiline-field', $field;
# Remove leading space as it confuses some of the other checks
# that are anchored. This happens if the field starts with a
# space and a newline, i.e ($ marks line end):
#
# Vcs-Browser: $
# http://somewhere.com/$
$$line=~s/^\s*+//;
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/watch-file.desc 0000664 0000000 0000000 00000016322 12310413206 015573 0 ustar Check-Script: watch-file
Author: Patrick Schoenfeld
Abbrev: watch
Type: source
Needs-Info: debfiles
Info: Check debian/watch files in source packages.
Tag: debian-watch-file-is-missing
Severity: wishlist
Certainty: certain
Ref: policy 4.11, uscan(1)
Info: This source package is not Debian-native but it does not have a
debian/watch file. This file is used for automatic detection of
new upstream versions by the Debian External Health Status project and
other project infrastructure. If this package is maintained upstream,
please consider adding a debian/watch file to detect new
releases.
.
If the package is not maintained upstream or if upstream uses a
distribution mechanism that cannot be meaningfully monitored by uscan
and the Debian External Health Status project, please consider adding a
debian/watch file containing only comments documenting the
situation.
Tag: debian-watch-file-declares-multiple-versions
Severity: normal
Certainty: certain
Ref: uscan(1)
Info: The debian/watch file in this package contains multiple
lines starting with version=. There should be only one version
declaration in a watch file, on the first non-comment line of the file.
Tag: debian-watch-file-unknown-version
Severity: normal
Certainty: certain
Ref: uscan(1)
Info: The version= line in the debian/watch file in this
package declares an unknown version. The currently known watch file
versions are 2 and 3.
Tag: debian-watch-file-missing-version
Severity: normal
Certainty: certain
Ref: uscan(1)
Info: The debian/watch file in this package doesn't start a
version= line. The first non-comment line of
debian/watch should be a version= declaration. This
may mean that this is an old version one watch file that should be
updated to the current version.
Tag: debian-watch-file-should-mangle-version
Severity: normal
Certainty: certain
Ref: uscan(1), http://wiki.debian.org/DEHS
Info: The version of this package contains dfsg, ds,
or debian, which normally indicates that the upstream source
has been repackaged to comply with the Debian Free Software Guidelines
(or similar reason), but there is no version mangling in the
debian/watch file. Since the dfsg string is not
part of the upstream version, the debian/watch file should
use the dversionmangle option to remove the dfsg before
version number comparison.
Tag: debian-watch-file-should-dversionmangle-not-uversionmangle
Severity: wishlist
Certainty: certain
Ref: http://wiki.debian.org/DEHS
Info: The version of this package contains dfsg, ds,
or debian, but a misleading upstream version mangling occurs in
the debian/watch file. Since the dfsg string is not
part of the upstream version and its addition is Debian-specific, the
the debian/watch file should use the dversionmangle option to
remove, instead of adding in uversionmangle, the dfsg before
comparing version numbers.
Tag: debian-watch-file-should-uversionmangle-not-dversionmangle
Severity: wishlist
Certainty: certain
Ref: http://wiki.debian.org/DEHS
Info: The version of this package contains alpha, beta,
or rc, but a misleading Debian version mangling occurs in
the debian/watch file. You should use the uversionmangle
option instead of dversionmangle so that the prerelease is sorted by
uscan before a possible future final release.
Tag: debian-watch-file-in-native-package
Severity: normal
Certainty: certain
Ref: http://wiki.debian.org/DEHS
Info: The package ships a watch file although it is a Debian native
package. DEHS does not process watch files in native packages based on
the reasoning that native packages do not have upstreams to check for new
releases.
Tag: debian-watch-file-uses-deprecated-sf-redirector-method
Severity: normal
Certainty: certain
Info: The watch file seems to be passing arguments to the redirector
other than a path. Calling the SourceForge redirector with parameters like
project prevents uscan from generating working URIs to the files
and thus has been deprecated and is no longer supported by the redirector.
Tag: debian-watch-file-should-use-sf-redirector
Severity: normal
Certainty: certain
Ref: uscan(1)
Info: The watch file specifies a SourceForge page or download server
directly. This is not recommended; SourceForge changes their download
servers and website periodically, requiring watch files to be modified
every time. Instead, use the qa.debian.org redirector by using the magic
URL:
.
http://sf.net/<project>/<tar-name>-(.+)\.tar\.gz
.
replacing <project> with the name of the SourceForge
project and <tar-name> with the name of the tarball
distributed within that project. Adjust the filename regex as necessary.
Tag: debian-watch-file-specifies-wrong-upstream-version
Severity: normal
Certainty: certain
Ref: uscan(1)
Info: The watch file specifies an upstream version which exactly matches
the version of a debian/changelog entry, this is not a
native package, and no version mangling is being done. The version
field in a watch file should specify the expected upstream version, not
the version of the Debian package. Any epochs and Debian revisions
should be removed first or mangled away.
Tag: debian-watch-file-specifies-old-upstream-version
Severity: normal
Certainty: certain
Info: The watch file specifies an upstream version number which matches
the upstream portion of an old debian/changelog entry, and the
current debian/changelog entry specifies a newer upstream
version. The version number in the watch file is very likely to be
incorrect and probably should be replaced with the current expected
upstream version. Otherwise, DEHS and similar projects will think the
package is out of date even when it may not be.
Tag: debian-watch-may-check-gpg-signature
Severity: pedantic
Certainty: certain
Ref: uscan(1)
Info: This watch file does not include a means to verify
the upstream tarball using cryptographic signature.
.
If upstream distributions provide such signatures, please
use the pgpsigurlmangle options in this watch file's
opts= to generate the URL of an upstream GPG signature.
This signature is automatically downloaded and verified
against a keyring stored in debian/upstream-signing-key.asc.
.
Of course, not all upstreams provide such signatures, but
you could request them as a way of verifying that no third
party has modified the code against their wishes after the
release. Projects such as phpmyadmin, unrealircd, and
proftpd have suffered from this kind of attack.
Tag: debian-watch-file-pubkey-file-is-missing
Severity: important
Certainty: certain
Ref: uscan(1)
Info: This watch file verifies a cryptographic signature but
the upstream public key is missing.
.
Please add upstream public keys in either
debian/upstream/signing-key.asc or
debian/upstream/signing-key.pgp.
Tag: debian-watch-contains-dh_make-template
Severity: wishlist
Certainty: certain
Info: The watch file contains a standard template included by dh_make.
Please remove them once you have implemented the watch file.
lintian-2.5.22ubuntu1/checks/apache2.pm 0000664 0000000 0000000 00000021267 12311317575 014572 0 ustar # apache2 -- lintian check script -*- perl -*-
#
# Copyright © 2012 Arno Töll
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::apache2;
use strict;
use warnings;
use autodie;
use File::Basename;
use Lintian::Tags qw(tag);
use Lintian::Relation qw(:constants);
use Lintian::Util qw(fail);
sub run {
my ($pkg, $type, $info) = @_;
# Do nothing if the package in question appears to be related to
# the web server itself
return if $pkg =~ m/^apache2(:?\.2)?(?:-\w+)?$/;
# whether the package appears to be an Apache2 module/web application
my $seen_apache2_special_file = 0;
if ($type eq 'binary') {
foreach my $file ($info->sorted_index) {
# File is probably not relevant to us, ignore it
next if $file->is_dir;
next if $file !~ m#^(?:usr/lib/apache2/modules/|etc/apache2/)#;
# Package installs an unrecognized file - check this for all files
if ( $file !~ m#\.conf$#
and $file =~ m#^etc/apache2/(conf|site|mods)-available/(.*)$#){
my $temp_type = $1;
my $temp_file = $2;
# ... except modules which are allowed to ship .load files
tag 'apache2-configuration-files-need-conf-suffix', $file
unless $temp_type eq 'mods' and $temp_file =~ m#\.load#;
}
# Package appears to be a binary module
if ($file =~ m#^usr/lib/apache2/modules/(.*)\.so#) {
check_module_package($pkg, $info, $1);
$seen_apache2_special_file++;
}
# Package appears to be a web application
elsif ($file =~ m#^etc/apache2/(conf|site)-available/(.*)$#) {
check_web_application_package($pkg, $type, $info, $file, $1,
$2);
$seen_apache2_special_file++;
}
# Package appears to be a legacy web application
elsif ($file =~ m#^etc/apache2/conf\.d/(.*)$#) {
tag 'apache2-reverse-dependency-uses-obsolete-directory',$file;
check_web_application_package($pkg, $type, $info, $file,
'conf', $1);
$seen_apache2_special_file++;
}
# Package does scary things
elsif ($file =~ m#^etc/apache2/(?:conf|sites|mods)-enabled/.*$#) {
#<<< no perltidy (tag name is too long to fit)
tag 'apache2-reverse-dependency-ships-file-in-not-allowed-directory',
$file;
#>>>
$seen_apache2_special_file++;
}
}
if ($seen_apache2_special_file) {
check_maintainer_scripts($info);
}
}
return;
}
sub check_web_application_package {
my ($pkg, $type, $info, $file, $pkgtype, $webapp) = @_;
tag 'non-standard-apache2-configuration-name', $webapp, '!=', "$pkg.conf"
if $webapp ne "$pkg.conf"
or $webapp =~ m/^local-./;
my $rel = Lintian::Relation->and($info->relation('strong'),
$info->relation('recommends'));
# A web application must not depend on apache2-whatever
my $visit = sub {
if (m/^apache2(?:\.2)?-(?:common|data|bin)$/) {
tag 'web-application-depends-on-apache2-data-package', $_;
return 1;
}
return 0;
};
$rel->visit($visit, VISIT_STOP_FIRST_MATCH);
# ... nor on apache2 only. Moreover, it should be in the form
# apache2 | httpd but don't worry about versions, virtual package
# don't support that
if ($rel->implies('apache2')) {
tag 'web-application-should-not-depend-unconditionally-on-apache2';
}
if (defined $info->index($file)) {
inspect_conf_file($info, $pkgtype, $file);
}
return;
}
sub check_module_package {
my ($pkg, $info, $module) = @_;
# We want packages to be follow our naming scheme. Modules should be named
# libapache2-mod- if it ships a mod_foo.so
# NB: Some modules have uppercase letters in them (e.g. Ruwsgi), but
# obviously the package should be in all lowercase.
my $expected_name = 'libapache2-' . lc($module);
# Package depends on apache2-api-YYYYMMDD
my $seen_api_dependency = 0;
my $rel;
my $visit = sub {
if (m/^apache2(?:\.2)?-(?:common|data|bin)$/) {
tag 'apache2-module-depends-on-real-apache2-package', $_;
return 1;
}
return 0;
};
$expected_name =~ tr/_/-/;
if ($expected_name ne $pkg) {
tag 'non-standard-apache2-module-package-name', $pkg, '!=',
$expected_name;
}
$info->relation('strong')->visit($visit, VISIT_STOP_FIRST_MATCH);
$rel = Lintian::Relation->and($info->relation('strong'),
$info->relation('recommends'));
if (!$rel->matches(qr/^apache2-api-\d+$/o)) {
tag 'apache2-module-does-not-depend-on-apache2-api';
}
# The module is called mod_foo.so, thus the load file is expected to be
# named foo.load
my $load_file = $module;
my $conf_file = $module;
$load_file =~ s#^mod.(.*)$#etc/apache2/mods-available/$1.load#;
$conf_file =~ s#^mod.(.*)$#etc/apache2/mods-available/$1.conf#;
if (defined $info->index($load_file)) {
inspect_conf_file($info, 'mods', $load_file);
} else {
tag 'apache2-module-does-not-ship-load-file', $load_file;
}
if (defined $info->index($conf_file)) {
inspect_conf_file($info, 'mods', $conf_file);
}
return;
}
sub check_maintainer_scripts {
my ($info) = @_;
open(my $fd, '<', $info->lab_data_path('control-scripts'));
while (<$fd>){
m/^(\S*) (.*)$/ or fail("bad line in control-scripts file: $_");
my $interpreter = $1;
my $file = $2;
my $filename = $info->control($file);
# Don't follow links
next if -l $filename;
# Don't try to parse the file if it does not appear to be a
# shell script
next if $interpreter !~ m/sh\b/;
open(my $sfd, '<', $filename);
while (<$sfd>) {
# skip comments
next if substr($_, 0, $-[0]) =~ /#/;
# Do not allow reverse dependencies to call "a2enmod" and friends
# directly
if (m/\b(a2(?:en|dis)(?:conf|site|mod))\b/) {
tag 'apache2-reverse-dependency-calls-wrapper-script', $file,
$1;
}
# Do not allow reverse dependencies to call "invoke-rc.d apache2
if (m/invoke-rc\.d\s+apache2/) {
tag 'apache2-reverse-dependency-calls-invoke-rc.d', $file;
}
# XXX: Check whether apache2-maintscript-helper is used
# unconditionally e.g. not protected by a [ -e ], [ -x ] or so.
# That's going to be complicated. Or not possible without grammar
# parser.
}
close($sfd);
}
close($fd);
return;
}
sub inspect_conf_file {
my ($info, $conftype, $file) = @_;
my $filename = $info->unpacked($file);
# Don't follow links
return if -l $filename;
open(my $fd, '<', $filename);
while (<$fd>) {
for my $directive ('Order', 'Satisfy', 'Allow', 'Deny',
qr{?Limit.*?>}xsm, qr{?LimitExcept.*?>}xsm) {
if (m{\A \s* ($directive) (?:\s+|\Z)}xsm) {
tag 'apache2-deprecated-auth-config', $1;
}
}
if (m/^#\s*(Depends|Conflicts):\s+(.*?)\s*$/) {
my ($field, $value) = ($1, $2);
tag 'apache2-unsupported-dependency', $file, $field
if $field eq 'Conflicts' and $conftype ne 'mods';
my @dependencies = split(/[\n\s]+/, $value);
foreach my $dep (@dependencies) {
tag 'apache2-unparsable-dependency', $file, $dep
if $dep =~ m/\W/
or $dep =~ /^mod\_/
or $dep =~ m/\.(?:conf|load)/;
}
}
}
close($fd);
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/watch-file.pm 0000664 0000000 0000000 00000020761 12311317623 015302 0 ustar # watch-file -- lintian check script -*- perl -*-
#
# Copyright (C) 2008 Patrick Schoenfeld
# Copyright (C) 2008 Russ Allbery
# Copyright (C) 2008 Raphael Geissert
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::watch_file;
use strict;
use warnings;
use autodie;
use Lintian::Tags qw(tag);
use Lintian::Util qw(is_ancestor_of);
sub run {
my (undef, undef, $info) = @_;
my $template = 0;
my $withgpgverification = 0;
my $wfile = $info->debfiles('watch');
if (-l $wfile) {
return unless is_ancestor_of($info->debfiles, $wfile);
}
if (!-f $wfile) {
tag 'debian-watch-file-is-missing' unless ($info->native);
return;
}
# Perform the other checks even if it is a native package
tag 'debian-watch-file-in-native-package' if ($info->native);
# Check if the Debian version contains anything that resembles a repackaged
# source package sign, for fine grained version mangling check
my $version = $info->field('version');
my $repack;
# If the version field is missing, we assume a neutral non-native one.
$version = '0-1' unless defined $version;
if ($version =~ /(dfsg|debian|ds)/) {
$repack = $1;
}
my $prerelease;
if ($version =~ /(alpha|beta|rc)/i) {
$prerelease = $1;
}
# Gather information from the watch file and look for problems we can
# diagnose on the first time through.
open(my $fd, '<', $wfile);
local $_;
my ($watchver, %dversions);
while (<$fd>) {
$template = 1 if m/^\s*\#\s*Example watch control file for uscan/io;
next if /^\s*\#/;
next if /^\s*$/;
s/^\s*//;
CHOMP:
chomp;
if (s/(?;
goto CHOMP;
}
if (/^version\s*=\s*(\d+)(?:\s|\Z)/) {
if (defined $watchver) {
tag 'debian-watch-file-declares-multiple-versions', "line $.";
}
$watchver = $1;
if ($watchver ne '2' and $watchver ne '3') {
tag 'debian-watch-file-unknown-version', $watchver;
}
} else {
unless (defined($watchver)) {
tag 'debian-watch-file-missing-version';
$watchver = 1;
}
# Version 1 watch files are too broken to try checking them.
next if ($watchver == 1);
my (
$repack_mangle, $repack_dmangle,
$prerelease_mangle, $prerelease_umangle
) = (0, 0, 0, 0);
my ($opts, @opts);
if ( s/^opt(?:ion)?s=\"([^\"]+)\"\s+//
|| s/^opt(?:ion)?s=(\S+)\s+//) {
$opts = $1;
@opts = split(',', $opts);
for (@opts) {
$repack_mangle = 1
if defined $repack
and /^[ud]?versionmangle\s*=.*$repack/;
$repack_dmangle = 1
if defined $repack
and /^dversionmangle\s*=.*$repack/;
$prerelease_mangle = 1
if defined $prerelease
and /^[ud]?versionmangle\s*=.*$prerelease/;
$prerelease_umangle = 1
if defined $prerelease
and /^uversionmangle\s*=.*$prerelease/;
$withgpgverification = 1
if /^pgpsigurlmangle\s*=\s*/;
}
}
if (m%qa\.debian\.org/watch/sf\.php\?%) {
tag 'debian-watch-file-uses-deprecated-sf-redirector-method',
"line $.";
}
if (
m{ (?:https?|ftp)://
(?:(?:.+\.)?dl|(?:pr)?downloads?|ftp\d?|upload) \.
(?:sourceforge|sf)\.net}xsm
or m{https?://(?:www\.)?(?:sourceforge|sf)\.net
/project/showfiles\.php}xsm
or m{https?://(?:www\.)?(?:sourceforge|sf)\.net
/projects/.+/files}xsm
) {
tag 'debian-watch-file-should-use-sf-redirector', "line $.";
}
# This bit is as-is from uscan.pl:
my ($base, $filepattern, $lastversion, $action) = split ' ', $_, 4;
if ($base =~ s%/([^/]*\([^/]*\)[^/]*)$%/%) {
# Last component of $base has a pair of parentheses, so no
# separate filepattern field; we remove the filepattern from the
# end of $base and rescan the rest of the line
$filepattern = $1;
(undef, $lastversion, $action) = split ' ', $_, 3;
}
push @{$dversions{$lastversion}}, $. if (defined($lastversion));
$lastversion = 'debian' unless (defined($lastversion));
my $needs_repack_mangling = ($repack and $lastversion eq 'debian');
# If the version of the package contains dfsg, assume that it needs
# to be mangled to get reasonable matches with upstream.
if ($needs_repack_mangling and not $repack_mangle) {
tag 'debian-watch-file-should-mangle-version', "line $.";
}
if ( $needs_repack_mangling
and $repack_mangle
and not $repack_dmangle) {
tag
'debian-watch-file-should-dversionmangle-not-uversionmangle',
"line $.";
}
my $needs_prerelease_mangling
= ($prerelease and $lastversion eq 'debian');
if ( $needs_prerelease_mangling
and $prerelease_mangle
and not $prerelease_umangle) {
tag
'debian-watch-file-should-uversionmangle-not-dversionmangle',
"line $.";
}
}
}
close($fd);
tag 'debian-watch-contains-dh_make-template' if ($template);
tag 'debian-watch-may-check-gpg-signature' unless ($withgpgverification);
if ($withgpgverification) {
if ( !-f $info->debfiles('upstream-signing-key.pgp')
&& !-f $info->debfiles('upstream/signing-key.pgp')
&& !-f $info->debfiles('upstream/signing-key.asc')) {
tag 'debian-watch-file-pubkey-file-is-missing';
}
}
my $changes = $info->changelog;
if (defined $changes and %dversions) {
my $data = $changes->data;
my %changelog_versions;
my $count = 1;
for my $entry (@{$data}) {
my $uversion = $entry->Version;
$uversion =~ s/-[^-]+$//; # revision
$uversion =~ s/^\d+://; # epoch
$changelog_versions{'orig'}{$entry->Version} = $count;
# Preserve the first value here to correctly detect old versions.
$changelog_versions{'mangled'}{$uversion} = $count
unless (exists($changelog_versions{'mangled'}{$uversion}));
$count++;
}
while (my ($dversion, $lines) = each %dversions) {
next if (!defined($dversion) || $dversion eq 'debian');
local $" = ', ';
if (!$info->native
&& exists($changelog_versions{'orig'}{$dversion})) {
tag 'debian-watch-file-specifies-wrong-upstream-version',
$dversion, "line @{$lines}";
next;
}
if (exists($changelog_versions{'mangled'}{$dversion})
&& $changelog_versions{'mangled'}{$dversion} != 1) {
tag 'debian-watch-file-specifies-old-upstream-version',
$dversion, "line @{$lines}";
next;
}
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/menus.pm 0000664 0000000 0000000 00000061454 12311317614 014412 0 ustar # menus -- lintian check script -*- perl -*-
# somewhat of a misnomer -- it doesn't only check menus
# Copyright (C) 1998 Christian Schwarz
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::menus;
use strict;
use warnings;
use autodie;
use Lintian::Check qw(check_spelling check_spelling_picky $known_shells_regex);
use Lintian::Data;
use Lintian::Tags qw(tag);
use Lintian::Util qw(file_is_encoded_in_non_utf8 strip);
# Supported documentation formats for doc-base files.
our %known_doc_base_formats = map { $_ => 1 }
('html', 'text', 'pdf', 'postscript', 'info', 'dvi', 'debiandoc-sgml');
# Known fields for doc-base files. The value is 1 for required fields and 0
# for optional fields.
our %KNOWN_DOCBASE_MAIN_FIELDS = (
'document' => 1,
'title' => 1,
'section' => 1,
'abstract' => 0,
'author' => 0
);
our %KNOWN_DOCBASE_FORMAT_FIELDS = (
'format' => 1,
'files' => 1,
'index' => 0
);
our $SECTIONS = Lintian::Data->new('doc-base/sections');
sub run {
my ($pkg, $type, $info, undef, $group) = @_;
my (%all_files, %all_links);
my %preinst;
my %postinst;
my %prerm;
my %postrm;
my $docbase_file;
my $menu_file;
my $menumethod_file;
my $anymenu_file;
my $documentation;
check_script($pkg, $info->control('preinst'), 'preinst', \%preinst);
check_script($pkg, $info->control('postinst'), 'postinst', \%postinst);
check_script($pkg, $info->control('prerm'), 'prerm', \%prerm);
check_script($pkg, $info->control('postrm'), 'postrm', \%postrm);
# read package contents
for my $file ($info->sorted_index) {
add_file_link_info($info, $file->name, \%all_files, \%all_links);
my $operm = $file->operm;
if ($file->is_file) { # file checks
# menu file?
if ($file =~ m,^usr/(lib|share)/menu/\S,o) { # correct permissions?
if ($operm & 0111) {
tag 'executable-menu-file',
sprintf('%s %04o', $file, $operm);
}
next if $file =~ m,^usr/(?:lib|share)/menu/README$,;
if ($file =~ m,^usr/lib/,o) {
tag 'menu-file-in-usr-lib', $file;
}
$menu_file = $file;
if ( $file =~ m,usr/(?:lib|share)/menu/menu$,o
and $pkg ne 'menu') {
tag 'bad-menu-file-name', $file;
}
}
# doc-base file?
elsif ($file =~ m,^usr/share/doc-base/\S,o){ # correct permissions?
if ($operm & 0111) {
tag 'executable-in-usr-share-docbase', $file,
sprintf('%04o', $operm);
}
$docbase_file = $file;
}
#menu-methods file?
elsif ($file =~ m,^etc/menu-methods/\S,o) {
#TODO: we should test if the menu-methods file
# is made executable in the postinst as recommended by
# the menu manual
my $menumethod_includes_menu_h = 0;
my $local_file = $file;
$local_file =~ s,^etc/menu-methods/,,;
$menumethod_file = $file;
open(my $fd, '<',
$info->lab_data_path("menu/methods/$local_file"));
while (<$fd>) {
chomp;
if (m,^!include menu.h,o) {
$menumethod_includes_menu_h = 1;
last;
}
}
close($fd);
tag 'menu-method-should-include-menu-h', $file
unless $menumethod_includes_menu_h
or $pkg eq 'menu';
}
# package doc dir?
elsif (
$file =~ m{ \A usr/share/doc/(?:[^/]+/)?
(.+\.(?:html|pdf))(?:\.gz)?
\Z}xsmo
) {
my $name = $1;
unless ($name =~ m/^changelog\.html$/o
or $name =~ m/^README[.-]/o
or $name =~ m|examples|o) {
$documentation = 1;
}
}
}
}
# prerm scripts should not call update-menus
if ($prerm{'calls-updatemenus'}) {
tag 'prerm-calls-updatemenus';
}
# postrm scripts should not call install-docs
if ($postrm{'calls-installdocs'} or $postrm{'calls-installdocs-r'}) {
tag 'postrm-calls-installdocs';
}
# preinst scripts should not call either update-menus nor installdocs
if ($preinst{'calls-updatemenus'}) {
tag 'preinst-calls-updatemenus';
}
if ($preinst{'calls-installdocs'}) {
tag 'preinst-calls-installdocs';
}
$anymenu_file = $menu_file || $menumethod_file;
# No one needs to call install-docs any more; triggers now handles that.
if ($postinst{'calls-installdocs'} or $postinst{'calls-installdocs-r'}) {
tag 'postinst-has-useless-call-to-install-docs';
}
if ($prerm{'calls-installdocs'} or $prerm{'calls-installdocs-r'}) {
tag 'prerm-has-useless-call-to-install-docs';
}
# check consistency
# docbase file?
if ($docbase_file) {
my $dbdir = $info->lab_data_path('doc-base');
if (-d $dbdir) {
opendir(my $dirfd, $dbdir);
my $dbfile;
while (defined($dbfile = readdir($dirfd))) {
next if $dbfile eq '.' or $dbfile eq '..';
my $dbpath = "$dbdir/$dbfile";
# don't try to parse executables, plus we already
# warned about it. Skip symlinks as well, unlikely to
# be used for real doc-base files.
next if -x $dbpath or -l $dbpath or not -f $dbpath;
check_doc_base_file($dbfile, $dbpath, $pkg, \%all_files,
\%all_links, $group);
}
closedir($dirfd);
}
} elsif ($documentation) {
if ($pkg =~ /^libghc6?-.*-doc$/) {
# This is the library documentation for a haskell library. Haskell
# libraries register their documentation via the ghc compiler's
# documetation registration mechanism. See bug #586877.
} else {
tag 'possible-documentation-but-no-doc-base-registration';
}
}
if ($anymenu_file) {
# postinst and postrm should not need to call update-menus
# unless there is a menu-method file. However, update-menus
# currently won't enable packages that have outstanding
# triggers, leading to an update-menus call being required for
# at least some packages right now. Until this bug is fixed,
# we still require it. See #518919 for more information.
#
# That bug does not require calling update-menus from postrm,
# but debhelper apparently currently still adds that to the
# maintainer script, so don't warn if it's done.
if (not $postinst{'calls-updatemenus'}) {
tag 'postinst-does-not-call-updatemenus', $anymenu_file;
}
if ($menumethod_file and not $postrm{'calls-updatemenus'}) {
tag 'postrm-does-not-call-updatemenus', $menumethod_file
unless $pkg eq 'menu';
}
} else {
if ($postinst{'calls-updatemenus'}) {
tag 'postinst-has-useless-call-to-update-menus';
}
if ($postrm{'calls-updatemenus'}) {
tag 'postrm-has-useless-call-to-update-menus';
}
}
return;
}
# -----------------------------------
sub check_doc_base_file {
my ($dbfile, $dbpath, $pkg, $all_files, $all_links, $group) = @_;
my $line = file_is_encoded_in_non_utf8($dbpath);
if ($line) {
tag 'doc-base-file-uses-obsolete-national-encoding', "$dbfile:$line";
}
my (@files, $field, @vals);
my $knownfields = \%KNOWN_DOCBASE_MAIN_FIELDS;
$line = 0; # global
my %sawfields = (); # local for each section of control file
my %sawformats = (); # global for control file
open(my $fd, '<', $dbpath);
while (<$fd>) {
chomp;
# New field. check previous field, if we have any.
if (/^(\S+)\s*:\s*(.*)$/) {
my (@new) = ($1, $2);
if ($field) {
check_doc_base_field(
$pkg, $dbfile, $line, $field,
\@vals,\%sawfields, \%sawformats, $knownfields,
$all_files, $all_links, $group
);
}
$field = lc $new[0];
@vals = ($new[1]);
$line = $.;
# Continuation of previously defined field.
} elsif ($field && /^\s+\S/) {
push(@vals, $_);
# All tags will be reported on the last continuation line of the
# doc-base field.
$line = $.;
# Sections' separator.
} elsif (/^(\s*)$/) {
tag 'doc-base-file-separator-extra-whitespace', "$dbfile:$."
if $1;
next unless $field; # skip successive empty lines
# Check previously defined field and section.
check_doc_base_field(
$pkg, $dbfile, $line, $field,
\@vals,\%sawfields, \%sawformats, $knownfields,
$all_files, $all_links, $group
);
check_doc_base_file_section($dbfile, $line + 1, \%sawfields,
\%sawformats, $knownfields);
# Intialize variables for new section.
undef $field;
undef $line;
@vals = ();
%sawfields = ();
# Each section except the first one is format section.
$knownfields = \%KNOWN_DOCBASE_FORMAT_FIELDS;
# Everything else is a syntax error.
} else {
tag 'doc-base-file-syntax-error', "$dbfile:$.";
}
}
# Check the last field/section of the control file.
if ($field) {
check_doc_base_field(
$pkg, $dbfile, $line, $field,
\@vals, \%sawfields,\%sawformats, $knownfields,
$all_files,$all_links, $group
);
check_doc_base_file_section($dbfile, $line, \%sawfields, \%sawformats,
$knownfields);
}
# Make sure we saw at least one format.
tag 'doc-base-file-no-format-section', "$dbfile:$." unless %sawformats;
close($fd);
return;
}
# Checks one field of a doc-base control file. $vals is array ref containing
# all lines of the field. Modifies $sawfields and $sawformats.
sub check_doc_base_field {
my (
$pkg, $dbfile, $line, $field,
$vals, $sawfields, $sawformats,$knownfields,
$all_files, $all_links, $group
) = @_;
tag 'doc-base-file-unknown-field', "$dbfile:$line", $field
unless defined $knownfields->{$field};
tag 'doc-base-file-duplicated-field', "$dbfile:$line", $field
if $sawfields->{$field};
$sawfields->{$field} = 1;
# Index/Files field.
#
# Check if files referenced by doc-base are included in the package. The
# Index field should refer to only one file without wildcards. The Files
# field is a whitespace-separated list of files and may contain wildcards.
# We skip without validating wildcard patterns containing character
# classes since otherwise we'd need to deal with wildcards inside
# character classes and aren't there yet.
if ($field eq 'index' or $field eq 'files') {
my @files = map { split('\s+', $_) } @$vals;
if ($field eq 'index' && @files > 1) {
tag 'doc-base-index-references-multiple-files', "$dbfile:$line";
}
for my $file (@files) {
next if $file eq '';
my $realfile = delink($file, $all_links);
# openoffice.org-dev-doc has thousands of files listed so try to
# use the hash if possible.
my $found;
if ($realfile =~ /[*?]/) {
my $regex = quotemeta($realfile);
unless ($field eq 'index') {
next if $regex =~ /\[/;
$regex =~ s%\\\*%[^/]*%g;
$regex =~ s%\\\?%[^/]%g;
$regex .= '/?';
}
$found = grep { /^$regex\z/ } keys %$all_files;
} else {
$found = $all_files->{$realfile} || $all_files->{"$realfile/"};
}
unless ($found) {
tag 'doc-base-file-references-missing-file', "$dbfile:$line",
$file;
}
}
undef @files;
# Format field.
} elsif ($field eq 'format') {
my $format = join(' ', @$vals);
strip($format);
$format = lc $format;
tag 'doc-base-file-unknown-format', "$dbfile:$line", $format
unless $known_doc_base_formats{$format};
tag 'doc-base-file-duplicated-format', "$dbfile:$line", $format
if $sawformats->{$format};
$sawformats->{$format} = 1;
# Save the current format for the later section check.
$sawformats->{' *current* '} = $format;
# Document field.
} elsif ($field eq 'document') {
$_ = join(' ', @$vals);
tag 'doc-base-invalid-document-field', "$dbfile:$line", $_
unless /^[a-z0-9+.-]+$/;
tag 'doc-base-document-field-ends-in-whitespace', "$dbfile:$line"
if /[ \t]$/;
tag 'doc-base-document-field-not-in-first-line', "$dbfile:$line"
unless $line == 1;
# Title field.
} elsif ($field eq 'title') {
if (@$vals) {
check_spelling(
'spelling-error-in-doc-base-title-field',
join(' ', @$vals),
"$dbfile:$line",$group->info->spelling_exceptions
);
check_spelling_picky(
'spelling-error-in-doc-base-title-field',
join(' ', @$vals),
"$dbfile:$line"
);
}
# Section field.
} elsif ($field eq 'section') {
$_ = join(' ', @$vals);
unless ($SECTIONS->known($_)) {
if (m,^App(?:lication)?s/(.+)$, and $SECTIONS->known($1)) {
tag 'doc-base-uses-applications-section', "$dbfile:$line", $_;
} elsif (m,^(.+)/(?:[^/]+)$, and $SECTIONS->known($1)) {
# allows creating a new subsection to a known section
} else {
tag 'doc-base-unknown-section', "$dbfile:$line", $_;
}
}
# Abstract field.
} elsif ($field eq 'abstract') {
# The three following variables are used for checking if the field is
# correctly phrased. We detect if each line (except for the first
# line and lines containing single dot) of the field starts with the
# same number of spaces, not followed by the same non-space character,
# and the number of spaces is > 1.
#
# We try to match fields like this:
# ||Abstract: The Boost web site provides free peer-reviewed portable
# || C++ source libraries. The emphasis is on libraries which work
# || well with the C++ Standard Library. One goal is to establish
#
# but not like this:
# ||Abstract: This is "Ding"
# || * a dictionary lookup program for Unix,
# || * DIctionary Nice Grep,
my $leadsp = undef; # string with leading spaces from second line
my $charafter = undef; # first non-whitespace char of second line
my $leadsp_ok = 1; # are spaces OK?
# Intentionally skipping the first line.
for my $idx (1 .. $#{$vals}) {
$_ = $vals->[$idx];
if (/manage\s+online\s+manuals\s.*Debian/o) {
tag 'doc-base-abstract-field-is-template', "$dbfile:$line"
unless $pkg eq 'doc-base';
} elsif (/^(\s+)\.(\s*)$/o and ($1 ne ' ' or $2)) {
tag 'doc-base-abstract-field-separator-extra-whitespace',
"$dbfile:" . ($line - $#{$vals} + $idx);
} elsif (!$leadsp && /^(\s+)(\S)/o) {
# The regexp should always match.
($leadsp, $charafter) = ($1, $2);
$leadsp_ok = $leadsp eq ' ';
} elsif (!$leadsp_ok && /^(\s+)(\S)/o) {
# The regexp should always match.
undef $charafter if $charafter && $charafter ne $2;
$leadsp_ok = 1
if ($1 ne $leadsp) || ($1 eq $leadsp && $charafter);
}
}
unless ($leadsp_ok) {
tag 'doc-base-abstract-might-contain-extra-leading-whitespace',
"$dbfile:$line";
}
# Check spelling.
if (@$vals) {
check_spelling(
'spelling-error-in-doc-base-abstract-field',
join(' ', @$vals),
"$dbfile:$line",$group->info->spelling_exceptions
);
check_spelling_picky(
'spelling-error-in-doc-base-abstract-field',
join(' ', @$vals),
"$dbfile:$line"
);
}
}
return;
}
# Checks the section of the doc-base control file. Tries to find required
# fields missing in the section.
sub check_doc_base_file_section {
my ($dbfile, $line, $sawfields, $sawformats, $knownfields) = @_;
tag 'doc-base-file-no-format', "$dbfile:$line"
if ((defined $sawfields->{'files'} || defined $sawfields->{'index'})
&& !(defined $sawfields->{'format'}));
# The current format is set by check_doc_base_field.
if ($sawfields->{'format'}) {
my $format = $sawformats->{' *current* '};
tag 'doc-base-file-no-index', "$dbfile:$line"
if ( $format
&& ($format eq 'html' || $format eq 'info')
&& !$sawfields->{'index'});
}
for my $field (sort keys %$knownfields) {
tag 'doc-base-file-lacks-required-field', "$dbfile:$line", $field
if ($knownfields->{$field} == 1 && !$sawfields->{$field});
}
return;
}
# Add file and link to $all_files and $all_links. Note that both files and
# links have to include a leading /.
sub add_file_link_info {
my ($info, $file, $all_files, $all_links) = @_;
my $link = $info->index($file)->link;
my $ishard = $info->index($file)->is_hardlink;
$file = '/' . $file if (not $file =~ m%^/%); # make file absolute
$file =~ s%/+%/%g; # remove duplicated `/'
$all_files->{$file} = 1;
if (defined $link) {
$link = './' . $link if $link !~ m,^/,;
if ($ishard) {
$link =~ s,^\./,/,;
} elsif (not $link =~ m,^/,) { # not absolute link
$link
= '/' . $link; # make sure link starts with '/'
$link =~ s,/+\./+,/,g; # remove all /./ parts
my $dcount = 1;
while ($link =~ s,^/+\.\./+,/,) { #\ count & remove
$dcount++; #/ any leading /../ parts
}
my $f = $file;
while ($dcount--) { #\ remove last $dcount
$f =~ s,/[^/]*$,,; #/ path components from $file
}
$link
= $f. $link; # now we should have absolute link
}
$all_links->{$file} = $link unless ($link eq $file);
}
return;
}
# Dereference all symlinks in file.
sub delink {
my ($file, $all_links) = @_;
$file =~ s%/+%/%g; # remove duplicated '/'
return $file unless %$all_links; # package doesn't symlinks
my $p1 = '';
my $p2 = $file;
my %used_links = ();
# In the loop below we split $file into two parts on each '/' until
# there's no remaining slashes. We try substituting the first part with
# corresponding symlink and if it succeedes, we start the procedure from
# beginning.
#
# Example:
# Let $all_links{"/a/b"} == "/d", and $file == "/a/b/c"
# Then 0) $p1 == "", $p2 == "/a/b/c"
# 1) $p1 == "/a", $p2 == "/b/c"
# 2) $p1 == "/a/b", $p2 == "/c" ; substitute "/d" for "/a/b"
# 3) $p1 == "", $p2 == "/d/c"
# 4) $p1 == "/d", $p2 == "/c"
# 5) $p1 == "/d/c", $p2 == ""
#
# Note that the algorithm supposes, that
# i) $all_links{$X} != $X for each $X
# ii) both keys and values of %all_links start with '/'
while (($p2 =~ s%^(/[^/]*)%%g) > 0) {
$p1 .= $1;
if (defined $all_links->{$p1}) {
return '!!! SYMLINK LOOP !!!' if defined $used_links{$p1};
$p2 = $all_links->{$p1} . $p2;
$p1 = '';
$used_links{$p1} = 1;
}
}
# After the loop $p2 should be empty and $p1 should contain the target
# file. In some rare cases when $file contains no slashes, $p1 will be
# empty and $p2 will contain the result (which will be equal to $file).
return $p1 ne '' ? $p1 : $p2;
}
sub check_script {
my ($pkg, $spath, $script, $pres) = @_;
my ($no_check_menu, $no_check_installdocs, $interp);
# control files are regular files and not symlinks, pipes etc.
return if -l $spath or not -f $spath;
open(my $fd, '<', $spath);
$interp = <$fd>;
$interp = '' unless defined $interp;
if ($interp =~ m,^\#\!\s*/bin/$known_shells_regex,) {
$interp = 'sh';
} elsif ($interp =~ m,^\#\!\s*/usr/bin/perl,) {
$interp = 'perl';
} else {
if ($interp =~ m,^\#\!\s*(.+),) {
$interp = $1;
} else { # hmm, doesn't seem to start with #!
# is it a binary? look for ELF header
if ($interp =~ m/^\177ELF/) {
return; # nothing to do here
}
$interp = 'unknown';
}
}
while (<$fd>) {
# skip comments
s/\#.*$//o;
##
# update-menus will satisfy the checks that the menu file
# installed is properly used
##
# does the script check whether update-menus exists?
if ( /-x\s+\S*update-menus/o
or /(?:which|type)\s+update-menus/o
or /command\s+.*?update-menus/o) {
# yes, it does.
$pres->{'checks-for-updatemenus'} = 1;
}
# does the script call update-menus?
# TODO this regex-magic should be moved to some lib for checking
# whether a certain word is likely called as command... --Jeroen
if (
m{ (?:^\s*|[;&|]\s*|(?:then|do|exec)\s+)
(?:\/usr\/bin\/)?update-menus
(?:\s|[;&|<>]|\Z)}xsm
) {
# yes, it does.
$pres->{'calls-updatemenus'} = 1;
# checked first?
if (not $pres->{'checks-for-updatemenus'} and $pkg ne 'menu') {
#<<< no perltidy - tag name too long
tag 'maintainer-script-does-not-check-for-existence-of-updatemenus',
#>>>
"$script:$."
unless $no_check_menu++;
}
}
# does the script check whether install-docs exists?
if ( s/-x\s+\S*install-docs//o
or /(?:which|type)\s+install-docs/o
or s/command\s+.*?install-docs//o) {
# yes, it does.
$pres->{'checks-for-installdocs'} = 1;
}
# does the script call install-docs?
if (
m{ (?:^\s*|[;&|]\s*|(?:then|do)\s+)
(?:\/usr\/sbin\/)?install-docs
(?:\s|[;&|<>]|\Z) }xsm
) {
# yes, it does. Does it remove or add a doc?
if (m/install-docs\s+(?:-r|--remove)\s/) {
$pres->{'calls-installdocs-r'} = 1;
} else {
$pres->{'calls-installdocs'} = 1;
}
# checked first?
if (not $pres->{'checks-for-installdocs'}) {
#<<< no perltidy - tag name too long
tag 'maintainer-script-does-not-check-for-existence-of-installdocs',
#>>>
$script
unless $no_check_installdocs++;
}
}
}
close($fd);
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/testsuite.pm 0000664 0000000 0000000 00000011133 12311317622 015300 0 ustar # testsuite -- lintian check script -*- perl -*-
# Copyright (C) 2013 Nicolas Boulenguez
# This file is part of lintian.
# Lintian is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Lintian is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with Lintian. If not, see .
package Lintian::testsuite;
use strict;
use warnings;
use autodie;
use Lintian::Tags qw(tag);
use Lintian::Util qw(
file_is_encoded_in_non_utf8
read_dpkg_control
);
my @MANDATORY_FIELDS = qw(
tests
);
my %KNOWN_FIELDS = map { $_ => 1 } qw(
tests
restrictions
features
depends
tests-directory
);
my %KNOWN_FEATURES = map { $_ => 1 } qw(
);
my %KNOWN_RESTRICTIONS = map { $_ => 1 } qw(
allow-stderr
breaks-testbed
build-needed
needs-root
rw-build-tree
);
sub run {
my ($pkg, $type, $info) = @_;
my $testsuite = $info->field('testsuite');
my $control = $info->index('debian/tests/control');
if (defined($testsuite) xor defined($control)) {
tag 'inconsistent-testsuite-field';
}
if (defined($testsuite) and $testsuite ne 'autopkgtest') {
tag 'unknown-testsuite', $testsuite;
}
if (defined($control)) {
if (not $control->is_regular_file) {
tag 'debian-tests-control-is-not-a-regular-file';
} else {
# Since $control is defined, we know that none of the
# parent segments (i.e. debian and debian/tests) were
# symlinks. With the "is_regular_file" test above we know
# that the file itself is not a symlink. These two facts
# _combined_ means we can skip the is_ancestor_of check
# here.
my $path = $info->unpacked($control);
my $not_utf8_line = file_is_encoded_in_non_utf8($path);
if ($not_utf8_line) {
tag 'debian-tests-control-uses-national-encoding',
"at line $not_utf8_line";
}
check_control_contents($info, $path);
}
}
return;
}
sub check_control_contents {
my ($info, $path) = @_;
my @paragraphs;
if (not eval { @paragraphs = read_dpkg_control($path); }) {
chomp $@;
$@ =~ s/^syntax error at //;
tag 'syntax-error-in-debian-tests-control', $@;
} else {
for my $paragraph (@paragraphs) {
check_control_paragraph($info, $paragraph);
}
}
return;
}
sub check_control_paragraph {
my ($info, $paragraph) = @_;
for my $fieldname (@MANDATORY_FIELDS) {
if (not exists $paragraph->{$fieldname}) {
tag 'missing-runtime-tests-field', $fieldname;
}
}
for my $fieldname (sort(keys(%{$paragraph}))) {
if (not exists $KNOWN_FIELDS{$fieldname}) {
tag 'unknown-runtime-tests-field', $fieldname;
}
}
if (exists $paragraph->{'features'}) {
for my $feature (split(' ', $paragraph->{'features'})) {
if (not exists $KNOWN_FEATURES{$feature}) {
tag 'unknown-runtime-tests-feature', $feature;
}
}
}
if (exists $paragraph->{'restrictions'}) {
for my $restriction (split ' ', $paragraph->{'restrictions'}) {
if (not exists $KNOWN_RESTRICTIONS{$restriction}) {
tag 'unknown-runtime-tests-restriction', $restriction;
}
}
}
if (exists $paragraph->{'tests'}) {
my $directory = 'debian/tests';
if (exists $paragraph->{'tests-directory'}) {
$directory = $paragraph->{'tests-directory'};
}
for my $testname (split(' ', $paragraph->{'tests'})) {
check_test_file($info, $directory, $testname);
}
}
return;
}
sub check_test_file {
my ($info, $directory, $name) = @_;
my $path = "$directory/$name";
my $index = $info->index($path);
if ($name !~ m{^ [ [:alnum:] \+ \- \. / ]++ $}xsm) {
tag 'illegal-runtime-test-name', $name;
}
if (not defined($index)) {
tag 'missing-runtime-test-file', $path;
} elsif (not $index->is_regular_file) {
tag 'runtime-test-file-is-not-a-regular-file', $path;
}
# Test files are allowed not to be executable.
return;
}
1;
lintian-2.5.22ubuntu1/checks/java.desc 0000664 0000000 0000000 00000007710 12310413144 014473 0 ustar Check-Script: java
Author: Vincent Fourmond
Abbrev: java
Type: binary
Needs-Info: java-info, index
Info: This script checks if the packages comply with various aspects of the
debian Java policy.
Tag: classpath-contains-relative-path
Severity: normal
Certainty: possible
Info: The classpath listed in the jar file refers to a potential
missing jar file. This could be the remnants of a build-time
classpath that are not relevant for a JAR bundled in a Debian
package.
.
Alternatively, the classpath may be correct, but the package is
lacking a jar file or a symlink to it.
.
Note, Lintian assumes that all (relative) classpaths pointing to
/usr/share/java/ (but not subdirs thereof) are satisfied by
dependencies as long as there is at least one strong libX-java
dependency.
Tag: jar-not-in-usr-share
Severity: normal
Certainty: possible
Ref: java-policy 2.2, java-policy 2.3
Info: The classpath listed in some of the files references files outside
of /usr/share, while all installed JAR files must be within
/usr/share/java for libraries or /usr/share/package for JARs for
private use.
.
The rationale is that jar files are in almost all cases architecture
independent and therefore should be in /usr/share. If the jar file is
truly architecture dependent or it cannot be moved since symlinked jar
files are not accepted by the application, then please override this
tag.
Tag: executable-jar-without-main-class
Severity: serious
Certainty: certain
Ref: java-policy 2.2
Info: An executable JAR must have a Main-Class set in its manifest.
Tag: missing-dep-on-jarwrapper
Severity: serious
Certainty: certain
Ref: java-policy 2.2
Info: Packages containing an executable JAR must depend on jarwrapper or
other packages providing similar functionalities.
Tag: missing-classpath
Severity: normal
Certainty: possible
Info: None of the jar files contained in the package declare a Class-Path
in their manifest, but the package depends on at least one java library.
That means that either the dependency is not needed or at least one of
the JARs should include a classpath.
.
It is important to keep the classpath up-to-date to allow the
automatic detection of dependencies at run time. Having a Class-Path
element in the manifest allows for painless transitions if the class
path of the dependencies of the library ever changes.
.
Failing to do that means that for every change in class path, all
rdepends must update their wrapper scripts, which is a lot of work
for nothing.
Tag: javalib-but-no-public-jars
Severity: minor
Certainty: possible
Info: The name of the package suggests that it contains a java library but
it does not contain any JAR file in /usr/share/java, while the java policy
mandates that JAR files outside /usr/share/java are for private use.
Tag: missing-manifest
Severity: minor
Certainty: possible
Info: The jar file contains .class files but no manifest. This may
indicate a build misconfiguration.
Tag: codeless-jar
Severity: normal
Certainty: certain
Info: The jar file contains a manifest but no code. This probably indicates
that something went wrong at build-time.
Tag: incompatible-java-bytecode-format
Severity: normal
Certainty: possible
Info: The package contains Java class files with a minimum requirement on the
listed Java version. This Java version is not supported by the default JVM
in Debian and is therefore likely to be a mistake.
Ref: #673276
Tag: unknown-java-class-version
Severity: normal
Certainty: certain
Info: The package contains a Jar file with Java class files compiled for an
unknown Java version. Most likely the class file is corrupt or compiled
for a newer version of Java than Lintian knows about. In the latter case,
please file a bug against Lintian.
.
Latest class version known by Lintian is Java7 (Major version 51).
Tag: zip-parse-error
Severity: normal
Certainty: certain
Info: The package contains a Jar file, but Lintian is unable to parse it.
It is possible that the Jar file is corrupt.
lintian-2.5.22ubuntu1/checks/menu-format.pm 0000664 0000000 0000000 00000064001 12311317613 015503 0 ustar # menu format -- lintian check script -*- perl -*-
# Copyright (C) 1998 by Joey Hess
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
# This script also checks desktop entries, since they share quite a bit of
# code. At some point, it would make sense to try to refactor this so that
# shared code is in libraries.
#
# Further things that the desktop file validation should be checking:
#
# - Encoding of the file should be UTF-8.
# - Additional Categories should be associated with Main Categories.
# - List entries (MimeType, Categories) should end with a semicolon.
# - Check for GNOME/GTK/X11/etc. dependencies and require the relevant
# Additional Category to be present.
# - Check all the escape characters supported by Exec.
# - Review desktop-file-validate to see what else we're missing.
package Lintian::menu_format;
use strict;
use warnings;
use autodie;
use File::Basename;
use List::MoreUtils qw(any);
use Lintian::Data;
use Lintian::Tags qw(tag);
use Lintian::Util qw(is_ancestor_of);
# This is a list of all tags that should be in every menu item.
my @req_tags = qw(needs section title command);
# This is a list of all known tags.
my @known_tags = qw(
needs
section
title
sort
command
longtitle
icon
icon16x16
icon32x32
description
hotkey
hints
);
# These 'needs' tags are always valid, no matter the context, and no other
# values are valid outside the Window Managers context (don't include wm here,
# in other words). It's case insensitive, use lower case here.
my @needs_tag_vals = qw(x11 text vc);
sub _menu_sections {
my ($key, $val, $cur) = @_;
my $ret = undef;
$ret = $cur = {} unless defined $cur;
# $val is empty if this is just a root section
$cur->{$val} = 1 if $val;
return $ret;
}
my $MENU_SECTIONS
= Lintian::Data->new('menu-format/menu-sections',qr|/|, \&_menu_sections);
# Authorative source of desktop keys:
# http://standards.freedesktop.org/desktop-entry-spec/1.0/
#
# This is a list of all keys that should be in every desktop entry.
my @req_desktop_keys = qw(Type Name);
# This is a list of all known keys.
my %known_desktop_keys = map { $_ => 1 } qw(
Type
Version
Name
GenericName
NoDisplay
Comment
Icon
Hidden
Keywords
OnlyShowIn
NotShowIn
TryExec
Exec
Path
Terminal
MimeType
Categories
MimeType
Categories
StartupNotify
StartupWMClass
URL
);
my %deprecated_desktop_keys = map { $_ => 1 } qw(
Encoding
MiniIcon
TerminalOptions
Protocols
Extensions
BinaryPattern
MapNotify
SwallowTitle
SwallowExec
SortOrder
FilePattern
);
# KDE uses some additional keys that should start with X-KDE but don't for
# historical reasons. Actions will in theory be in a later version of the
# standard (it's not mentioned in the current standard, but is implemented by
# KDE and widely used).
my %kde_desktop_keys = map { $_ => 1 } qw(
ServiceTypes
DocPath
Keywords
InitialPreference
Dev
FSType
MountPoint
ReadOnly
UnmountIcon
Actions
);
# Known types of desktop entries.
# http://standards.freedesktop.org/desktop-entry-spec/1.0/ar01s05.html
my %known_desktop_types = map { $_ => 1 } qw(
Application
Link
Directory
);
# Authorative source of desktop categories:
# http://standards.freedesktop.org/menu-spec/1.0/apa.html
# This is a list of all Main Categories for .desktop files. Application is
# added as an exception; it's not listed in the standard, but it's widely used
# and used as an example in the GNOME documentation. GNUstep is added as an
# exception since it's used by GNUstep packages.
my %main_categories = map { $_ => 1 } qw(
AudioVideo
Audio
Video
Development
Education
Game
Graphics
Network
Office
Science
Settings
System
Utility
Application
GNUstep
);
# This is a list of all Additional Categories for .desktop files. Ideally we
# should be checking to be sure the associated Main Categories are present,
# but we don't have support for that yet.
my $ADD_CATEGORIES = Lintian::Data->new('menu-format/add-categories');
# This is a list of Reserved Categories for .desktop files. To use one of
# these, the desktop entry must also have an OnlyShowIn key limiting the
# environment to one that supports this category.
my %reserved_categories = map { $_ => 1 } qw(
Screensaver
TrayIcon
Applet
Shell
);
# Path in which to search for binaries referenced in menu entries. These must
# not have leading slashes.
my @path = qw(usr/local/bin/ usr/bin/ bin/ usr/X11R6/bin/ usr/games/);
my %known_tags_hash = map { $_ => 1 } @known_tags;
my %needs_tag_vals_hash = map { $_ => 1 } @needs_tag_vals;
# -----------------------------------
sub run {
my ($pkg, $type, $info, $proc, $group) = @_;
my $mdir = $info->lab_data_path('menu');
my @menufiles;
for my $dir ("$mdir/lib", "$mdir/share") {
opendir(my $dirfd, $dir);
push(@menufiles, map { "$dir/$_" } readdir($dirfd));
closedir($dirfd);
}
# Find the desktop files in the package for verification.
my @desktop_files;
foreach my $file ($info->sorted_index) {
my $operm = $file->operm;
tag 'deprecated-kdelnk-file', $file if ($file =~ m,\.kdelnk$,);
if ( $file->is_file
&& $file =~ m,^usr/share/applications/.*\.desktop$,) {
if ($operm & 0111) {
tag 'executable-desktop-file', sprintf('%s %04o',$file,$operm);
}
unless ($file =~ m,template,o) {
push(@desktop_files, $file);
}
}
}
# Verify all the desktop files.
for my $desktop_file (@desktop_files) {
verify_desktop_file($desktop_file, $desktop_file, $pkg, $info);
}
# Now all the menu files.
foreach my $menufile (@menufiles) {
next if -x $menufile; # don't try to parse executables
my $basename = basename $menufile;
my $fullname = "usr/share/menu/$basename";
$fullname = "usr/lib/menu/$basename"
if $menufile =~ m,^\Q$mdir\E/lib/,;
next if $basename eq 'README'; # README is a special case
next if !is_ancestor_of($mdir, $menufile);
my $menufile_line ='';
open(my $fd, '<', $menufile);
# line below is commented out in favour of the while loop
# do { $_=; } while defined && (m/^\s* \#/ || m/^\s*$/);
while (<$fd>) {
if (m/^\s*\#/ || m/^\s*$/) {
next;
} else {
$menufile_line = $_;
last;
}
}
# Check first line of file to see if it matches the old menu
# file format.
if ($menufile_line =~ m/^(?!\?package\(.*\)).* .* .* .* "?.*"? .*$/o) {
tag 'old-format-menu-file', $fullname;
close($fd);
next;
} elsif ($menufile_line =~ m/^!C\s*menu-2/o) {
# we can't parse that yet
close($fd);
next;
}
# Parse entire file as a new format menu file.
my $line='';
my $lc=0;
do {
$lc++;
# Ignore lines that are comments.
if ($menufile_line =~ m/^\s*\#/o) {
next;
}
$line .= $menufile_line;
# Note that I allow whitespace after the continuation character.
# This is caught by verify_line().
if (!($menufile_line =~ m/\\\s*?$/)) {
verify_line(
$pkg, $info, $proc, $group, $type,
$menufile, $fullname, $line, $lc
);
$line='';
}
} while ($menufile_line = <$fd>);
verify_line(
$pkg, $info, $proc, $group, $type,
$menufile, $fullname, $line, $lc
);
close($fd);
}
return;
}
# -----------------------------------
# Pass this a line of a menu file, it sanitizes it and
# verifies that it is correct.
sub verify_line {
my (
$pkg, $info, $proc, $group, $type,
$menufile, $fullname, $line, $linecount
) = @_;
my %vals;
chomp $line;
# Replace all line continuation characters with whitespace.
# (do not remove them completely, because update-menus doesn't)
$line =~ s/\\\n/ /mgo;
# This is in here to fix a common mistake: whitespace after a '\'
# character.
if ($line =~ s/\\\s+\n/ /mgo) {
tag 'whitespace-after-continuation-character', "$fullname:$linecount";
}
# Ignore lines that are all whitespace or empty.
return if $line =~ m/^\s*$/o;
# Ignore lines that are comments.
return if $line =~ m/^\s*\#/o;
# Start by testing the package check.
if (not $line =~ m/^\?package\((.*?)\):/o) {
tag 'bad-test-in-menu-item', "$fullname:$linecount";
return;
}
my $pkg_test = $1;
my %tested_packages = map { $_ => 1 } split(/\s*,\s*/, $pkg_test);
my $tested_packages = scalar keys %tested_packages;
unless (exists $tested_packages{$pkg}) {
tag 'pkg-not-in-package-test', "$pkg_test $fullname";
}
$line =~ s/^\?package\(.*?\)://;
# Now collect all the tag=value pairs. I've heavily commented
# the killer regexp that's responsible.
#
# The basic idea here is we start at the beginning of the line.
# Each loop pulls off one tag=value pair and advances to the next
# when we have no more matches, there should be no text left on
# the line - if there is, it's a parse error.
while (
$line =~ m/
\s*? # allow whitespace between pairs
( # capture what follows in $1, it's our tag
[^\"\s=] # a non-quote, non-whitespace, character
* # match as many as we can
)
=
( # capture what follows in $2, it's our value
(?:
\" # this is a quoted string
(?:
\\. # any quoted character
| # or
[^\"] # a non-quote character
)
* # repeat as many times as possible
\" # end of the quoted value string
)
| # the other possibility is a non-quoted string
(?:
[^\"\s] # a non-quote, non-whitespace character
* # match as many times as we can
)
)
/ogcx
) {
my $tag = $1;
my $value = $2;
if (exists $vals{$tag}) {
tag 'duplicated-tag-in-menu-item', "$fullname $1:$linecount";
}
# If the value was quoted, remove those quotes.
if ($value =~ m/^\"(.*)\"$/) {
$value = $1;
} else {
tag 'unquoted-string-in-menu-item', "$fullname $1:$linecount";
}
# If the value has escaped characters, remove the
# escapes.
$value =~ s/\\(.)/$1/g;
$vals{$tag} = $value;
}
# This is not really a no-op. Note the use of the /c
# switch - this makes perl keep track of the current
# search position. Notice, we did it above in the loop,
# too. (I have a /g here just so the /c takes affect.)
# We use this below when we look at how far along in the
# string we matched. So the point of this line is to allow
# trailing whitespace on the end of a line.
$line =~ m/\s*/ogc;
# If that loop didn't match up to end of line, we have a
# problem..
if (pos($line) < length($line)) {
tag 'unparsable-menu-item', "$fullname:$linecount";
# Give up now, before things just blow up in our face.
return;
}
# Now validate the data in the menu file.
# Test for important tags.
foreach my $tag (@req_tags) {
unless (exists($vals{$tag}) && defined($vals{$tag})) {
tag 'menu-item-missing-required-tag', "$tag $fullname:$linecount";
# Just give up right away, if such an essential tag is missing,
# chance is high the rest doesn't make sense either. And now all
# following checks can assume those tags to be there
return;
}
}
# Make sure all tags are known.
foreach my $tag (keys %vals) {
if (!$known_tags_hash{$tag}) {
tag 'menu-item-contains-unknown-tag', "$tag $fullname:$linecount";
}
}
# Sanitize the section tag
my $section = $vals{'section'};
$section =~ tr:/:/:s; # eliminate duplicate slashes. # Hallo emacs ;;
$section =~ s:/$:: # remove trailing slash
unless $section eq '/'; # - except if $section is '/'
# Be sure the command is provided by the package.
my ($okay, $command)
= verify_cmd($fullname, $linecount, $vals{'command'},$pkg, $info);
tag 'menu-command-not-in-package', "$fullname:$linecount $command"
unless ($okay
or not $command
or ($tested_packages >= 2)
or
($section =~ m:^(WindowManagers/Modules|FVWM Modules|Window Maker):));
if (exists($vals{'icon'})) {
verify_icon($info, $proc, $group, $menufile, $fullname, $linecount,
$vals{'icon'}, 32);
}
if (exists($vals{'icon32x32'})) {
verify_icon($info, $proc, $group, $menufile, $fullname, $linecount,
$vals{'icon32x32'}, 32);
}
if (exists($vals{'icon16x16'})) {
verify_icon($info, $proc, $group, $menufile, $fullname, $linecount,
$vals{'icon16x16'}, 16);
}
# Check the needs tag.
my $needs = lc($vals{'needs'}); # needs is case insensitive.
if ($section =~ m:^(WindowManagers/Modules|FVWM Modules|Window Maker):) {
# WM/Modules: needs must not be the regular ones nor wm
if ($needs_tag_vals_hash{$needs} or $needs eq 'wm') {
tag 'non-wm-module-in-wm-modules-menu-section',
"$needs $fullname:$linecount";
}
} elsif ($section =~ m:^Window ?Managers:) {
# Other WM sections: needs must be wm
if ($needs ne 'wm') {
tag 'non-wm-in-windowmanager-menu-section',
"$needs $fullname:$linecount";
}
} else {
# Any other section: just only the general ones
if ($needs eq 'dwww') {
tag 'menu-item-needs-dwww', "$fullname:$linecount";
} elsif (not $needs_tag_vals_hash{$needs}) {
tag 'menu-item-needs-tag-has-unknown-value',
"$needs $fullname:$linecount";
}
}
# Check the section tag
# Check for historical changes in the section tree.
if ($section =~ m:^Apps/Games:) {
tag 'menu-item-uses-apps-games-section', "$fullname:$linecount";
$section =~ s:^Apps/::;
}
if ($section =~ m:^Apps/:) {
tag 'menu-item-uses-apps-section', "$fullname:$linecount";
$section =~ s:^Apps/:Applications/:;
}
if ($section =~ m:^WindowManagers:) {
tag 'menu-item-uses-windowmanagers-section', "$fullname:$linecount";
$section =~ s:^WindowManagers:Window Managers:;
}
# Check for Evil new root sections.
my ($rootsec, $sect) = split m:/:, $section, 2;
my $root_data = $MENU_SECTIONS->value($rootsec);
if (not defined $root_data) {
if (not $rootsec =~ m/$pkg/i) {
tag 'menu-item-creates-new-root-section',
"$rootsec $fullname:$linecount";
}
} else {
my $ok = 1;
if ($sect) {
# Using unknown subsection of $rootsec?
$ok = 0 if not exists $root_data->{$sect};
} else {
# Using root menu when a subsection exists?
$ok = 0 if %$root_data;
}
unless ($ok) {
tag 'menu-item-creates-new-section',
"$vals{section} $fullname:$linecount";
}
}
return;
}
sub verify_icon {
my ($info, $proc, $group, $menufile, $fullname, $linecount, $icon, $size)
= @_;
if ($icon eq 'none') {
tag 'menu-item-uses-icon-none', "$fullname:$linecount";
return;
}
tag 'menu-icon-uses-relative-path', $icon
unless $icon =~ m,^/,;
$icon =~ s|^/*||og;
if (not($icon =~ m/\.xpm$/i)) {
tag 'menu-icon-not-in-xpm-format', $icon;
return;
}
# Try the explicit location, and if that fails, try the standard path.
my $pkgroot = $info->unpacked;
my $iconfile = $info->unpacked($icon);
if (!-f $iconfile) {
$iconfile = $info->unpacked("usr/share/pixmaps/$icon");
if (!-f $iconfile) {
my $ginfo = $group->info;
foreach my $depproc (@{ $ginfo->direct_dependencies($proc) }) {
my $dinfo = $depproc->info;
$pkgroot = $dinfo->unpacked;
$iconfile = $dinfo->unpacked($icon);
last if -f $iconfile;
$iconfile = $info->unpacked("usr/share/pixmaps/$icon");
last if -f $iconfile;
}
}
}
# Last stat is a -f from above, reuse it
if (-e _) {
if (!is_ancestor_of($pkgroot, $iconfile)) {
# unsafe symlink
return;
}
} else {
tag 'menu-icon-missing', $icon;
return;
}
my $parse = 'XPM header';
my $line;
open(my $fd, '<', $iconfile);
do { defined($line = <$fd>) or goto parse_error; }
until ($line =~ /\/\*\s*XPM\s*\*\//);
$parse = 'size line';
do { defined($line = <$fd>) or goto parse_error; }
until ($line =~ /"\s*([0-9]+)\s*([0-9]+)\s*([0-9]+)\s*([0-9]+)\s*"/);
my $width = $1 + 0;
my $height = $2 + 0;
my $numcolours = $3 + 0;
my $cpp = $4 + 0;
if ($width > $size || $height > $size) {
tag 'menu-icon-too-big', "$icon: ${width}x${height} > ${size}x${size}";
}
close($fd) or die;
return;
parse_error:
close($fd) or die;
tag 'menu-icon-cannot-be-parsed', "$icon: looking for $parse";
return;
}
# Syntax-checks a .desktop file.
sub verify_desktop_file {
my ($desktopfile, $file, $pkg, $info) = @_;
my ($line, $saw_first, $warned_cr);
my %vals;
my @pending;
open(my $fd, '<', $info->unpacked($file));
while (defined($line = <$fd>)) {
chomp $line;
next if ($line =~ m/^\s*\#/ or $line =~ m/^\s*$/);
if ($line =~ s/\r//) {
tag 'desktop-entry-file-has-crs', "$file:$." unless $warned_cr;
$warned_cr = 1;
}
# Err on the side of caution for now. If the first non-comment line
# is not the required [Desktop Entry] group, ignore this file. Also
# ignore any keys in other groups.
last if ($saw_first and $line =~ /^\[(.*)\]\s*$/);
unless ($saw_first) {
return unless $line =~ /^\[(KDE )?Desktop Entry\]\s*$/;
$saw_first = 1;
tag 'desktop-contains-deprecated-header', "$file:$."
if ($line =~ /^\[KDE Desktop Entry\]\s*$/);
}
# Tag = Value. For most errors, just add the error to pending rather
# than warning on it immediately since we want to not warn on tag
# errors if we didn't know the file type.
#
# TODO: We do not check for properly formatted localised values for
# keys but might be worth checking if they are properly formatted (not
# their value)
if ($line =~ /^(.*?)\s*=\s*(.*)$/) {
my ($tag, $value) = ($1, $2);
my $basetag = $tag;
my ($encoding) = ($basetag =~ s/\[([^\]]+)\]$//);
if (exists $vals{$tag}) {
tag 'duplicated-key-in-desktop-entry', "$file:$. $tag";
} elsif ($deprecated_desktop_keys{$basetag}) {
if ($basetag eq 'Encoding') {
push(
@pending,
[
'desktop-entry-contains-encoding-key',
"$file:$. $tag"
]);
} else {
push(
@pending,
[
'desktop-entry-contains-deprecated-key',
"$file:$. $tag"
]);
}
} elsif (not $known_desktop_keys{$basetag}
and not $kde_desktop_keys{$basetag}
and not $basetag =~ /^X-/) {
push(@pending,
['desktop-entry-contains-unknown-key', "$file:$. $tag"]);
}
$vals{$tag} = $value;
}
}
close($fd);
# Now validate the data in the desktop file, but only if it's a known type.
return unless ($vals{'Type'} and $known_desktop_types{$vals{'Type'}});
# Now we can issue any pending tags.
for my $pending (@pending) {
tag @$pending;
}
# Test for important keys.
for my $tag (@req_desktop_keys) {
unless (defined $vals{$tag}) {
tag 'desktop-entry-missing-required-key', "$file $tag";
}
}
# test if missing Keywords (only if NoDisplay is not set)
if (!defined $vals{NoDisplay}) {
if (!defined $vals{Keywords}) {
tag 'desktop-entry-lacks-keywords-entry', $file;
}
}
# Only test whether the binary is in the package if the desktop file is
# directly under /usr/share/applications. Too many applications use
# desktop files for other purposes with custom paths.
#
# TODO: Should check quoting and the check special field
# codes in Exec for desktop files.
if ( $file =~ m,^usr/share/applications/,
and $vals{'Exec'}
and $vals{'Exec'} =~ /\S/) {
my ($okay, $command)
= verify_cmd($file->name, undef, $vals{'Exec'}, $pkg,$info);
tag 'desktop-command-not-in-package', $file, $command
unless $okay
or $command eq 'kcmshell';
}
# Check the Category tag.
my $in_reserved;
if (defined $vals{'Categories'}) {
my @cats = split(';', $vals{'Categories'});
my $saw_main;
for my $cat (@cats) {
next if $cat =~ /^X-/;
if ($reserved_categories{$cat}) {
tag 'desktop-entry-uses-reserved-category', "$cat $file"
unless $vals{'OnlyShowIn'};
$saw_main = 1;
$in_reserved = 1;
} elsif (not $ADD_CATEGORIES->known($cat)
and not $main_categories{$cat}) {
tag 'desktop-entry-invalid-category', "$cat $file";
} elsif ($main_categories{$cat}) {
$saw_main = 1;
}
}
unless ($saw_main) {
tag 'desktop-entry-lacks-main-category', $file;
}
}
# Check the OnlyShowIn tag. If this is not an application in a reserved
# category, warn about any desktop entry that specifies OnlyShowIn for
# more than one environment. In that case, the application probably
# should be using NotShowIn instead.
if (defined $vals{OnlyShowIn} and not $in_reserved) {
my @envs = split(';', $vals{OnlyShowIn});
if (@envs > 1) {
tag 'desktop-entry-limited-to-environments', $file;
}
}
return;
}
# Verify whether a command is shipped as part of the package. Takes the full
# path to the file being checked (for error reporting) and the binary.
# Returns a list whose first member is true if the command is present and
# false otherwise, and whose second member is the command (minus any leading
# su-to-root wrapper). Shared between the desktop and menu code.
sub verify_cmd {
my ($file, $line, $exec, $pkg, $info) = @_;
my $location = ($line ? "$file:$line" : $file);
# This routine handles su wrappers. The option parsing here is ugly and
# dead-simple, but it's hopefully good enough for what will show up in
# desktop files. su-to-root and sux require -c options, kdesu optionally
# allows one, and gksu has the command at the end of its arguments.
my @com = split(' ', $exec);
my $cmd;
if ($com[0] and $com[0] eq '/usr/sbin/su-to-root') {
tag 'su-to-root-with-usr-sbin', $location;
}
if ( $com[0]
and $com[0] =~ m,^(?:/usr/s?bin/)?(su-to-root|gksu|kdesu|sux)$,) {
my $wrapper = $1;
shift @com;
while (@com) {
unless ($com[0]) {
shift @com;
next;
}
if ($com[0] eq '-c') {
$cmd = $com[1];
last;
} elsif ($com[0] =~ /^-[Dfmupi]|^--(user|description|message)/) {
shift @com;
shift @com;
} elsif ($com[0] =~ /^-/) {
shift @com;
} else {
last;
}
}
if (!$cmd && $wrapper =~ /^(gk|kde)su$/) {
if (@com) {
$cmd = $com[0];
} else {
$cmd = $wrapper;
undef $wrapper;
}
}
tag 'su-wrapper-without--c', "$location $wrapper" unless $cmd;
if ($wrapper && $wrapper !~ /su-to-root/ && $wrapper ne $pkg) {
tag 'su-wrapper-not-su-to-root', "$location $wrapper";
}
} else {
$cmd = $com[0];
}
my $cmd_file = $cmd;
if ($cmd_file) {
$cmd_file =~ s,^/,,;
}
my $okay = $cmd
&& ( $cmd =~ /^[\'\"]/
|| $info->index($cmd_file)
|| $cmd =~ m,^(/bin/)?sh,
|| $cmd =~ m,^(/usr/bin/)?sensible-(pager|editor|browser),
|| any { $info->index($_ . $cmd) } @path);
return ($okay, $cmd_file);
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/menus.desc 0000664 0000000 0000000 00000030001 12310413144 014666 0 ustar Check-Script: menus
Author: Christian Schwarz
Abbrev: men
Type: binary
Info: Check if a binary package conforms to policy with respect to
menu and doc-base files.
Needs-Info: doc-base-files, menu-files, bin-pkg-control, index
Tag: maintainer-script-does-not-check-for-existence-of-updatemenus
Severity: important
Certainty: possible
Info: The maintainer script calls the update-menus command without
checking for existence first. (The menu package which provides the
command is not marked as "essential" package.)
.
For example, use the following code in your maintainer script:
if [ -x /usr/bin/update-menus ] ; then update-menus ; fi
Tag: maintainer-script-does-not-check-for-existence-of-installdocs
Severity: important
Certainty: possible
Info: The maintainer script calls the install-docs command without
checking for existence first. (The doc-base package which provides
the command is not marked as "essential" package.)
.
For example, use the following code in your maintainer script:
if [ -x /usr/sbin/install-docs ]; then
/usr/sbin/install-docs -i /usr/share/doc-base/<your-package>
fi
Tag: preinst-calls-updatemenus
Severity: important
Certainty: certain
Info: The preinst script calls the update-menus command. Usually,
this command should be called from the postinst maintainer script.
Tag: preinst-calls-installdocs
Severity: important
Certainty: certain
Info: The preinst script calls the install-docs command. Usually,
this command should be called from the postinst maintainer script.
Tag: prerm-calls-updatemenus
Severity: important
Certainty: certain
Info: The prerm script calls the update-menus command. Usually,
this command should be called from the postrm maintainer script.
Tag: postrm-calls-installdocs
Severity: important
Certainty: certain
Info: The postrm script calls the install-docs command. Usually,
this command should be called from the prerm maintainer script.
Tag: executable-menu-file
Severity: normal
Certainty: certain
Info: Menu files should normally not be marked as executables. You only
need to do this if your package has to generate menu entries dynamically.
Tag: menu-file-in-usr-lib
Severity: normal
Certainty: certain
Info: As of menu, version 2.1.25, /usr/lib/menu as location for menu
files is deprecated (but still works perfectly). Menu files should
now be placed in /usr/share/menu instead. Only menu files that are
actually binary executables still need to go to /usr/lib/menu.
Ref: menu 3.1
Tag: executable-in-usr-share-docbase
Severity: important
Certainty: certain
Info: Files in /usr/share/doc-base may not be marked as executables.
Tag: postinst-does-not-call-updatemenus
Severity: important
Certainty: certain
Info: Since the package installs a file in /etc/menu-methods,
/usr/share/menu, or /usr/lib/menu, the package should
probably call the update-menus command in it's postinst
script.
.
For example, use the following code in your maintainer script:
if [ -x /usr/bin/update-menus ] ; then update-menus ; fi
Ref: menu 4.2
Tag: postrm-does-not-call-updatemenus
Severity: important
Certainty: certain
Info: Since the package installs a file in /etc/menu-methods,
/usr/share/menu, or /usr/lib/menu, the package should
probably call the update-menus command in it's postrm
script.
.
For example, use the following code in your maintainer script:
if [ -x /usr/bin/update-menus ] ; then update-menus ; fi
Ref: menu 4.2
Tag: postinst-has-useless-call-to-update-menus
Severity: minor
Certainty: certain
Info: The postinst script calls the update-menus program
though no file is installed in /etc/menu-methods,
/usr/share/menu, or /usr/lib/menu.
Tag: postrm-has-useless-call-to-update-menus
Severity: minor
Certainty: certain
Info: The postrm script calls the update-menus program
though no file is installed in /etc/menu-methods,
/usr/share/menu, or /usr/lib/menu.
Tag: postinst-has-useless-call-to-install-docs
Severity: minor
Certainty: certain
Info: Explicitly calling install-docs in postinst is no
longer required since doc-base file processing is handled by triggers.
If the install-docs call was added by debhelper, rebuilding the
package with debhelper 7.2.3 or later will fix this problem.
Tag: prerm-has-useless-call-to-install-docs
Severity: minor
Certainty: certain
Info: Explicitly calling install-docs in prerm is no
longer required since doc-base file processing is handled by triggers.
If the install-docs call was added by debhelper, rebuilding the
package with debhelper 7.2.3 or later will fix this problem.
Tag: bad-menu-file-name
Severity: important
Certainty: certain
Info: The package installs a file /usr/lib/menu/menu, which is
already in use by the menu package itself. The menu file should
be named after the package that installs it.
Tag: doc-base-index-references-multiple-files
Severity: important
Certainty: certain
Info: The Index field in a doc-base file should reference the single index
file for that document. Any other files belonging to the same document
should be listed in the Files field.
Ref: doc-base 2.3.2.2
Tag: doc-base-file-references-missing-file
Severity: important
Certainty: certain
Info: One of the files referenced in an Index or Files field in this
doc-base control file does not exist in the package. The doc-base
control files should be installed by the package that provides the
documents they are registering.
Tag: doc-base-file-unknown-format
Severity: normal
Certainty: certain
Info: The Format field in this doc-base control file declares a format
that is not supported. Recognized formats are "HTML", "Text", "PDF",
"PostScript", "Info", "DVI", and "DebianDoc-SGML" (case-insensitive).
Ref: doc-base 2.3.2.2
Tag: doc-base-file-no-format
Severity: important
Certainty: certain
Info: A format section of this doc-base control file didn't specify a
format. Each section after the first must specify a format.
Ref: doc-base 2.3.2.2
Tag: doc-base-file-no-format-section
Severity: important
Certainty: certain
Info: This doc-base control file didn't specify any format
section.
Ref: doc-base 2.3.2.2
Tag: doc-base-file-no-index
Severity: important
Certainty: certain
Info: Format sections in doc-base control files for HTML or Info documents
must contain an Index field specifying the starting document for the
documentation. Even if the documentation is a single file, this field
must be present.
Ref: doc-base 2.3.2.2
Tag: doc-base-document-field-ends-in-whitespace
Severity: important
Certainty: certain
Info: The Document field in a doc-base file should not end in whitespace.
doc-base (at least as of 0.8.5) cannot cope with such fields and
debhelper 5.0.57 or earlier may create files ending in whitespace when
installing such files.
Tag: doc-base-document-field-not-in-first-line
Severity: important
Certainty: certain
Info: The Document field in doc-base control file must be located at
first line of the file. While unregistering documents, doc-base 0.8
and later parses only the first line of the control file for performance
reasons.
Ref: doc-base 2.3.2.1
Tag: doc-base-file-unknown-field
Severity: important
Certainty: certain
Info: The doc-base control file contains field which is either unknown
or not valid for the section where was found. Possible reasons for this
error are: a typo in field name, missing empty line between control file
sections, or an extra empty line separating sections.
Ref: doc-base 2.3.2.1, doc-base 2.3.2.2
Tag: doc-base-file-duplicated-field
Severity: important
Certainty: certain
Info: The doc-base control file contains a duplicated field.
Tag: doc-base-file-duplicated-format
Severity: important
Certainty: certain
Info: The doc-base control file contains a duplicated format. Doc-base
files must not register different documents in one control file.
Ref: doc-base 2.3.2.2
Tag: doc-base-file-lacks-required-field
Severity: important
Certainty: certain
Info: The doc-base control file does not contain a required field for the
appropriate section.
Ref: doc-base 2.3.2.1, doc-base 2.3.2.2
Tag: doc-base-invalid-document-field
Severity: important
Certainty: certain
Info: The Document field should consists only of letters (a-z), digits
(0-9), plus (+) or minus (-) signs, and dots (.). In particular,
uppercase letters are not allowed.
Ref: doc-base 2.2
Tag: doc-base-abstract-field-is-template
Severity: normal
Certainty: possible
Info: The Abstract field of doc-base contains a "manage online manuals"
phrase, which was copied verbatim from an example control file found in
section 2.3.1 of the Debian doc-base Manual.
Tag: doc-base-abstract-might-contain-extra-leading-whitespace
Severity: normal
Certainty: possible
Info: Continuation lines of the Abstract field of doc-base control file
should start with only one space unless they are meant to be displayed
verbatim by frontends.
Ref: doc-base 2.3.2
Tag: doc-base-abstract-field-separator-extra-whitespace
Severity: normal
Certainty: certain
Info: Unnecessary spaces were found in the paragraph separator line of the
doc-base's Abstract field. The separator line should consist of a single
space followed by a single dot.
Ref: doc-base 2.3.2
Tag: spelling-error-in-doc-base-title-field
Severity: minor
Certainty: certain
Info: Lintian found a spelling or capitalization error in the Title field
of this doc-base control file. Lintian has a list of common misspellings
that it looks for. It does not have a dictionary like a spelling checker
does.
Tag: spelling-error-in-doc-base-abstract-field
Severity: minor
Certainty: certain
Info: Lintian found a spelling or capitalization error in the Abstract
field of this doc-base control file. Lintian has a list of common
misspellings that looks for. It does not have a dictionary like a
spelling checker does.
Tag: doc-base-file-syntax-error
Severity: important
Certainty: certain
Info: Lintian found a syntax error in the doc-base control file.
Ref: doc-base 2.3.2.2
Tag: doc-base-file-separator-extra-whitespace
Severity: normal
Certainty: certain
Info: Unnecessary spaces were found in the doc-base file sections'
separator. The section separator is an empty line and should not contain
any whitespace.
Ref: doc-base 2.3.2
Tag: doc-base-file-uses-obsolete-national-encoding
Severity: important
Certainty: certain
Info: doc-base files must be valid UTF-8, an encoding of the Unicode
character set.
.
There are many ways to convert a doc-base file from an obsolete encoding
like ISO-8859-1. You may, for example, use "iconv" like:
.
$ iconv -f ISO-8859-1 -t UTF-8 doc-base > doc-base.new
$ mv doc-base.new doc-base
Ref: doc-base 2.3.2
Tag: doc-base-uses-applications-section
Severity: normal
Certainty: certain
Info: The section indicated in this doc-base control file has a top-level
section of Apps or Applications. This section is only used in menu, not
in doc-base. Simply removing the Applications/ part of the
section will lead to a valid doc-base section.
Ref: doc-base 2.3.3
Tag: doc-base-unknown-section
Severity: normal
Certainty: certain
Info: The section indicated in this doc-base control file is not one of
the standard doc-base sections. The doc-base sections are based on the
menu sections but are not exactly the same.
Ref: doc-base 2.3.3, /usr/share/doc/doc-base/doc-base.html/index.html
Tag: menu-method-should-include-menu-h
Severity: important
Certainty: certain
Info: A menu-method file must include the menu.h configuration file
(using "!include menu.h").
Ref: menu 5
Tag: possible-documentation-but-no-doc-base-registration
Severity: wishlist
Certainty: possible
Info: The package ships a .html or .pdf file under
/usr/share/doc/, which are usually documentation, but it does
not register anything in doc-base. (Files under an examples
directory are excluded.)
Ref: policy 9.10
lintian-2.5.22ubuntu1/checks/deb-format.desc 0000664 0000000 0000000 00000004064 12310413206 015570 0 ustar Check-Script: deb-format
Author: Russ Allbery
Abbrev: dfmt
Type: binary, udeb
Needs-Info: unpacked, bin-pkg-control, index
Info: This script checks the format of the deb ar archive itself.
Tag: malformed-deb-archive
Severity: serious
Certainty: certain
Info: The binary package is not a correctly constructed archive. A binary
Debian package must be an ar archive with exactly three members:
debian-binary, control.tar.gz, and one of
data.tar.gz, data.tar.bz2 or data.tar.xz
in exactly that order. The debian-binary member must start
with a single line containing the version number, with a major revision
of 2.
Ref: deb(5)
Tag: misplaced-extra-member-in-deb
Severity: important
Certainty: certain
Info: The binary package contains an extra member that Lintian did not
expect or expected at a different position.
Ref: deb(5)
Tag: lzma-deb-archive
Severity: serious
Certainty: certain
Info: The data portion of this binary package is compressed with lzma.
This is supported by dpkg but not yet permitted in the Debian archive.
Such a package will be rejected by DAK.
Tag: tar-errors-from-control
Severity: important
Certainty: possible
Info: tar produced an error while listing the contents of the
control.tar.gz member of this package. This probably means
there's something broken or at least strange about the way the package
was constructed.
Tag: tar-errors-from-data
Severity: important
Certainty: possible
Info: tar produced an error while listing the contents of the data
member of this package. This probably means there's something broken or
at least strange about the way the package was constructed.
Tag: udeb-uses-unsupported-compression-for-data-tarball
Severity: serious
Certainty: certain
Info: The data tarball of this udeb package is not compressed in format
that udpkg (debian-installer's dpkg equivalent) does not support. Thus
the udeb is likely to be uninstallable and could break daily or weekly
d-i images.
.
Currently, udpkg supports .gz and .xz compressed tarballs.
lintian-2.5.22ubuntu1/checks/changelog-file.pm 0000664 0000000 0000000 00000044040 12311317577 016127 0 ustar # changelog-file -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::changelog_file;
use strict;
use warnings;
use autodie;
use Date::Format qw(time2str);
use Encode qw(decode);
use List::Util qw(first);
use List::MoreUtils qw(any);
use Parse::DebianChangelog;
use Lintian::Check qw(check_spelling);
use Lintian::Relation::Version qw(versions_gt);
use Lintian::Tags qw(tag);
use Lintian::Util qw(file_is_encoded_in_non_utf8 strip);
sub run {
my ($pkg, undef, $info, undef, $group) = @_;
my $found_html = 0;
my $found_text = 0;
my $ppkg = quotemeta($pkg);
my ($native_pkg, $foreign_pkg, @doc_files);
# skip packages which have a /usr/share/doc/$pkg -> foo symlink
return
if $info->index("usr/share/doc/$pkg")
and $info->index("usr/share/doc/$pkg")->is_symlink;
if (my $docdir = $info->index("usr/share/doc/$pkg/")) {
for my $path ($docdir->children) {
my $basename = $path->basename;
next unless $path->is_file or $path->is_symlink;
push(@doc_files, $basename);
# Check a few things about the NEWS.Debian file.
if ($basename =~ m{\A NEWS\.Debian (?:\.gz)? \Z}ixsm) {
if ($basename !~ m{ \.gz \Z }xsm) {
tag 'debian-news-file-not-compressed', $path->name;
} elsif ($basename ne 'NEWS.Debian.gz') {
tag 'wrong-name-for-debian-news-file', $path->name;
}
}
# Check if changelog files are compressed with gzip -9.
# It's a bit of an open question here what we should do
# with a file named ChangeLog. If there's also a
# changelog file, it might be a duplicate, or the packager
# may have installed NEWS as changelog intentionally.
next
unless $basename =~ m{\A changelog (?:\.html|\.Debian)?
(?:\.gz)? \Z}xsm;
if ($basename !~ m{ \.gz \Z}xsm) {
tag 'changelog-file-not-compressed', $basename;
} else {
my $max_compressed = 0;
my $file_info = $info->file_info($path);
if ($path->is_symlink) {
my $normalized = $path->link_normalized;
if (defined($normalized)) {
$file_info = $info->file_info($normalized);
}
}
if (defined($file_info)) {
if (index($file_info, 'max compression') != -1) {
$max_compressed = 1;
}
if (not $max_compressed
and index($file_info, 'gzip compressed') != -1) {
tag 'changelog-not-compressed-with-max-compression',
$basename;
}
}
}
if ( $basename eq 'changelog.html'
or $basename eq 'changelog.html.gz') {
$found_html = 1;
} elsif ($basename eq 'changelog' or $basename eq 'changelog.gz') {
$found_text = 1;
}
}
}
# Check a NEWS.Debian file if we have one. Save the parsed version of the
# flie for later checks against the changelog file.
my $news;
my $dnews = $info->lab_data_path('NEWS.Debian');
if (-f $dnews) {
my $line = file_is_encoded_in_non_utf8($dnews);
if ($line) {
tag 'debian-news-file-uses-obsolete-national-encoding',
"at line $line";
}
my $changes = Parse::DebianChangelog->init({
infile => $dnews,
quiet => 1,
});
if (my @errors = $changes->get_parse_errors) {
for (@errors) {
tag 'syntax-error-in-debian-news-file', "line $_->[1]",
"\"$_->[2]\"";
}
}
# Some checks on the most recent entry.
if ($changes->data and defined(($changes->data)[0])) {
($news) = $changes->data;
if ($news->Distribution && $news->Distribution =~ /unreleased/i) {
tag 'debian-news-entry-has-strange-distribution',
$news->Distribution;
}
check_spelling('spelling-error-in-news-debian',
$news->Changes,undef, $group->info->spelling_exceptions);
if ($news->Changes =~ /^\s*\*\s/) {
tag 'debian-news-entry-uses-asterisk';
}
}
}
if ($found_html && !$found_text) {
tag 'html-changelog-without-text-version';
}
# is this a native Debian package?
my $version;
if (defined $info->field('version')) {
$version = $info->field('version');
} else {
# We do not know, but we assume it to be non-native
# as that is most likely.
$version = '0-1';
}
$native_pkg = $info->native;
$foreign_pkg = (!$native_pkg && $version !~ m/-0\./);
# A version of 1.2.3-0.1 could be either, so in that
# case, both vars are false
if ($native_pkg) {
# native Debian package
if (any { m/^changelog(?:\.gz)?$/} @doc_files) {
# everything is fine
} elsif (
my $chg = first {
m/^changelog\.debian(?:\.gz)$/i;
}
@doc_files
) {
tag 'wrong-name-for-changelog-of-native-package',
"usr/share/doc/$pkg/$chg";
} else {
tag 'changelog-file-missing-in-native-package';
}
} else {
# non-native (foreign :) Debian package
# 1. check for upstream changelog
my $found_upstream_text_changelog = 0;
if (any { m/^changelog(\.html)?(?:\.gz)?$/ } @doc_files) {
$found_upstream_text_changelog = 1 unless $1;
# everything is fine
} else {
# search for changelogs with wrong file name
my $found = 0;
for (@doc_files) {
if (m/^change/i and not m/debian/i) {
tag 'wrong-name-for-upstream-changelog',
"usr/share/doc/$pkg/$_";
$found = 1;
last;
}
}
if (not $found) {
tag 'no-upstream-changelog'
unless $info->is_pkg_class('transitional');
}
}
# 2. check for Debian changelog
if (any { m/^changelog\.Debian(?:\.gz)?$/ } @doc_files) {
# everything is fine
} elsif (
my $chg = first {
m/^changelog\.debian(?:\.gz)?$/i;
}
@doc_files
) {
tag 'wrong-name-for-debian-changelog-file',
"usr/share/doc/$pkg/$chg";
} else {
if ($foreign_pkg && $found_upstream_text_changelog) {
tag 'debian-changelog-file-missing-or-wrong-name';
} elsif ($foreign_pkg) {
tag 'debian-changelog-file-missing';
}
# TODO: if uncertain whether foreign or native, either
# changelog.gz or changelog.debian.gz should exists
# though... but no tests catches this (extremely rare)
# border case... Keep in mind this is only happening if we
# have a -0.x version number... So not my priority to fix
# --Jeroen
}
}
my $dchpath = $info->lab_data_path('changelog');
# Everything below involves opening and reading the changelog file, so bail
# with a warning at this point if all we have is a symlink. Ubuntu permits
# such symlinks, so their profile will suppress this tag.
if (-l $dchpath) {
tag 'debian-changelog-file-is-a-symlink';
return;
}
# Bail at this point if the changelog file doesn't exist. We will have
# already warned about this.
unless (-f $dchpath) {
return;
}
# check that changelog is UTF-8 encoded
my $line = file_is_encoded_in_non_utf8($dchpath);
if ($line) {
tag 'debian-changelog-file-uses-obsolete-national-encoding',
"at line $line";
}
my $changelog = $info->changelog;
if (my @errors = $changelog->get_parse_errors) {
foreach (@errors) {
tag 'syntax-error-in-debian-changelog', "line $_->[1]",
"\"$_->[2]\"";
}
}
# Check for some things in the raw changelog file and compute the
# "offset" to the first line of the first entry. We use this to
# report the line number of "too-long" lines. (#657402)
my $chloff = check_dch($dchpath);
my @entries = $changelog->data;
if (@entries) {
my %versions;
my $first_timestamp = $entries[0]->Timestamp;
for my $entry (@entries) {
if ($entry->Maintainer) {
if ($entry->Maintainer =~ /<([^>\@]+\@[^>.]*)>/) {
tag 'debian-changelog-file-contains-invalid-email-address',
$1;
}
}
$versions{$entry->Version} = 1 if defined $entry->Version;
}
if ($first_timestamp) {
my $dch_date = $entries[0]->Date;
my ($weekday_declared, $date) = split(m/,\s*/, $dch_date, 2);
my ($tz, $weekday_actual);
if ($date =~ m/[ ]+ ([^ ]+)\Z/xsm) {
$tz = $1;
$weekday_actual = time2str('%a', $first_timestamp, $tz);
}
if ($tz and $weekday_declared ne $weekday_actual) {
my $real_weekday = time2str('%A', $first_timestamp, $tz);
my $short_date = time2str('%Y-%m-%d', $first_timestamp, $tz);
tag 'debian-changelog-has-wrong-weekday',
"$short_date is a $real_weekday";
}
}
if (@entries > 1) {
my $second_timestamp = $entries[1]->Timestamp;
if ($first_timestamp && $second_timestamp) {
tag 'latest-debian-changelog-entry-without-new-date'
unless (($first_timestamp - $second_timestamp) > 0
or lc($entries[0]->Distribution) eq 'unreleased');
}
my $first_version = $entries[0]->Version;
my $second_version = $entries[1]->Version;
if ($first_version and $second_version) {
tag 'latest-debian-changelog-entry-without-new-version'
unless versions_gt($first_version, $second_version)
or $entries[0]->Changes =~ /backport/i;
tag 'latest-debian-changelog-entry-changed-to-native'
if $native_pkg and $second_version =~ m/-/;
}
my $first_upstream = $first_version;
$first_upstream =~ s/-[^-]+$//;
my $second_upstream = $second_version;
$second_upstream =~ s/-[^-]+$//;
if ( $first_upstream eq $second_upstream
and $entries[0]->Changes
=~ /^\s*\*\s+new\s+upstream\s+(?:\S+\s+)?release\b/im) {
tag 'possible-new-upstream-release-without-new-version';
}
my $first_dist = lc $entries[0]->Distribution;
my $second_dist = lc $entries[1]->Distribution;
if ($first_dist eq 'unstable' and $second_dist eq 'experimental') {
unless ($entries[0]->Changes =~ /\bto\s+unstable\b/) {
tag 'experimental-to-unstable-without-comment';
}
}
}
# Some checks should only be done against the most recent
# changelog entry.
my $entry = $entries[0];
my $changes = $entry->Changes || '';
if (@entries == 1) {
if ($entry->Version and $entry->Version =~ /-1$/) {
tag 'new-package-should-close-itp-bug'
unless @{ $entry->Closes };
}
if ($changes=~ /(?:#?\s*)(?:\d|n)+ is the bug number of your ITP/i)
{
tag 'changelog-is-dh_make-template';
}
}
while ($changes =~ /(closes\s*(?:bug)?\#?\s?\d{6,})[^\w]/ig) {
tag 'possible-missing-colon-in-closes', $1 if $1;
}
# check for bad intented distribution
if (
$changes =~ /uploads? \s+ to \s+
(?'intended'testing|unstable|experimental|sid)/xi
){
my $intended = $+{intended};
if($intended eq 'sid') {
$intended = 'unstable';
}
my $uploaded = $entry->Distribution;
unless($uploaded eq $intended) {
tag 'bad-intended-distibution',
"intended to $intended but uploaded to $uploaded";
}
}
my $closes = $entry->Closes;
for my $bug (@$closes) {
tag 'improbable-bug-number-in-closes', $bug if ($bug < 100);
}
# unstable, testing, and stable shouldn't be used in Debian
# version numbers. unstable should get a normal version
# increment and testing and stable should get suite-specific
# versions.
#
# NMUs get a free pass because they need to work with the
# version number that was already there.
my $changelog_version;
if ($info->native) {
$changelog_version = $entry->Version || '';
} else {
if ($entry->Version) {
($changelog_version) = (split('-', $entry->Version))[-1];
} else {
$changelog_version = '';
}
}
unless (not $info->native and $changelog_version =~ /\./) {
if ( $info->native
and $changelog_version =~ /testing|(?:un)?stable/i) {
tag 'version-refers-to-distribution', $entry->Version;
} elsif ($changelog_version =~ /woody|sarge|etch|lenny|squeeze/) {
my %unreleased_dists
= map { $_ => 1 } qw(unstable experimental);
if (exists($unreleased_dists{$entry->Distribution})) {
tag 'version-refers-to-distribution', $entry->Version;
}
}
}
# Compare against NEWS.Debian if available.
if ($news and $news->Version) {
if ($entry->Version eq $news->Version) {
for my $field (qw/Distribution Urgency/) {
if ($entry->$field ne $news->$field) {
tag 'changelog-news-debian-mismatch', lc($field),
$entry->$field . ' != ' . $news->$field;
}
}
}
unless ($versions{$news->Version}) {
tag 'debian-news-entry-has-unknown-version', $news->Version;
}
}
# We have to decode into UTF-8 to get the right length for the
# length check. For some reason, use open ':utf8' isn't
# sufficient. If the changelog uses a non-UTF-8 encoding,
# this will mangle it, but it doesn't matter for the length
# check.
#
# Parse::DebianChangelog adds an additional space to the
# beginning of each line, so we have to adjust for that in the
# length check.
my @lines = split("\n", decode('utf-8', $changes));
for my $i (0 .. $#lines) {
if (length($lines[$i]) > 81
and $lines[$i] !~ /^[\s.o*+-]*(?:[Ss]ee:?\s+)?\S+$/) {
tag 'debian-changelog-line-too-long', 'line ' . ($i + $chloff);
}
}
# Strip out all lines that contain the word spelling to avoid false
# positives on changelog entries for spelling fixes.
$changes =~ s/^.*spelling.*\n//gm;
check_spelling('spelling-error-in-changelog', $changes, undef,
$group->info->spelling_exceptions);
}
return;
}
# read the changelog itself and check for some issues we cannot find
# with Parse::DebianChangelog. Also return the "real" line number for
# the first line of text in the first entry.
#
sub check_dch {
my ($path) = @_;
# emacs only looks at the last "local variables" in a file, and only at
# one within 3000 chars of EOF and on the last page (^L), but that's a bit
# pesky to replicate. Demanding a match of $prefix and $suffix ought to
# be enough to avoid false positives.
my ($prefix, $suffix);
my $lineno = 0;
my ($estart, $tstart) = (0, 0);
open(my $fd, '<', $path);
while (<$fd>) {
unless ($tstart) {
$lineno++;
$estart = 1 if m/^\S/;
$tstart = 1 if m/^\s+\S/;
}
if (
m/closes:\s*(((?:bug)?\#?\s?\d*)[[:alpha:]]\w*)/io
|| m/closes:\s*(?:bug)?\#?\s?\d+
(?:,\s*(?:bug)?\#?\s?\d+)*
(?:,\s*(((?:bug)?\#?\s?\d*)[[:alpha:]]\w*))/iox
) {
tag 'wrong-bug-number-in-closes', "l$.:$1" if $2;
}
if (/^(.*)Local\ variables:(.*)$/i) {
$prefix = $1;
$suffix = $2;
}
# emacs allows whitespace between prefix and variable, hence \s*
if ( defined $prefix
&& defined $suffix
&& m/^\Q$prefix\E\s*add-log-mailing-address:.*\Q$suffix\E$/) {
tag 'debian-changelog-file-contains-obsolete-user-emacs-settings';
}
}
close($fd);
return $lineno;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/filename-length.desc 0000664 0000000 0000000 00000002210 12153060143 016601 0 ustar Check-Script: filename-length
Author: Niels Thykier
Abbrev: flen
Type: source, binary, udeb
Info: This script checks for long package file names
Tag: package-has-long-file-name
Severity: normal
Certainty: certain
Info: The package has a very long filename. This may complicate
shipping the package on some media that put restrictions on the
length of the filenames (such as CDs).
.
For architecture dependent packages, the tag is emitted based on the
length of the longest architecture name rather than the name of the
current architecture.
.
This length will be written in brackets after the actual length.
Ref: http://lists.debian.org/debian-devel/2011/03/msg00943.html
Tag: source-package-component-has-long-file-name
Severity: normal
Certainty: certain
Info: The source package has a component with a very long filename.
This may complicate shipping the package on some media that put
restrictions on the length of the filenames (such as CDs).
.
Lintian only checks emits this tag once per source package based
on the component with the longest filename.
Ref: http://lists.debian.org/debian-devel/2011/03/msg00943.html
lintian-2.5.22ubuntu1/checks/deb-format.pm 0000664 0000000 0000000 00000017613 12311317602 015276 0 ustar # deb-format -- lintian check script -*- perl -*-
# Copyright (C) 2009 Russ Allbery
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# this program. If not, see .
package Lintian::deb_format;
use strict;
use warnings;
use autodie;
use List::MoreUtils qw(first_index none);
use Lintian::Command qw(spawn);
use Lintian::Data;
use Lintian::Tags qw(tag);
# The files that contain error messages from tar, which we'll check and issue
# tags for if they contain something unexpected, and their corresponding tags.
# - These files are created by bin-pkg-control, index and unpacked respectively
our %ERRORS = (
'control-errors' => 'tar-errors-from-control',
'control-index-errors' => 'tar-errors-from-control',
'index-errors' => 'tar-errors-from-data',
'unpacked-errors' => 'tar-errors-from-data'
);
my $EXTRA_MEMBERS = Lintian::Data->new('deb-format/extra-members');
sub run {
my (undef, $type, $info) = @_;
my $deb = $info->lab_data_path('deb');
# Run ar t on the *.deb file. deb will be a symlink to it.
my $okay = 0;
my $opts = {};
my $success = spawn($opts, ['ar', 't', $deb]);
if ($success) {
my @members = split("\n", ${ $opts->{out} });
my $count = scalar(@members);
my ($ctrl_member, $data_member);
if ($count < 3) {
tag 'malformed-deb-archive',
"found only $count members instead of 3";
} elsif ($members[0] ne 'debian-binary') {
tag 'malformed-deb-archive',
"first member $members[0] not debian-binary";
} elsif (
$count == 3 and none {
substr($_, 0, 1) eq '_';
}
@members
) {
# Fairly common case - if there are only 3 members without
# "_", we can trivially determine their (expected)
# positions. We only use this case when there are no
# "extra" members, because they can trigger more tags
# (see below)
(undef, $ctrl_member, $data_member) = @members;
} else {
my $ctrl_index
= first_index { substr($_, 0, 1) ne '_' } @members[1..$#members];
my $data_index;
if ($ctrl_index != -1) {
# Since we searched only a sublist of @members, we have to
# add 1 to $ctrl_index
$ctrl_index++;
$ctrl_member = $members[$ctrl_index];
$data_index = first_index { substr($_, 0, 1) ne '_' }
@members[$ctrl_index..$#members];
if ($data_index != -1) {
# Since we searched only a sublist of @members, we
# have to adjust $data_index
$data_index += $ctrl_index + 1;
$data_member = $members[$data_index];
}
}
# Extra members
for my $i (1..$#members) {
my $member = $members[$i];
my $actual_index = $i;
my ($expected, $text);
next if $i == $ctrl_index or $i == $data_index;
$expected = $EXTRA_MEMBERS->value($member);
if (defined($expected)) {
next if $expected eq 'ANYWHERE';
next if $expected == $actual_index;
$text = "expected at position $expected, but appeared";
} else {
$text = 'unexpected member';
}
tag 'misplaced-extra-member-in-deb',
"$member ($text at position $actual_index)";
}
}
if (not defined($ctrl_member)) {
# Somehow I doubt we will ever get this far without a control
# file... :)
tag 'malformed-deb-archive', 'Missing control.tar.gz member';
} elsif ($ctrl_member ne 'control.tar.gz') {
tag 'malformed-deb-archive',
"second (official) member $ctrl_member not control.tar.gz";
} elsif (not defined($data_member)) {
# Somehow I doubt we will ever get this far without a data
# member (i.e. I suspect unpacked and index will fail), but
# mah
tag 'malformed-deb-archive', 'Missing data.tar member';
} else {
# Probably okay
$okay = 1;
if (
$data_member !~ m/\A
# NB: We deliberately do not allow "data.tar",
# since various tools seems to be unable to cope
# with them. (see #718331)
data\.tar\.(?:gz|bz2|xz|lzma) \Z/xsm
) {
# wasn't okay after all
$okay = 0;
} elsif ($type eq 'udeb'
&& $data_member !~ m/^data\.tar\.[gx]z$/) {
tag 'udeb-uses-unsupported-compression-for-data-tarball';
} elsif ($data_member eq 'data.tar.lzma') {
# Ubuntu's archive allows lzma packages.
tag 'lzma-deb-archive';
}
if (not $okay) {
tag 'malformed-deb-archive',
join(' ',
"third (official) member $data_member",
'not data.tar.(gz|bz2|xz)');
}
}
} else {
# unpack will probably fail so we'll never get here, but may as well be
# complete just in case.
my $error = ${ $opts->{err} };
$error =~ s/\n.*//s;
$error =~ s/^ar:\s*//;
$error =~ s/^deb:\s*//;
tag 'malformed-deb-archive', "ar error: $error";
}
# Check the debian-binary version number. We probably won't get
# here because dpkg-deb will decline to unpack the deb, but be
# thorough just in case. We may eventually have a case where dpkg
# supports a newer format but it's not permitted in the archive
# yet.
if ($okay) {
$opts = {};
$success = spawn($opts, ['ar', 'p', $deb, 'debian-binary']);
if (not $success) {
tag 'malformed-deb-archive', 'cannot read debian-binary member';
} elsif (${ $opts->{out} } !~ /^2\.\d+\n/) {
my ($version) = split("\n", ${ $opts->{out} });
tag 'malformed-deb-archive', "version $version not 2.0";
}
}
# If either control-errors or index-errors exist, tar produced
# error output when processing the package. We want to report
# those as tags unless they're just tar noise that doesn't
# represent an actual problem.
for my $file (keys %ERRORS) {
my $tag = $ERRORS{$file};
my $path = $info->lab_data_path($file);
if (-s $path) {
open(my $fd, '<', $path);
while (my $line = <$fd>) {
chomp($line);
$line =~ s,^(?:[/\w]+/)?tar: ,,;
# Record size errors are harmless. Ignore implausibly
# old timestamps in the data section since we already
# check for that elsewhere, but still warn for
# control.
next if $line =~ /^Record size =/;
if ($tag eq 'tar-errors-from-data') {
next if $line =~ /implausibly old time stamp/;
}
tag $tag, $line;
}
close($fd);
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/huge-usr-share.desc 0000664 0000000 0000000 00000001516 12153060143 016411 0 ustar Check-Script: huge-usr-share
Author: Jeroen van Wolffelaar
Abbrev: hus
Type: binary
Needs-info: index
Info: This script checks whether an architecture-dependent package has
large amounts of data in /usr/share.
Tag: arch-dep-package-has-big-usr-share
Severity: wishlist
Certainty: certain
Info: The package has a significant amount of architecture-independent
data (over 4MB, or over 2MB and more than 50% of the package) in
/usr/share but is an architecture-dependent package. This is
wasteful of mirror space and bandwidth since it means distributing
multiple copies of this data, one for each architecture.
.
If the data in /usr/share is not architecture-independent, this
is a Policy violation that should be fixed by moving the data elsewhere
(usually /usr/lib).
Ref: devref 6.7.5
lintian-2.5.22ubuntu1/checks/ocaml.pm 0000664 0000000 0000000 00000014231 12311317615 014346 0 ustar # ocaml -- lintian check script -*- perl -*-
#
# Copyright © 2009 Stéphane Glondu
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::ocaml;
use strict;
use warnings;
use autodie;
use File::Basename;
use Lintian::Relation ();
use Lintian::Tags qw(tag);
# The maximum number of *.cmi files to show individually.
our $MAX_CMI = 3;
sub run {
my ($pkg, undef, $info) = @_;
# Collect information about .a files from ar-info dump
my %provided_o;
open(my $fd, '<', $info->lab_data_path('ar-info'));
while (my $line = <$fd>) {
chomp($line);
if ($line =~ /^(?:\.\/)?([^:]+): (.*)$/) {
my ($filename, $contents) = ($1, $2);
my $dirname = dirname($filename);
for my $entry (split m/ /o, $contents) {
# Note: a .o may be legitimately in several different .a
$provided_o{"$dirname/$entry"} = $filename;
}
}
}
close($fd);
# is it a library package?
my $is_lib_package = 0;
if ($pkg =~ /^lib/) {
$is_lib_package = 1;
}
# is it a development package?
my $is_dev_package = 0;
if (
$pkg =~ m/
(?: -dev
|\A camlp[45](?:-extra)?
|\A ocaml (?:
-nox
|-interp
|-compiler-libs
)?
)\Z/xsm
){
$is_dev_package = 1;
}
# for libraries outside /usr/lib/ocaml
my $outside_number = 0;
my $outside_prefix;
# dangling .cmi files (we show only $MAX_CMI of them)
my $cmi_number = 0;
# dev files in nondev package
my $dev_number = 0;
my $dev_prefix;
# does the package provide a META file?
my $has_meta = 0;
foreach my $file ($info->sorted_index) {
my $fileinfo = $info->file_info($file);
# For each .cmxa file, there must be a matching .a file (#528367)
$_ = $file;
if (s/\.cmxa$/.a/ && !$info->file_info($_)) {
tag 'ocaml-dangling-cmxa', $file;
}
# For each .cmxs file, there must be a matching .cma or .cmo file
# (at least, in library packages)
if ($is_lib_package) {
$_ = $file;
if ( s/\.cmxs$/.cm/
&& !$info->file_info("${_}a")
&& !$info->file_info("${_}o")) {
tag 'ocaml-dangling-cmxs', $file;
}
}
# The .cmx counterpart: for each .cmx file, there must be a
# matching .o file, which can be there by itself, or embedded in a
# .a file in the same directory
$_ = $file;
if ( s/\.cmx$/.o/
&& !$info->file_info($_)
&& !(exists $provided_o{$_})) {
tag 'ocaml-dangling-cmx', $file;
}
# $somename.cmi should be shipped with $somename.mli or $somename.ml
$_ = $file;
if ( $is_dev_package
&& s/\.cmi$/.ml/
&& !$info->file_info("${_}i")
&& !$info->file_info($_)) {
$cmi_number++;
if ($cmi_number <= $MAX_CMI) {
tag 'ocaml-dangling-cmi', $file;
}
}
# non-dev packages should not ship .cmi, .cmx or .cmxa files
if ($file =~ m/\.cm(i|xa?)$/) {
$dev_number++;
if (defined $dev_prefix) {
chop $dev_prefix while ($file !~ m@^$dev_prefix@);
} else {
$dev_prefix = $file;
}
}
# $somename.cmo should usually not be shipped with $somename.cma
$_ = $file;
if (s/\.cma$/.cmo/ && $info->file_info($_)) {
tag 'ocaml-stray-cmo', $file;
}
# development files outside /usr/lib/ocaml (.cmi, .cmx, .cmxa)
# .cma, .cmo and .cmxs are excluded because they can be plugins
if ($file =~ m/\.cm(i|xa?)$/ && $file !~ m@^usr/lib/ocaml/@) {
$outside_number++;
if (defined $outside_prefix) {
chop $outside_prefix while ($file !~ m@^$outside_prefix@);
} else {
$outside_prefix = $file;
}
}
# If there is a META file, ocaml-findlib should be at least suggested.
$has_meta = 1 if $file =~ m@^usr/lib/ocaml/(.+/)?META(\..*)?$@;
}
if ($is_dev_package) {
# summary about .cmi files
if ($cmi_number > $MAX_CMI) {
my $plural = ($cmi_number - $MAX_CMI == 1) ? '' : 's';
tag 'ocaml-dangling-cmi', ($cmi_number - $MAX_CMI),
"more file$plural not shown";
}
# summary about /usr/lib/ocaml
if ($outside_number) {
$outside_prefix = dirname($outside_prefix);
my $plural = ($outside_number == 1) ? '' : 's';
tag 'ocaml-dev-file-not-in-usr-lib-ocaml',
"$outside_number file$plural in $outside_prefix";
}
if ($has_meta) {
my $depends = $info->relation('all');
tag 'ocaml-meta-without-suggesting-findlib'
unless $depends->implies('ocaml-findlib');
}
} else {
# summary about dev files
if ($dev_number > 0) {
$dev_prefix = dirname($dev_prefix);
my $plural = ($dev_number == 1) ? '' : 's';
tag 'ocaml-dev-file-in-nondev-package',
"$dev_number file$plural in $dev_prefix";
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/symlinks.desc 0000664 0000000 0000000 00000001570 12310413144 015421 0 ustar Check-Script: symlinks
Author: Niels Thykier
Abbrev: sym
Type: binary, udeb
Needs-Info: index
Info: This script checks for broken symlinks.
Tag: package-contains-broken-symlink
Severity: normal
Certainty: wild-guess
Experimental: yes
Info: The package contains a symlink but the destination
for the link does not exist in the package nor in its
direct dependencies.
Tag: package-contains-broken-symlink-wildcard
Severity: normal
Certainty: possible
Info: The package contains a symlink with a target that
appears to be a "failed" wildcard expansion. Furthermore
the target does not exists in the package or any of its
direct dependencies (built from the same source).
Tag: package-contains-unsafe-symlink
Severity: serious
Certainty: certain
Info: The package contains an unsafe symlink. If followed,
the link will escape the package root.
Ref: policy 10.5
lintian-2.5.22ubuntu1/checks/conffiles.pm 0000664 0000000 0000000 00000006353 12311317577 015240 0 ustar # conffiles -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz
# Copyright (C) 2000 Sean 'Shaleh' Perry
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::conffiles;
use strict;
use warnings;
use autodie;
use Lintian::Tags qw(tag);
use Lintian::Util qw(rstrip);
sub run {
my (undef, undef, $info) = @_;
my $cf = $info->control('conffiles');
my %conffiles = ();
# Stop if conffiles is a link; no real package uses links in
# control.tar.gz.
return if -l $cf;
if (-f $cf) {
open(my $fd, '<', $cf);
while (my $filename = <$fd>) {
# dpkg strips whitespace (using isspace) from the right hand
# side of the file name.
rstrip($filename);
next if $filename eq q{};
if ($filename !~ m{^ / }xsm) {
tag 'relative-conffile', $filename;
} else {
# strip the leading slash from here.
$filename =~ s{^ /++ }{}xsm;
}
$conffiles{$filename}++;
if ($conffiles{$filename} > 1) {
tag 'duplicate-conffile', $filename;
next;
}
if (not defined($info->index($filename))) {
tag 'conffile-is-not-in-package', $filename;
}
if ($filename =~ m{^ usr/ }xsm) {
tag 'file-in-usr-marked-as-conffile', $filename;
} else {
if ($filename !~ m{^ etc/ }xsm) {
tag 'non-etc-file-marked-as-conffile', $filename;
} elsif ($filename =~ m{^ etc/rc.\.d/ }xsm) {
tag 'file-in-etc-rc.d-marked-as-conffile', $filename;
}
}
}
close($fd);
}
# Read package contents...
foreach my $file ($info->sorted_index) {
if (not $file->is_file and exists $conffiles{$file}) {
tag 'conffile-has-bad-file-type', $file;
}
next unless $file =~ m{\A etc/ }xsm and $file->is_file;
# If there is a /etc/foo, it must be a conffile (with a few exceptions).
if ( not exists($conffiles{$file})
and $file !~ m{ /README $}xsm
and $file ne 'etc/init.d/skeleton'
and $file ne 'etc/init.d/rc'
and $file ne 'etc/init.d/rcS') {
tag 'file-in-etc-not-marked-as-conffile', $file;
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/scripts.desc 0000664 0000000 0000000 00000070067 12310413206 015245 0 ustar Check-Script: scripts
Author: Richard Braakman
Abbrev: scr
Type: binary
Info: This script checks the #! lines of scripts in a package.
Needs-Info: unpacked, file-info, scripts, bin-pkg-control, index
Tag: script-without-interpreter
Severity: important
Certainty: certain
Info: This file starts with the #! sequence that identifies scripts, but
it does not name an interpreter.
Tag: example-script-without-interpreter
Severity: wishlist
Certainty: certain
Info: This example file starts with the #! sequence that identifies
scripts, but it does not name an interpreter.
Tag: executable-not-elf-or-script
Severity: normal
Certainty: certain
Info: This executable file is not an ELF format binary, and does not start
with the #! sequence that marks interpreted scripts. It might be a sh
script that fails to name /bin/sh as its shell, or it may be incorrectly
marked as executable. Sometimes upstream files developed on Windows are
marked unnecessarily as executable on other systems.
.
If you are using debhelper to build your package, running dh_fixperms will
often correct this problem for you.
Ref: policy 10.4
Tag: script-not-executable
Severity: normal
Certainty: certain
Info: This file starts with the #! sequence that marks interpreted scripts,
but it is not executable.
Tag: interpreter-not-absolute
Severity: normal
Certainty: certain
Info: This script uses a relative path to locate its interpreter.
This path will be taken relative to the caller's current directory, not
the script's, so it is not likely to be what was intended.
Tag: example-interpreter-not-absolute
Severity: wishlist
Certainty: certain
Info: This example script uses a relative path to locate its interpreter.
This path will be taken relative to the caller's current directory, not
the script's, so a user will probably not be able to run the example
without modification. This tag can also be caused by script headers like
#!@BASH@, which usually mean that the examples were copied out
of the source tree before proper Autoconf path substitution.
Tag: unusual-interpreter
Severity: normal
Certainty: possible
Info: This package contains a script for an interpreter that is not shipped
in the package and is not known to Lintian. It is possible that there is
a typo or the interpreter is not executable. If not, please file a
wishlist bug against lintian, so it can be added to the list of known
interpreters.
Tag: example-unusual-interpreter
Severity: pedantic
Certainty: possible
Info: This package contains an example script for an interpreter that
is not shipped in the package and is not known to Lintian. It is
possible that there is a typo or the interpreter is not executable.
If not, please file a wishlist bug against lintian, so it can be
added to the list of known interpreters.
Tag: script-uses-bin-env
Severity: normal
Certainty: certain
Info: This script uses /bin/env as its interpreter (used to find the
actual interpreter on the user's path). There is no /bin/env on Debian
systems; env is instead installed as /usr/bin/env. Usually, the path to
env in the script should be changed.
Tag: example-script-uses-bin-env
Severity: wishlist
Certainty: certain
Info: This example script uses /bin/env as its interpreter (used to find
the actual interpreter on the user's path). There is no /bin/env on
Debian systems; env is instead installed as /usr/bin/env. Usually, the
path to env in the script should be changed.
Tag: forbidden-config-interpreter
Severity: important
Certainty: certain
Info: This package contains a config script for pre-configuring
the package. During pre-configuration, however, only essential packages
are guaranteed to be installed, so you cannot use a non-essential
interpreter.
Tag: forbidden-postrm-interpreter
Severity: serious
Certainty: certain
Info: This package contains a postrm maintainer script that uses
an interpreter that isn't essential. The purge action of
postrm can only rely on essential packages, which means the
interpreter used by postrm must be one of the essential ones
(sh, bash, or perl).
Ref: policy 7.2
Tag: unusual-control-interpreter
Severity: minor
Certainty: certain
Info: This package contains a control script for an interpreter that is
not normally used for control scripts. This is permissible but not
recommended. It makes it harder for other developers to understand your
package.
Tag: unknown-control-interpreter
Severity: important
Certainty: possible
Info: This package contains a maintainer script that uses an interpreter
that the Lintian maintainers have not heard of. This is usually a typo
for a common interpreter. If not, please file a wishlist bug on lintian
so that the Lintian maintainers can add this interpreter to their list.
Tag: interpreter-in-usr-local
Severity: important
Certainty: certain
Info: This package contains a script that looks for an interpreter in a
directory in /usr/local. Since Debian does not install anything in
/usr/local, this is the wrong place to look.
Tag: example-interpreter-in-usr-local
Severity: pedantic
Certainty: certain
Info: This package contains an example script that looks for an
interpreter in a directory in /usr/local. Since Debian does not install
anything in /usr/local, the example script would probably need
modifications before a user could run it.
Tag: control-interpreter-in-usr-local
Severity: serious
Certainty: certain
Info: A control script for this package references an interpreter in a
directory in /usr/local. Control scripts must use interpreters
provided by Debian packages, and Debian packages do not install anything
in /usr/local.
Tag: preinst-interpreter-without-predepends
Severity: serious
Certainty: certain
Info: The package contains a preinst maintainer script that uses
an unusual and non-essential interpreter but does not declare a
pre-dependency on the package that provides this interpreter.
.
preinst scripts should be written using only essential
interpreters to avoid additional dependency complexity. Please do not
add a pre-dependency without following the policy for doing so (Policy
section 3.5).
Ref: policy 7.2
Tag: control-interpreter-without-depends
Severity: serious
Certainty: possible
Info: The package contains a maintainer script that uses an unusual and
non-essential interpreter but does not declare a dependency on the
package that provides this interpreter.
Ref: policy 7.2
Tag: missing-dep-for-interpreter
Severity: important
Certainty: possible
Info: You used an interpreter for a script that is not in an essential
package. In most cases, you will need to add a Dependency on the
package that contains the interpreter. If the dependency is already
present, please file a bug against Lintian with the details of your
package so that its database can be updated.
.
In some cases a weaker relationship, such as Suggests or Recommends, will
be more appropriate.
Tag: csh-considered-harmful
Severity: normal
Certainty: certain
Info: The Debian policy for scripts explicitly warns against using csh
and tcsh as scripting languages.
Ref: policy 10.4
Tag: wrong-path-for-interpreter
Severity: important
Certainty: certain
Info: The interpreter you used is installed at another location on Debian
systems.
Tag: example-wrong-path-for-interpreter
Severity: wishlist
Certainty: certain
Info: The interpreter used by this example script is installed at another
location on Debian systems. Normally the path should be updated to match
the Debian location.
Tag: gawk-script-but-no-gawk-dep
Severity: important
Certainty: certain
Info: Packages that use gawk scripts must depend on the gawk package.
If they don't need gawk-specific features, and can just as easily work
with mawk, then they should be awk scripts instead.
.
In some cases a weaker relationship, such as Suggests or Recommends, will
be more appropriate.
Tag: mawk-script-but-no-mawk-dep
Severity: important
Certainty: certain
Info: Packages that use mawk scripts must depend on the mawk package.
If they don't need mawk-specific features, and can just as easily work
with gawk, then they should be awk scripts instead.
.
In some cases a weaker relationship, such as Suggests or Recommends, will
be more appropriate.
Tag: php-script-but-no-phpX-cli-dep
Severity: important
Certainty: certain
Info: Packages with PHP scripts must depend on a phpX-cli package such as
php5-cli. Note that a dependency on a php-cgi package (such as php5-cgi)
is needlessly strict and forces the user to install a package that isn't
needed.
.
In some cases a weaker relationship, such as Suggests or Recommends, will
be more appropriate.
.
Lintian can only recognize phpX-cli dependencies for values of X that it
knows are available in the archive. You will get this warning if you
allow, as alternatives, versions of PHP that are so old they're not
available in stable. The correct fix in those cases is probably to drop
the old alternative. If this package depends on a newer php-cli package
that Lintian doesn't know about, please file a bug against Lintian so
that it can be updated.
Tag: python-script-but-no-python-dep
Severity: important
Certainty: certain
Info: Packages with Python scripts should depend on the package
python. Those with scripts that specify a specific version of
Python must depend on that version of Python (exactly).
.
For example, if a script in the package uses #!/usr/bin/python,
the package needs a dependency on python. If a script uses
#!/usr/bin/python2.6, the package needs a dependency on
python2.6. A dependency on python (>= 2.6) is not
correct, since later versions of Python may not provide the
/usr/bin/python2.6 binary.
.
If you are using debhelper, adding ${python:Depends} to the
Depends field and ensuring dh_pysupport or dh_pycentral are run during
the build should take care of adding the correct dependency.
.
In some cases a weaker relationship, such as Suggests or Recommends, will
be more appropriate.
Tag: ruby-script-but-no-ruby-dep
Severity: important
Certainty: certain
Info: Packages with Ruby scripts must depend on a valid Ruby interpreter.
Those that have Ruby scripts that run under a specific version of Ruby need a
dependency on the equivalent version of Ruby.
.
If a script in the package uses #!/usr/bin/ruby, the package needs a
dependency on "ruby | ruby-interpreter". This allows users to choose which
interpreter to use by default. If the package is intended to be used with a
specific Ruby version, its scripts should use that version directly, such
as #!/usr/bin/ruby1.8
.
If a script uses #!/usr/bin/ruby1.9, then the package needs a
dependency on "ruby1.9".
.
In some cases a weaker relationship, such as Suggests or Recommends, will
be more appropriate.
Tag: wish-script-but-no-wish-dep
Severity: important
Certainty: certain
Info: Packages that include wish scripts must depend on the virtual
package wish or, if they require a specific version of wish or tk, that
version of tk.
.
In some cases a weaker relationship, such as Suggests or Recommends, will
be more appropriate.
Tag: tclsh-script-but-no-tclsh-dep
Severity: important
Certainty: certain
Info: Packages that include tclsh scripts must depend on the virtual
package tclsh or, if they require a specific version of tcl, that
version of tcl.
.
In some cases a weaker relationship, such as Suggests or Recommends, will
be more appropriate.
Tag: shell-script-fails-syntax-check
Severity: important
Certainty: possible
Info: Running this shell script with the shell's -n option set fails,
which means that the script has syntax errors. The most common cause of
this problem is a script expecting /bin/sh to be bash checked on
a system using dash as /bin/sh.
.
Run e.g. sh -n yourscript to see the errors yourself.
.
Note this can have false-positives, for an example with bash scripts
using "extglob".
Tag: example-shell-script-fails-syntax-check
Severity: pedantic
Certainty: possible
Info: Running this shell script with the shell's -n option set fails,
which means that the script has syntax errors. The most common cause of
this problem is a script expecting /bin/sh to be bash checked on
a system using dash as /bin/sh.
.
Run e.g. sh -n yourscript to see the errors yourself.
.
Note this can have false-positives, for an example with bash scripts
using "extglob".
Tag: maintainer-shell-script-fails-syntax-check
Severity: serious
Certainty: certain
Info: Running this shell script with the shell's -n option set fails,
which means that the script has syntax errors. This will likely make
the package uninstallable.
.
Run e.g. sh -n yourscript to see the errors yourself.
Tag: possibly-insecure-handling-of-tmp-files-in-maintainer-script
Severity: normal
Certainty: possible
Info: The maintainer script seems to access a file in /tmp or
some other temporary directory. Since creating temporary files in a
world-writable directory is very dangerous, this is likely to be a
security bug. Use the tempfile or mktemp utilities to
create temporary files in these directories.
Ref: policy 10.4
Tag: killall-is-dangerous
Severity: normal
Certainty: possible
Info: The maintainer script seems to call killall. Since this
utility kills processes by name, it may well end up killing unrelated
processes. Most uses of killall should use invoke-rc.d
instead.
Tag: mknod-in-maintainer-script
Severity: serious
Certainty: certain
Ref: policy 10.6
Info: Maintainer scripts must not create device files directly. They
should call MAKEDEV instead.
.
If mknod is being used to create a FIFO (named pipe), use
mkfifo instead to avoid triggering this tag.
Tag: maintainer-script-should-not-use-start-stop-daemon
Severity: normal
Certainty: certain
Info: The maintainer script seems to call start-stop-daemon
directly. Long-running daemons should be started and stopped via init
scripts using invoke-rc.d rather than directly in maintainer
scripts.
Ref: policy 9.3.3.2
Tag: maintainer-script-removes-device-files
Severity: serious
Certainty: certain
Ref: policy 10.6
Info: Maintainer scripts must not remove device files. This is left to
the system administrator.
Tag: read-in-maintainer-script
Severity: serious
Certainty: possible
Ref: policy 3.9.1
Info: This maintainer script appears to use read to get information from
the user. Prompting in maintainer scripts must be done by communicating
through a program such as debconf which conforms to the Debian
Configuration management specification, version 2 or higher.
.
This check can have false positives if read is used in a block with a
redirection, in a function run in a pipe, or in other ways where
standard input is provided in inobvious ways. If this is the case, please
add an override for this tag.
Tag: possible-bashism-in-maintainer-script
Severity: normal
Certainty: possible
Ref: policy 10.4
Info: This script is marked as running under /bin/sh, but it seems
to use a feature found in bash but not in the SUSv3 or POSIX shell
specification.
.
Examples:
'==' in a test, it should use '=' instead
'read' without a variable in the argument
'function' to define a function
'source' instead of '.'
'. command args', passing arguments to commands via 'source' is not supported
'{foo,bar}' instead of 'foo bar'
'[[ test ]]' instead of '[ test ]' (requires a Korn shell)
'type' instead of 'which' or 'command -v'
Tag: suidregister-used-in-maintainer-script
Severity: important
Certainty: certain
Info: This script calls suidregister, a long-obsolete program that has
been replaced by dpkg-statoverride.
Tag: maintainer-script-needs-depends-on-update-inetd
Severity: normal
Certainty: certain
Info: This script calls update-inetd, but the package does not depend or
pre-depend on inet-superserver, any of the providers of inet-superserver
which provide it, or update-inetd.
.
update-inetd has been moved from netbase into a separate package, so a
dependency on netbase should be updated to depend on "openbsd-inetd |
inet-superserver".
Tag: maintainer-script-needs-depends-on-adduser
Severity: normal
Certainty: certain
Info: This script calls adduser, but the package does not depend or
pre-depend on the adduser package.
Tag: maintainer-script-needs-depends-on-gconf2
Severity: normal
Certainty: certain
Info: This script calls gconf-schemas, which comes from the gconf2 package,
but does not depend or pre-depend on gconf2. If you are using dh_gconf,
add a dependency on ${misc:Depends} and dh_gconf will take care of this
for you.
Tag: maintainer-script-needs-depends-on-ucf
Severity: normal
Certainty: certain
Info: This script calls ucf, but the package does not depend or pre-depend
on the ucf package.
Tag: maintainer-script-needs-depends-on-xml-core
Severity: normal
Certainty: certain
Info: This script calls update-xmlcatalog, which comes from the xml-core
package, but does not depend or pre-depend on xml-core. Packages that call
update-xmlcatalog need to depend on xml-core. If you are using
dh_installxmlcatalogs, add a dependency on ${misc:Depends} and
dh_installxmlcatalogs will take care of this for you.
Tag: maintainer-script-should-not-use-update-alternatives-remove
Severity: normal
Certainty: certain
Info: update-alternatives --remove <alternative> foo is
called in the postrm. This can be dangerous because at the time the
postrm is executed foo has already been deleted and update-alternatives
will ignore it while constructing its list of available alternatives.
Then, if the /etc/alternatives symlink points at foo, update-alternatives
won't recognize it and will mark the symlink as something site-specific.
As such, the symlink will no longer be updated automatically and will be
left dangling until update-alternatives --auto
<alternative> is run by hand.
.
update-alternatives --remove should be called in the prerm
instead.
Ref: policy F, update-alternatives(8)
Tag: maintainer-script-should-not-use-update-alternatives-set
Severity: normal
Certainty: certain
Info: The maintainer script calls update-alternatives --set
<alternative> foo or update-alternatives --config
<alternative> or update-alternatives --set-selections.
.
This makes it impossible to distinguish between an alternative that's
manually set because the user set it and one that's manually set because
the package set it.
Ref: update-alternatives(8)
Tag: maintainer-script-should-not-use-deprecated-chown-usage
Severity: normal
Certainty: certain
Info: chown user.group is called in one of the maintainer
scripts. The correct syntax is chown user:group. Using "." as a
separator is still supported by the GNU tools, but it will fail as soon
as a system uses the "." in user or group names.
Ref: chown(1)
Tag: maintainer-script-should-not-hide-init-failure
Severity: normal
Certainty: certain
Info: This script calls invoke-rc.d to run an init script but then, if the
init script fails, exits successfully (using || exit 0). If the init
script fails, the maintainer script should probably fail.
.
The most likely cause of this problem is that the package was built with
a debhelper version suffering from Bug#337664 that inserted incorrect
invoke-rc.d code in the generated maintainer script. The package needs to
be reuploaded (could be bin-NMUd, no source changes needed).
Tag: maintainer-script-calls-init-script-directly
Severity: serious
Certainty: certain
Info: This script apparently runs an init script directly rather than
using invoke-rc.d. The use of invoke-rc.d to invoke the /etc/init.d/*
initscripts instead of calling them directly is required. Maintainer
scripts may call the init script directly only if invoke-rc.d is not
available.
Ref: policy 9.3.3.2
Tag: maintainer-script-should-not-use-gconftool
Severity: normal
Certainty: possible
Info: This script apparently runs gconftool or gconftool-2. It should
probably be calling gconf-schemas or update-gconf-defaults instead.
Tag: maintainer-script-should-not-use-fc-cache
Severity: normal
Certainty: possible
Info: This script apparently runs fc-cache. Updating of the fontconfig
cache files is now handled automatically by triggers, so running fc-cache
from maintainer scripts is no longer necessary.
Tag: install-info-used-in-maintainer-script
Severity: serious
Certainty: possible
Info: This script apparently runs install-info. Updating the
/usr/share/info/dir file is now handled automatically by
triggers, so running install-info from maintainer scripts is no
longer necessary.
.
If debhelper generated the maintainer script fragment, rebuilding the
package with debhelper 7.2.17 or later will fix this problem.
Tag: maintainer-script-should-not-use-dpkg-status-directly
Severity: important
Certainty: certain
Info: The file /var/lib/dpkg/status is internal to dpkg, may disappear or
change formats, and is not always a correct and complete record of
installed packages while dpkg is running. Maintainer scripts should use
dpkg-query instead. For the most common case of retrieving conffile
information, use:
.
dpkg-query -W -f='${Conffiles}' <package>
.
instead.
Ref: http://wiki.debian.org/DpkgConffileHandling
Tag: maintainer-script-should-not-modify-netbase-managed-file
Severity: serious
Certainty: certain
Info: The maintainer script modifies at least one of the files
/etc/services, /etc/protocols, and /etc/rpc,
which are managed by the netbase package. Instead of doing this, please
file a wishlist bug against netbase to have an appropriate entry added.
Ref: policy 11.2
Tag: maintainer-script-modifies-inetd-conf
Severity: serious
Certainty: certain
Info: The maintainer script modifies /etc/inetd.conf directly.
This file must not be modified directly; instead, use the
update-inetd script or the DebianNet.pm Perl module.
Ref: policy 11.2
Tag: maintainer-script-should-not-modify-ld-so-conf
Severity: important
Certainty: possible
Info: This package appears to modify /etc/ld.so.conf and does not
appear to be part of libc. Packages installing shared libraries in
non-standard locations were previously permitted to modify
/etc/ld.so.conf to add the non-standard path, but this permission was
removed in Policy 3.8.3.
.
Packages containing shared libraries should either install them into
/usr/lib or should require binaries built against them to set
RPATH to find the library at run-time. Installing libraries in a
different directory and modifying the run-time linker path is equivalent
to installing them into /usr/lib except now conflicting library
packages may cause random segfaults and difficult-to-debug problems
instead of conflicts in the package manager.
Tag: maintainer-script-should-not-use-install-sgmlcatalog
Severity: important
Certainty: certain
Info: The maintainer script apparently runs install-sgmlcatalog.
install-sgmlcatalog is deprecated and should only have been used
in postinst or prerm to remove the entries from earlier packages.
Given how long ago this transition was, consider removing it
entirely.
Tag: maintainer-script-should-not-use-service
Severity: important
Certainty: certain
Experimental: yes
Info: The maintainer script apparently runs the service command.
This command is reserved for local
administrators and must never be used by a Debian package.
Tag: maintainer-script-should-not-use-adduser-system-without-home
Severity: serious
Certainty: certain
Info: The maintainer script apparently runs 'adduser --system'
but hardcodes a path under '/home' for the '--home' option or
do not use the '--home' option.
.
The FHS says: /home is a fairly standard concept, but it
is clearly a site-specific filesystem. The setup will differ
from host to host. Therefore, no program should rely on this
location.
Ref: fhs homeuserhomedirectories
Tag: maintainer-script-empty
Severity: minor
Certainty: certain
Info: The maintainer script doesn't seem to contain any code other than
comments and boilerplate (set -e, exit statements, and the case statement
to parse options). While this is harmless in most cases, it is probably
not what you wanted, may mean the package will leave unnecessary files
behind until purged, and may even lead to problems in rare situations
where dpkg would fail if no maintainer script was present.
.
If the package currently doesn't need to do anything in this maintainer
script, it shouldn't be included in the package.
Tag: maintainer-script-ignores-errors
Severity: normal
Certainty: certain
Ref: policy 10.4
Info: The maintainer script doesn't seem to set the -e flag which
ensures that the script's execution is aborted when any executed command
fails.
Tag: maintainer-script-without-set-e
Severity: pedantic
Certainty: certain
Ref: policy 10.4
Info: The maintainer script passes -e to the shell on the
#! line rather than using set -e in the body of the
script. This is fine for normal operation, but if the script is run by
hand with sh /path/to/script (common in debugging), -e
will not be in effect. It's therefore better to use set -e in
the body of the script.
Tag: command-with-path-in-maintainer-script
Severity: normal
Certainty: certain
Info: The indicated program run in a maintainer script has a prepended
path. Programs called from maintainer scripts normally should not have a
path prepended. dpkg ensures that the PATH is set to a reasonable value,
and prepending a path may prevent the local administrator from using a
replacement version of a command for some local reason.
.
If the path is required to test a program for existence, one of the suggested
workarounds in the developer's reference can be used.
Ref: policy 6.1, devref 6.4
Tag: maintainer-script-should-not-use-ancient-dpkg-epoch-check
Severity: minor
Certainty: certain
Info: The package calls dpkg --assert-working-epoch in a maintainer
script. This check is obsolete and has always returned true since dpkg
1.4.0.7, released 1997-01-25.
Tag: maintainer-script-should-not-use-ancient-dpkg-multi-conrep-check
Severity: minor
Certainty: certain
Info: The package calls dpkg --assert-multi-conrep in a maintainer
script. This check is obsolete and has always returned true since dpkg
1.4.1.19, released 1999-10-30.
Tag: package-uses-local-diversion
Severity: serious
Certainty: certain
Ref: policy 3.9
Info: The maintainer script calls dpkg-divert with --local or
without --package. This option is reserved for local
administrators and must never be used by a Debian package.
Tag: diversion-for-unknown-file
Severity: important
Certainty: certain
Info: The maintainer script adds a diversion for a file that is not
provided by this package.
Tag: orphaned-diversion
Severity: important
Certainty: certain
Info: A diversion was added for the file, but not removed. This means
your package doesn't restore the previous state after removal.
Tag: remove-of-unknown-diversion
Severity: important
Certainty: certain
Info: The maintainer script removes a diversion that it didn't add. If
you're cleaning up unnecessary diversions from older versions of the
package, remove them in preinst or postinst instead of
waiting for postrm to do it.
Tag: script-uses-perl4-libs-without-dep
Severity: normal
Certainty: possible
Info: This package includes perl scripts using obsoleted perl 4-era
libraries. These libraries have been deprecated in perl in 5.14, and
are likely to be removed from the core in perl 5.16. Please either
remove references to these libraries, or add a dependency on
libperl4-corelibs-perl | perl (<< 5.12.3-7) to this package.
Tag: maintainer-script-has-unexpanded-debhelper-token
Severity: normal
Certainty: possible
Info: Lintian has detected the presence of a #DEBEHELPER# token in the
listed maintainer/control script. By default, dh_installdeb will remove
the token when it makes a substitution in a script.
.
Please note that dh_installdeb does not substitute the #DEBHELPER#
token in udebs.
lintian-2.5.22ubuntu1/checks/debian-source-dir.desc 0000664 0000000 0000000 00000005115 12310413144 017043 0 ustar Check-Script: debian-source-dir
Author: Raphaël Hertzog
Abbrev: dsd
Type: source
Info: This script looks for mistakes in debian/source/* files.
Needs-Info: debfiles
Tag: missing-debian-source-format
Severity: wishlist
Certainty: certain
Info: Explicitly selecting a source format by putting the format in
debian/source/format is recommended. This allows for
future removal of the 1.0 default for the package source format and,
depending on the source format, may allow unambiguous declaration of
whether this package is native or non-native.
.
If you don't have a reason to stay with the old format for this package,
please consider switching to "3.0 (quilt)" (for packages with a separate
upstream tarball) or to "3.0 (native)" (for Debian native packages).
.
If you wish to keep using the old format, please create that file and put
"1.0" in it to be explicit about the source package version. If you have
problems with the 3.0 format, the dpkg maintainers are interested in
hearing, at debian-dpkg@lists.debian.org, the (technical) reasons why the
new formats do not suit you.
Ref: dpkg-source(1), http://wiki.debian.org/Projects/DebSrc3.0
Tag: unknown-source-format
Severity: serious
Certainty: certain
Info: debian/source/format contains an unknown source format. The
formats officially supported by Debian are "3.0 (quilt)", "3.0 (native)"
and "1.0". dpkg-source additionally supports "2.0", "3.0 (git)" and
"3.0 (bzr)".
Ref: dpkg-source(1)
Tag: unknown-file-in-debian-source
Severity: important
Certainty: possible
Info: The source package contains a file in debian/source/ that lintian
doesn't know about. Currently the following files are recognized:
.
* format
* include-binaries
* lintian-overrides
* options
* patch-header
.
This tag is emitted in case you mistyped the name of one of the above
files. If that's not the case and if the file can be legitimately be
expected in source packages, please file a bug against lintian asking
for the file to be recognized.
Tag: git-patches-not-exported
Severity: important
Certainty: possible
Info: The source package contains non-empty debian/source/git-patches,
which indicates it was intended to have patches exported via the
quilt-patches-deb-export-hook of gitpkg. It seems the patches
were not exported in this source package.
.
This tag is generated by building the source package without gitpkg (or
with a misconfigured gitpkg) and without manually exporting the patches.
See the above mentioned hook file (in /usr/share/gitpkg/hooks) for
information on how to manually export patches.
lintian-2.5.22ubuntu1/checks/control-file.desc 0000664 0000000 0000000 00000022165 12314366011 016154 0 ustar Check-Script: control-file
Author: Marc 'HE' Brockschmidt
Abbrev: dctl
Type: source
Needs-Info: debfiles
Info: This script checks debian/control files in source packages
Tag: debian-control-file-uses-obsolete-national-encoding
Severity: serious
Certainty: certain
Ref: policy 5.1
Info: The Debian control file should be valid UTF-8, an encoding of
the Unicode character set.
.
There are many ways to convert a control from an obsoleted encoding
like ISO-8859-1; you may for example use "iconv" like this:
.
$ iconv -f ISO-8859-1 -t UTF-8 control > control.new
$ mv control.new control
Tag: build-info-in-binary-control-file-section
Severity: serious
Certainty: certain
Ref: policy 5.2
Info: The control file has a Build-Depends, Build-Depends-Indep,
Build-Conflicts, or Build-Conflicts-Indep field in a binary
section. These specify source package relationships, and should be in
the source section of the control file.
Tag: debian-control-has-unusual-field-spacing
Severity: pedantic
Certainty: certain
Ref: policy 5.1
Info: The field on this line of debian/control has whitespace
other than a single space after the colon. This is explicitly permitted
in the syntax of Debian control files, but as Policy says, it is
conventional to put a single space after the colon.
Tag: debian-control-repeats-field-name-in-value
Severity: normal
Certainty: possible
Ref: policy 5.1
Info: The field on this line of debian/control repeats
the field name in the value of the field. As an example:
.
Maintainer: Maintainer: Some Name <maintainer@mail.example.com>
Tag: binary-control-field-duplicates-source
Severity: wishlist
Certainty: certain
Info: In debian/control, this field for a binary package
duplicates the value inherited from the source package paragraph. This
doesn't hurt anything, but you may want to take advantage of the
inheritance and set the value in only one place. It prevents missing
duplicate places that need to be fixed if the value ever changes.
Tag: debian-control-file-is-a-symlink
Severity: normal
Certainty: certain
Info: The debian/control file is a symlink rather than a regular
file. Using symlinks for required source package files is unnecessary and
makes package checking and manipulation more difficult. If the control
file should be available in the source package under multiple names, make
debian/control the real file and the other names symlinks to it.
Tag: no-section-field-for-source
Severity: normal
Certainty: certain
Ref: policy 5.2
Info: The package does not have a "Section:" field in the source package
section of its control file. The Section field is required for source
packages at the request of the Debian ftp-masters.
Tag: section-area-mismatch
Severity: important
Certainty: certain
Info: The debian/control file places the indicated binary package
in a different archive area (main, contrib, non-free) than its source
package or other binary packages built from the same source package. The
source package and any binary packages it builds must be in the same
area of the archive, with the single exception that source packages in
main may also build binary packages in contrib.
Tag: xs-vcs-header-in-debian-control
Severity: wishlist
Certainty: certain
Info: There is an XS-Vcs-* field in the debian/control file. As
of dpkg 1.14.6, the XS- prefix is no longer necessary. dpkg now
recognizes these headers and handles them correctly. Consider removing
the XS- prefix for this field.
Tag: xc-package-type-in-debian-control
Severity: pedantic
Certainty: certain
Info: The debian/control file contains an XC-Package-Type field.
As of dpkg-dev 1.15.7, the dpkg development utilities recognize
Package-Type as an official field name and do not add it to binary
packages (the previous concern with the dpkg-dev-supported Package-Type
field). XC-Package-Type should generally now be replaced with
Package-Type.
Tag: stronger-dependency-implies-weaker
Severity: normal
Certainty: certain
Ref: policy 7.2
Info: In the debian/control stanza for the given package, a
stronger dependency field implies one of the dependencies in a weaker
dependency field. In other words, the Depends field of the package
requires that one of the packages listed in Recommends or Suggests be
installed, or a package is listed in Recommends as well as Suggests.
.
Current versions of dpkg-gencontrol will silently fix this problem by
removing the weaker dependency, but it may indicate a more subtle bug
(misspelling or forgetting to remove the stronger dependency when it was
moved to the weaker field).
Tag: package-depends-on-itself
Severity: normal
Certainty: certain
Ref: policy 7.2
Info: The given package declares a dependency on itself in its
debian/control stanza. Current versions of dpkg-gencontrol will
silently fix this problem by removing the dependency, but it may indicate
a more subtle bug (misspelling or cutting and pasting the wrong package
name).
Tag: duplicate-short-description
Severity: wishlist
Certainty: possible
Info: The listed binary packages all share the same short description (the
first line of the Description control field). The package names may
provide enough additional information to distinguish between the
packages, but it's common to also add a word or two to the short
description to clarify the difference.
Tag: duplicate-long-description
Severity: wishlist
Certainty: certain
Info: The listed binary packages all share the same extended description.
Some additional information in the extended description explaining what
is in each package and how it differs from the other packages is useful,
particularly for users who aren't familiar with Debian's package naming
conventions.
Tag: duplicate-in-relation-field
Severity: pedantic
Certainty: certain
Info: The given field in the debian/control file contains
relations that are either identical or imply each other. The less
restrictive one can be removed. This is done automatically by
dpkg-source and dpkg-gencontrol, so this does not
affect the generated package.
Tag: missing-separator-between-items
Severity: important
Certainty: certain
Info: The given field in the debian/control file contains a list
of items separated by commas and pipes. It appears a separator was
missed between two items. This can lead to bogus or incomplete
dependencies, conflicts etc.
Tag: obsolete-relation-form-in-source
Ref: policy 7.1
Severity: serious
Certainty: certain
Info: The forms "<" and ">" mean "<=" and ">=", not "<<"
and ">>" as one might expect. These forms were marked obsolete and
must no longer be used. Use the longer forms instead.
Tag: package-depends-on-hardcoded-libc
Severity: normal
Certainty: certain
Info: The given package declares a dependency on libc directly instead
of using ${shlibs:Depends} in its debian/control stanza.
Tag: weak-library-dev-dependency
Severity: important
Certainty: possible
Ref: policy 8.5
Info: The given package appears to be a shared library -dev package, but
the dependency on what seems to be a corresponding shared library package
does not force the same package version. To ensure that compiling and
linking works properly, and that the symlinks in the -dev package point
to the correct files in the shared library package, a -dev package should
normally use (= ${binary:Version}) for the dependency on the
shared library package.
.
Sometimes, such as for -dev packages that are architecture-independent to
not break binNMUs or when one doesn't want to force a tight dependency, a
weaker dependency is warranted. Something like (>=
${source:Upstream-Version}), (<<
${source:Upstream-Version}+1~), possibly using
${source:Version} instead, is the right approach. The goal is to
ensure that a new upstream version of the library package doesn't satisfy
the -dev package dependency, since the minor version of the shared
library may have changed, breaking the *.so links.
Tag: syntax-error-in-control-file
Severity: important
Certainty: possible
Info: The control file contains a syntax error.
.
This issue may hide other issues as Lintian skips some checks on the
file in this case.
Tag: control-file-contains-dh_make-vcs-comment
Severity: normal
Certainty: certain
Info: The control file contains commented-out VCS-* lines, most
probably a result of dh_make. These URLs should either be valid and
uncommented, or removed.
Tag: stageX-profile-used-but-no-binary-package-dropped
Severity: normal
Certainty: certain
Info: You used a stage1 or stage2 build profile restriction in the build
dependencies but you did not mark any binary packages as not being built with
the used profile activated. Using a stage1 or stage2 build profile restriction
means that you intend to change the build process in a way such that some of
the build results will be different or not generated at all. All binary
packages which would provide different functionality, would be empty or not be
built at all under the stage1 or stage2 profiles must be marked as not being
generated with the Build-Profiles field.
lintian-2.5.22ubuntu1/checks/huge-usr-share.pm 0000664 0000000 0000000 00000004327 12311317610 016112 0 ustar # huge-usr-share -- lintian check script -*- perl -*-
# Copyright (C) 2004 Jeroen van Wolffelaar
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::huge_usr_share;
use strict;
use warnings;
use autodie;
use Lintian::Tags qw(tag);
# Threshold in kB of /usr/share to trigger this warning. Consider that the
# changelog alone can be quite big, and cannot be moved away.
my $THRESHOLD_SIZE_SOFT = 2048;
my $THRESHOLD_SIZE_HARD = 4096;
my $THRESHOLD_PERC = 50;
sub run {
my (undef, undef, $info) = @_;
# Skip architecture-dependent packages.
my $arch = $info->field('architecture', '');
return if $arch eq 'all';
# Add up the space taken by the package and the space taken by
# just the files in /usr/share. Convert the totals to kilobytes.
my ($size, $size_usrshare) = (0, 0);
for my $file ($info->sorted_index) {
$size += $file->size;
if ($file =~ m,usr/share/,) {
$size_usrshare += $file->size;
}
}
$size = int($size / 1024);
$size_usrshare = int($size_usrshare / 1024);
if ($size_usrshare > $THRESHOLD_SIZE_SOFT) {
my $perc = int(100 * $size_usrshare / $size);
if ($size_usrshare > $THRESHOLD_SIZE_HARD || $perc > $THRESHOLD_PERC) {
tag 'arch-dep-package-has-big-usr-share',
"${size_usrshare}kB $perc%";
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/ocaml.desc 0000664 0000000 0000000 00000004676 12153060143 014657 0 ustar Check-Script: ocaml
Author: Stephane Glondu
Abbrev: ocaml
Type: binary
Info: This looks for common mistakes in OCaml binary packages.
Needs-Info: file-info, ar-info, index
Tag: ocaml-dangling-cmxa
Severity: serious
Certainty: certain
Info: This package provides a .cmxa library without its
implementation (.a static library).
Tag: ocaml-dangling-cmx
Severity: serious
Certainty: certain
Info: This package provides a .cmx module without its
implementation (.o object file which may be embedded in a
.a static library installed in the same directory).
Tag: ocaml-dangling-cmxs
Severity: normal
Certainty: possible
Info: This package seems to be a library package, and provides a native
plugin (.cmxs). If the plugin is meant to be used as a library
for other plugins, it should be shipped as bytecode (.cma or
.cmo) as well.
Tag: ocaml-dev-file-not-in-usr-lib-ocaml
Severity: pedantic
Certainty: possible
Info: This development package installs OCaml development files
(.cmi, .cmx or .cmxa) outside
/usr/lib/ocaml. Such files are used only by compilation and
should be in a subdirectory of OCaml standard library path.
Tag: ocaml-stray-cmo
Severity: minor
Certainty: wild-guess
Info: This package installs a .cma file and a .cmo file
with the same base name. Most of the time, the module provided by the
.cmo file is also linked in the .cma file, so the
.cmo file is useless.
Tag: ocaml-dangling-cmi
Severity: wishlist
Certainty: possible
Info: This package installs a compiled interface (.cmi) without
its text version (.mli). The text version should also be
installed for documentation purpose. If the module involved doesn't have
a .mli, its source code (.ml) should be installed
instead.
Tag: ocaml-dev-file-in-nondev-package
Severity: pedantic
Certainty: possible
Info: This package doesn't appear to be a development package, but
installs OCaml development files (.cmi, .cmx or
.cmxa). These files should be moved to a development package.
Tag: ocaml-meta-without-suggesting-findlib
Severity: pedantic
Certainty: certain
Info: This development package installs a META file but doesn't depend on
ocaml-findlib. Libraries with META file are easier to use with findlib.
The package should at least suggest ocaml-findlib.
lintian-2.5.22ubuntu1/checks/infofiles.pm 0000664 0000000 0000000 00000012124 12311317611 015224 0 ustar # infofiles -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz
# Copyright (C) 2001 Josip Rodin
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::infofiles;
use strict;
use warnings;
use autodie;
use Lintian::Tags qw(tag);
use Lintian::Util qw(fail open_gz normalize_pkg_path);
use File::Basename qw(fileparse);
sub run {
my (undef, undef, $info) = @_;
# Read package contents...
foreach my $file ($info->sorted_index) {
my $file_info = $info->file_info($file);
my ($fname, $path) = fileparse($file);
next
unless ($file->is_symlink or $file->is_file)
and ($path =~ m,^usr/share/info/, or $path =~ m,^usr/info/,);
# Ignore dir files. That's a different error which we already catch in
# the files check.
next if $fname =~ /^dir(?:\.old)?(?:\.gz)?/;
# Analyze the file names making sure the documents are named
# properly. Note that Emacs 22 added support for images in
# info files, so we have to accept those and ignore them.
# Just ignore .png files for now.
my @fname_pieces = split /\./, $fname;
my $ext = pop @fname_pieces;
if ($ext eq 'gz') { # ok!
if ($file->is_file) {
# compressed with maximum compression rate?
if ($file_info !~ m/gzip compressed data/o) {
tag 'info-document-not-compressed-with-gzip', $file;
} else {
if ($file_info !~ m/max compression/o) {
tag
'info-document-not-compressed-with-max-compression',
$file;
}
}
}
} elsif ($ext eq 'png') {
next;
} else {
push(@fname_pieces, $ext);
tag 'info-document-not-compressed', $file;
}
my $infoext = pop @fname_pieces;
unless ($infoext && $infoext =~ /^info(-\d+)?$/) { # it's not foo.info
unless (!@fname_pieces) {
# it's not foo{,-{1,2,3,...}}
tag 'info-document-has-wrong-extension', $file;
}
}
# If this is the main info file (no numeric extension). make
# sure it has appropriate dir entry information.
if ($fname !~ /-\d+\.gz/ && $file_info =~ /gzip compressed data/) {
if ($file->is_symlink && !is_ancestor_of($info->unpacked, $file)) {
# unsafe symlink, skip
next;
}
my $fd = open_gz($info->unpacked($file));
local $_;
my ($section, $start, $end);
while (<$fd>) {
$section = 1 if /^INFO-DIR-SECTION\s+\S/;
$start = 1 if /^START-INFO-DIR-ENTRY\b/;
$end = 1 if /^END-INFO-DIR-ENTRY\b/;
}
close($fd);
tag 'info-document-missing-dir-section', $file unless $section;
tag 'info-document-missing-dir-entry', $file unless $start && $end;
}
# Check each [image src=""] form in the info files. The src
# filename should be in the package. As of Texinfo 5 it will
# be something.png or something.jpg, but that's not enforced.
#
# See Texinfo manual (info "(texinfo)Info Format Image") for
# details of the [image] form. Bytes \x00,\x08 introduce it
# (and distinguishes it from [image] appearing as plain text).
#
# String src="..." part has \" for literal " and \\ for
# literal \, though that would be unlikely in filenames. For
# the tag() message show $src unbackslashed since that's the
# filename sought.
#
if ($file->is_file && $fname =~ /\.info(?:-\d+)?\.gz$/) {
my $fd = open_gz($info->unpacked($file));
while (my $line = <$fd>) {
while ($line =~ /[\0][\b]\[image src="((?:\\.|[^\"])+)"/smg) {
my $src = $1;
$src =~ s/\\(.)/$1/g; # unbackslash
$info->index(normalize_pkg_path('usr/share/info', $src))
or tag 'info-document-missing-image-file', $file, $src;
}
}
close($fd);
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/changes-file.pm 0000664 0000000 0000000 00000011761 12311317577 015614 0 ustar # changes-file -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz and Richard Braakman
#
# This program is free software. It is distributed under the terms of
# the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any
# later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::changes_file;
use strict;
use warnings;
use autodie;
use Lintian::Tags qw(tag);
use Lintian::Check qw(check_maintainer);
use Lintian::Data;
use Lintian::Util qw(get_file_checksum);
my $KNOWN_DISTS = Lintian::Data->new('changes-file/known-dists');
sub run {
my ($pkg, undef, $info) = @_;
# If we don't have a Format key, something went seriously wrong.
# Tag the file and skip remaining processing.
if (!$info->field('format')) {
tag 'malformed-changes-file';
return;
}
# Description is mandated by dak, but only makes sense if binary
# packages are included. Don't tag pure source uploads.
if ( !$info->field('description')
&& $info->field('architecture', '') ne 'source') {
tag 'no-description-in-changes-file';
}
# check distribution field
if (defined $info->field('distribution')) {
my @distributions = split /\s+/o, $info->field('distribution');
for my $distribution (@distributions) {
if ($distribution eq 'UNRELEASED') {
# ignore
} else {
my $dist = $distribution;
if ($dist !~ m/^(?:sid|unstable|experimental)/) {
# Strip common "extensions" for distributions
# (except sid and experimental, where they would
# make no sense)
$dist =~ s/- (?:backports(?:-sloppy)?
|proposed(?:-updates)?
|updates
|security
|volatile)$//xsmo;
}
if (!$KNOWN_DISTS->known($dist)) {
# bad distribution entry
tag 'bad-distribution-in-changes-file', $distribution;
}
}
}
if ($#distributions > 0) {
tag 'multiple-distributions-in-changes-file',
$info->field('distribution');
}
}
# Urgency is only recommended by Policy.
if (!$info->field('urgency')) {
tag 'no-urgency-in-changes-file';
} else {
my $urgency = lc $info->field('urgency');
$urgency =~ s/ .*//o;
unless ($urgency =~ /^(?:low|medium|high|critical|emergency)$/o) {
tag 'bad-urgency-in-changes-file', $info->field('urgency');
}
}
# Changed-By is optional in Policy, but if set, must be
# syntactically correct. It's also used by dak.
if ($info->field('changed-by')) {
check_maintainer($info->field('changed-by'), 'changed-by');
}
my $files = $info->files;
my $path = readlink($info->lab_data_path('changes'));
$path =~ s#/[^/]+$##;
foreach my $file (keys %$files) {
my $file_info = $files->{$file};
# check section
if ( ($file_info->{section} eq 'non-free')
or ($file_info->{section} eq 'contrib')) {
tag 'bad-section-in-changes-file', $file, $file_info->{section};
}
foreach my $alg (qw(sha1 sha256)) {
my $checksum_info = $file_info->{checksums}{$alg};
if (defined $checksum_info) {
if ($file_info->{size} != $checksum_info->{filesize}) {
tag 'file-size-mismatch-in-changes-file', $file,
$file_info->{size} . ' != ' .$checksum_info->{filesize};
}
}
}
# check size
my $filename = "$path/$file";
my $size = -s $filename;
if ($size ne $file_info->{size}) {
tag 'file-size-mismatch-in-changes-file', $file,
$file_info->{size} . " != $size";
}
# check checksums
foreach my $alg (qw(md5 sha1 sha256)) {
next unless exists $file_info->{checksums}{$alg};
my $real_checksum = get_file_checksum($alg, $filename);
if ($real_checksum ne $file_info->{checksums}{$alg}{sum}) {
tag 'checksum-mismatch-in-changes-file', $alg, $file;
}
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/md5sums.pm 0000664 0000000 0000000 00000007123 12311317612 014647 0 ustar # md5sums -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz and Richard Braakman
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::md5sums;
use strict;
use warnings;
use autodie;
use Lintian::Tags qw(tag);
use Lintian::Util qw(dequote_name);
sub run {
my (undef, undef, $info) = @_;
my $control = $info->control('md5sums');
my (%control_entry, %info_entry);
# The md5sums file should not be a symlink. If it is, the best
# we can do is to leave it alone.
return if -l $control;
# Is there a md5sums control file?
unless (-f $control) {
# ignore if package contains no files
return if -z $info->lab_data_path('md5sums');
# check if package contains non-conffiles
# debhelper doesn't create entries in md5sums
# for conffiles since this information would
# be redundant
my $only_conffiles = 1;
foreach my $file ($info->sorted_index) {
# Skip non-files, they will not appear in the md5sums file
next unless $file->is_regular_file;
unless ($info->is_conffile($file)) {
$only_conffiles = 0;
last;
}
}
tag 'no-md5sums-control-file' unless $only_conffiles;
return;
}
# Is it empty? Then skip it. Tag will be issued by control-files
if (-z $control) {
return;
}
# read in md5sums control file
open(my $fd, '<', $control);
LINE:
while (my $line = <$fd>) {
chop($line);
next LINE if $line =~ m/^\s*$/;
if ($line
=~ m{^(?'escaped'\\)?(?'md5sum'[a-f0-9]+)\s*(?:\./)?(?'name'\S.*)$}
) {
my $md5sum = $+{'md5sum'};
if(length($md5sum) != 32) {
tag 'malformed-md5sums-control-file', "line $.";
next LINE;
}
my $name = $+{'name'};
my $escaped = $+{'escaped'};
if ($escaped) {
$name = dequote_name($name);
}
$control_entry{$name} = $md5sum;
} else {
tag 'malformed-md5sums-control-file', "line $.";
next LINE;
}
}
close($fd);
for my $file (keys %control_entry) {
my $md5sum = $info->md5sums->{$file};
if (not defined $md5sum) {
tag 'md5sums-lists-nonexistent-file', $file;
} elsif ($md5sum ne $control_entry{$file}) {
tag 'md5sum-mismatch', $file;
}
delete $info_entry{$file};
}
for my $file (keys %{ $info->md5sums }) {
next if $control_entry{$file};
tag 'file-missing-in-md5sums', $file
unless ($info->is_conffile($file)
|| $file =~ m%^var/lib/[ai]spell/.%o);
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/copyright-file.pm 0000664 0000000 0000000 00000033323 12311317600 016175 0 ustar # copyright-file -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::copyright_file;
use strict;
use warnings;
use autodie;
use constant {
DH_MAKE_TODO_BOILERPLATE_1 =>join(q{ },
'# Please also look if there are files or directories',
"which have a\n\# different copyright/license attached",
'and list them here.'),
DH_MAKE_TODO_BOILERPLATE_2 =>join(q{ },
'# If you want to use GPL v2 or later for the /debian/\*',
"files use\n\# the following clauses, or change it to suit.",
'Delete these two lines'),
};
use Encode qw(decode);
use List::MoreUtils qw(any);
use Lintian::Check qw(check_spelling);
use Lintian::Data ();
use Lintian::Tags qw(tag);
use Lintian::Util qw(slurp_entire_file file_is_encoded_in_non_utf8);
our $KNOWN_ESSENTIAL = Lintian::Data->new('fields/essential');
our $KNOWN_COMMON_LICENSES
= Lintian::Data->new('copyright-file/common-licenses');
sub run {
my ($pkg, undef, $info, undef, $group) = @_;
my $found = 0;
my $linked = 0;
my $path = "usr/share/doc/$pkg";
if ($info->index("$path/copyright.gz")) {
tag 'copyright-file-compressed';
$found = 1;
}
if (my $index_info = $info->index("$path/copyright")) {
$found = 1;
if ($index_info->is_symlink) {
tag 'copyright-file-is-symlink';
$linked = 1;
# Fall through here - coll/copyright-file protects us
# from reading through an "evil" link.
}
}
if (not $found) {
my $index_info = $info->index($path);
if (defined $index_info && $index_info->is_symlink) {
my $link = $index_info->link;
# check if this symlink references a directory elsewhere
if ($link =~ m,^(?:\.\.)?/,) {
tag 'usr-share-doc-symlink-points-outside-of-usr-share-doc',
$link;
return;
}
# The symlink may point to a subdirectory of another
# /usr/share/doc directory. This is allowed if this
# package depends on link and both packages come from the
# same source package.
#
# Policy requires that packages be built from the same
# source if they're going to do this, which by my (rra's)
# reading means that we should have a strict version
# dependency. However, in practice the copyright file
# doesn't change a lot and strict version dependencies
# cause other problems (such as with arch: any / arch: all
# package combinations and binNMUs).
#
# We therefore just require the dependency for now and
# don't worry about the version number.
$link =~ s,/.*,,;
if (not depends_on($info, $link)) {
tag 'usr-share-doc-symlink-without-dependency', $link;
return;
}
# Check if the link points to a package from the same source.
check_cross_link($group, $link);
return;
}
}
if (not $found) {
# #522827: special exception for perl for now
tag 'no-copyright-file'
unless $pkg eq 'perl';
return;
}
my $dcopy = $info->lab_data_path('copyright');
# check that copyright is UTF-8 encoded
my $line = file_is_encoded_in_non_utf8($dcopy);
if ($line) {
tag 'debian-copyright-file-uses-obsolete-national-encoding',
"at line $line";
}
# check contents of copyright file
$_ = slurp_entire_file($dcopy);
if (m,\r,) {
tag 'copyright-has-crs';
}
my $wrong_directory_detected = 0;
if (m{ (usr/share/common-licenses/ ( [^ \t]*? ) \.gz) }xsm) {
my ($path, $license) = ($1, $2);
if ($KNOWN_COMMON_LICENSES->known($license)) {
tag 'copyright-refers-to-compressed-license', $path;
}
}
# Avoid complaining about referring to a versionless license file
# if the word "version" appears nowhere in the copyright file.
# This won't catch all of our false positives for GPL references
# that don't include a specific version number, but it will get
# the obvious ones.
if (m,(usr/share/common-licenses/(L?GPL|GFDL))([^-]),i) {
my ($ref, $license, $separator) = ($1, $2, $3);
if ($separator =~ /[\d\w]/) {
tag 'copyright-refers-to-nonexistent-license-file',
"$ref$separator";
} elsif (m,\b(?:any|or)\s+later(?:\s+version)?\b,i
|| m,License: $license-[\d\.]+\+,i
|| m,as Perl itself,i
|| m,License-Alias:\s+Perl,
|| m,License:\s+Perl,) {
tag 'copyright-refers-to-symlink-license', $ref;
} else {
tag 'copyright-refers-to-versionless-license-file', $ref
if /\bversion\b/;
}
}
# References to /usr/share/common-licenses/BSD are deprecated as of Policy
# 3.8.5.
if (m,/usr/share/common-licenses/BSD,) {
tag 'copyright-refers-to-deprecated-bsd-license-file';
}
if (m,(usr/share/common-licences),) {
tag 'copyright-refers-to-incorrect-directory', $1;
$wrong_directory_detected = 1;
}
if (m,usr/share/doc/copyright,) {
tag 'copyright-refers-to-old-directory';
$wrong_directory_detected = 1;
}
if (m,usr/doc/copyright,) {
tag 'copyright-refers-to-old-directory';
$wrong_directory_detected = 1;
}
# Lame check for old FSF zip code. Try to avoid false positives from other
# Cambridge, MA addresses.
if (m/(?:Free\s*Software\s*Foundation.*02139|02111-1307)/s) {
tag 'old-fsf-address-in-copyright-file';
}
# Whether the package is covered by the GPL, used later for the
# libssl check.
my $gpl;
if (
length($_) > 12_000
and (
m/ \b \QGNU GENERAL PUBLIC LICENSE\E \s*
\QTERMS AND CONDITIONS FOR COPYING,\E \s*
\QDISTRIBUTION AND MODIFICATION\E\b/mx
or ( m/\bGNU GENERAL PUBLIC LICENSE\s*Version 3/
and m/\bTERMS AND CONDITIONS\s/))
) {
tag 'copyright-file-contains-full-gpl-license';
$gpl = 1;
}
if ( length($_) > 12_000
and m/\bGNU Free Documentation License\s*Version 1\.2/
and m/\b1\. APPLICABILITY AND DEFINITIONS/) {
tag 'copyright-file-contains-full-gfdl-license';
}
if ( length($_) > 10_000
and m/\bApache License\s+Version 2\.0,/
and m/TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION/) {
tag 'copyright-file-contains-full-apache-2-license';
}
# wtf?
if ((m,common-licenses(/\S+),) && (!m,/usr/share/common-licenses/,)) {
tag 'copyright-does-not-refer-to-common-license-file', $1;
}
# This check is a bit prone to false positives, since some other
# licenses mention the GPL. Also exclude any mention of the GPL
# following what looks like mail headers, since sometimes e-mail
# discussions of licensing are included in the copyright file but
# aren't referring to the license of the package.
if (
m,/usr/share/common-licenses,
|| m/Zope Public License/
|| m/LICENSE AGREEMENT FOR PYTHON 1.6.1/
|| m/LaTeX Project Public License/
|| m/(?:^From:.*^To:|^To:.*^From:).*(?:GNU General Public License|GPL)/ms
|| m/AFFERO GENERAL PUBLIC LICENSE/
|| m/GNU Free Documentation License[,\s]*Version 1\.1/
|| m/CeCILL FREE SOFTWARE LICENSE AGREEMENT/ #v2.0
|| m/FREE SOFTWARE LICENSING AGREEMENT CeCILL/ #v1.1
|| m/CNRI OPEN SOURCE GPL-COMPATIBLE LICENSE AGREEMENT/
|| m/compatible\s+with\s+(?:the\s+)?(?:GNU\s+)?GPL/
|| m/(?:GNU\s+)?GPL\W+compatible/
|| m/was\s+previously\s+(?:distributed\s+)?under\s+the\s+GNU/
|| m/means\s+either\s+the\s+GNU\s+General\s+Public\s+License/
|| $wrong_directory_detected
) {
# False positive or correct reference. Ignore.
} elsif (m/GNU Free Documentation License/i or m/\bGFDL\b/) {
tag 'copyright-should-refer-to-common-license-file-for-gfdl';
} elsif (m/GNU (?:Lesser|Library) General Public License/i or m/\bLGPL\b/){
tag 'copyright-should-refer-to-common-license-file-for-lgpl';
} elsif (m/GNU General Public License/i or m/\bGPL\b/) {
tag 'copyright-should-refer-to-common-license-file-for-gpl';
$gpl = 1;
} elsif (m/Apache License\s+,? Version 2\.0/i or m/\bApache-2(?:\.0)?\b/) {
tag 'copyright-should-refer-to-common-license-file-for-apache-2';
}
if (m,(?:under )?(?:the )?(?:same )?(?:terms )?as Perl itself,i
&& !m,usr/share/common-licenses/,) {
tag 'copyright-file-lacks-pointer-to-perl-license';
}
# Checks for various packaging helper boilerplate.
if (
m,\,o
or m,\,o
or m,\,o
or m,\,o
or m,Upstream Author\(s\),o
or m,\,o
or m,\,o
or m,\,o
or m,\Q\E,ox
or m,\,o
or m,\,o
) {
tag 'helper-templates-in-copyright';
}
if (m/This copyright info was automatically extracted/o) {
tag 'copyright-contains-dh-make-perl-boilerplate';
}
if (m,url://,o) {
tag 'copyright-has-url-from-dh_make-boilerplate';
}
if ( index($_, DH_MAKE_TODO_BOILERPLATE_1) != -1
or index($_, DH_MAKE_TODO_BOILERPLATE_2) != -1) {
tag 'copyright-contains-dh_make-todo-boilerplate';
}
if (m,The\s+Debian\s+packaging\s+is\s+\(C\)\s+\d+,io) {
tag 'copyright-with-old-dh-make-debian-copyright';
}
# Bad licenses.
if (m/The\s+PHP\s+Licen[cs]e,?\s+version\s+2/si) {
tag 'copyright-refers-to-bad-php-license';
}
if (m/The\s+PHP\s+Licen[cs]e,?\s+version\s+3\.0[^\d]/si) {
tag 'copyright-refers-to-problematic-php-license';
}
# Other flaws in the copyright phrasing or contents.
if (
$found
&& !$linked
&& !/(?:Copyright|Copr\.|\302\251)(?:.*|[\(C\):\s]+)\b\d{4}\b
|\bpublic\s+domain\b/xi
) {
tag 'copyright-without-copyright-notice';
}
check_spelling('spelling-error-in-copyright', $_, undef,
$group->info->spelling_exceptions);
# Now, check for linking against libssl if the package is covered
# by the GPL. (This check was requested by ftp-master.) First,
# see if the package is under the GPL alone and try to exclude
# packages with a mix of GPL and LGPL or Artistic licensing or
# with an exception or exemption.
if ($gpl || m,/usr/share/common-licenses/GPL,) {
unless (m,exception|exemption|/usr/share/common-licenses/(?!GPL)\S,) {
my @depends;
if (defined $info->field('depends')) {
@depends = split(/\s*,\s*/, scalar $info->field('depends'));
}
if (defined $info->field('pre-depends')) {
push @depends,
split(/\s*,\s*/, scalar $info->field('pre-depends'));
}
if (any { /^libssl[0-9.]+(?:\s|\z)/ && !/\|/ } @depends) {
tag 'possible-gpl-code-linked-with-openssl';
}
}
}
return;
} #
# -----------------------------------
# Returns true if the package whose information is in $info depends $package
# or if $package is essential.
sub depends_on {
my ($info, $package) = @_;
return 1 if $KNOWN_ESSENTIAL->known($package);
return 1 if $info->relation('strong')->implies($package);
return 0;
}
# Checks cross pkg links for /usr/share/doc/$pkg links
sub check_cross_link {
my ($group, $fpkg) = @_;
my $src = $group->get_source_processable();
if ($src) {
# source package is available; check it's list of binary
return if defined $src->info->binary_package_type($fpkg);
tag 'usr-share-doc-symlink-to-foreign-package', $fpkg;
} else {
# The source package is not available, but the binary could
# be present anyway; If they are in the same group, they claim
# to have the same source (and source version)
foreach my $proc ($group->get_processables('binary')){
return if($proc->pkg_name eq $fpkg);
}
# It was not, but since the source package was not present, we cannot
# tell if it is foreign or not at this point.
#<<< No perltidy - tag name too long
tag 'cannot-check-whether-usr-share-doc-symlink-points-to-foreign-package';
#>>>
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/init.d.desc 0000664 0000000 0000000 00000035603 12310413144 014741 0 ustar Check-Script: init.d
Author: Christian Schwarz
Abbrev: ini
Type: binary
Info: Check if a binary package conforms to policy with respect to
scripts in /etc/init.d.
Needs-Info: init.d, bin-pkg-control
Tag: duplicate-updaterc.d-calls-in-postinst
Severity: important
Certainty: certain
Info: The postinst script calls update-rc.d several
times for the same /etc/init.d script.
Tag: output-of-updaterc.d-not-redirected-to-dev-null
Severity: wishlist
Certainty: certain
Info: The output messages of the update-rc.d command should be
redirected to /dev/null because it is currently very chatty
per default.
Tag: preinst-calls-updaterc.d
Severity: important
Certainty: certain
Info: The preinst package calls update-rc.d. Instead,
you should call it in the postinst script.
Ref: policy 9.3.3.1
Tag: duplicate-updaterc.d-calls-in-postrm
Severity: important
Certainty: certain
Info: The postrm script calls update-rc.d several
times for the same /etc/init.d script.
Tag: prerm-calls-updaterc.d
Severity: important
Certainty: certain
Info: The prerm package calls update-rc.d. Instead,
you should call it in the postrm script.
Ref: policy 9.3.3.1
Tag: postrm-does-not-call-updaterc.d-for-init.d-script
Severity: important
Certainty: certain
Info: An /etc/init.d script which has been registered in the
postinst script is not de-registered in the
postrm script.
Ref: policy 9.3.3.1
Tag: postrm-contains-additional-updaterc.d-calls
Severity: important
Certainty: certain
Info: The postrm de-registers an /etc/init.d script which
has not been registered in the postinst script before.
Tag: init.d-script-not-marked-as-conffile
Severity: important
Certainty: wild-guess
Ref: policy 9.3.2
Info: /etc/init.d scripts should be marked as conffiles.
.
This is usually an error, but the Policy allows for managing these files
manually in maintainer scripts and Lintian cannot reliably detect that.
Tag: init.d-script-does-not-implement-required-option
Severity: important
Certainty: certain
Ref: policy 9.3.2
Info: The /etc/init.d scripts have to support the following
command line arguments: start, stop, restart, force-reload.
Tag: init.d-script-does-not-implement-optional-option
Severity: wishlist
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: The /etc/init.d script does not implement the status
option. This is not required by the Policy, but often requested by
users.
Tag: init.d-script-not-included-in-package
Severity: important
Certainty: certain
Info: The /etc/init.d script is registered in the
postinst script, but is not included in the package.
Tag: script-in-etc-init.d-not-registered-via-update-rc.d
Severity: normal
Certainty: possible
Info: The package installs an /etc/init.d script which is
not registered in the postinst script. This is usually a bug,
unless you omit the links intentionally for some reason or create the
links some other way.
Tag: upstart-job-in-etc-init.d-not-registered-via-update-rc.d
Severity: normal
Certainty: possible
Info: The package installs an upstart-job in /etc/init.d
which is not registered in the postinst script. On
non-upstart systems this is usually a bug, unless you omit the links
intentionally for some reason or create the links some other way.
.
This tag should only be emitted for vendors that do not use upstart
by default (such as Debian). If this tag is emitted by a vendor
using upstart (e.g. Ubuntu), it may be a misconfiguration of their
Lintian vendor profile.
Tag: init.d-script-has-duplicate-lsb-section
Severity: important
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: This /etc/init.d script has more than one LSB keyword
section. These sections start with ### BEGIN INIT INFO and end
with ### END INIT INFO. There should be only one such section
per init script.
Tag: init.d-script-has-unterminated-lsb-section
Severity: important
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: This /etc/init.d script has an LSB keyword section starting
with ### BEGIN INIT INFO but either has no matching ### END
INIT INFO or has lines between those two markers that are not
comments. The line number given is the first line that doesn't look like
part of an LSB keyword section. There must be an end marker after all
the keyword settings and there must not be any lines between those
markers that do not begin with #.
Tag: init.d-script-has-duplicate-lsb-keyword
Severity: normal
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: The given keyword was set twice in the LSB keyword section in this
/etc/init.d script. This is probably a mistake; the behavior of
setting the same keyword twice is undefined.
Tag: init.d-script-has-unknown-lsb-keyword
Severity: minor
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: The given keyword was set in the LSB keyword section in this
/etc/init.d script but isn't one of the known LSB keywords and
doesn't begin with X-. One of the standard keywords may have
been misspelled.
Tag: init.d-script-has-bad-lsb-line
Severity: normal
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: This line in the LSB keyword section of an /etc/init.d
script doesn't match the required formatting of that section. Note that
keyword settings must start with #, a single space, the keyword,
a colon, and some whitespace, followed by the value (if any). Only the
Description keyword allows continuation lines, and continuation lines
must begin with # and either a tab or two or more spaces.
Tag: init.d-script-missing-lsb-section
Severity: normal
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: This /etc/init.d script does not have an LSB keyword
section (or the ### BEGIN INIT INFO tag is incorrect). This
section provides description and runlevel information in a standard
format and provides dependency information that can be used to
parallelize the boot process. Please consider adding it.
Tag: init.d-script-missing-lsb-keyword
Severity: normal
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: This /etc/init.d script has an LSB keyword section, but it
is missing the given required LSB keyword. If the value of this keyword
should be empty, please still include it in the LSB keyword section with
an empty value.
Tag: init.d-script-missing-lsb-short-description
Severity: wishlist
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: This /etc/init.d script has an LSB keyword section, but it
is missing a Short-Description LSB keyword. This field isn't directly
used currently, but adding it is still a good idea for documentation
purposes.
Tag: init.d-script-missing-lsb-description
Severity: wishlist
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: This /etc/init.d script has an LSB keyword section, but
it is missing a Description LSB keyword. This field isn't directly
used currently, but adding it is still a good idea for documentation
purposes.
Tag: init.d-script-has-bad-start-runlevel
Severity: normal
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: The given runlevel specified in the Default-Start keyword of the LSB
keyword section of this /etc/init.d script isn't one of the
recognized standard runlevels (S, 0, 1, 2, 3, 4, 5, and 6).
Tag: init.d-script-has-bad-stop-runlevel
Severity: normal
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: The given runlevel specified in the Default-Stop keyword of the LSB
keyword section of this /etc/init.d script isn't one of the
recognized standard runlevels (0, 1, 2, 3, 4, 5, and 6).
Tag: init.d-script-has-conflicting-start-stop
Severity: normal
Certainty: certain
Ref: http://wiki.debian.org/LSBInitScripts
Info: The given runlevel was included in both the Default-Start and
Default-Stop keywords of the LSB keyword section of this
/etc/init.d script. Since it doesn't make sense to both start
and stop a service in the same runlevel, there is probably an error in
one or the other of these keywords.
Tag: init-d-script-stops-in-s-runlevel
Severity: normal
Certainty: certain
Info: This /etc/init.d script specifies the S runlevel in
Default-Stop in its LSB keyword section. The S runlevel is not a real
runlevel and is only used during boot. There is no way to switch to it
and hence no use for stop scripts for it, so S should be removed from
Default-Stop.
Tag: init.d-script-uses-usr-interpreter
Severity: normal
Certainty: possible
Info: The given /etc/init.d script specifies an interpreter in
its shebang located under /usr. This means the init script will
fail if run at a point in the boot sequence before the /usr
partition has been mounted.
.
It also indicates that the init script may be using a non-essential
interpreter. Since init scripts are configuration files, they may be
left on the system after their package has been removed but not purged.
At that point, the package dependencies are not guaranteed to exist and
the interpreter may therefore not be available.
.
It's generally best to write init scripts using /bin/sh or
/bin/bash where possible, since they are guaranteed to always be
available.
Tag: init.d-script-sourcing-without-test
Severity: serious
Certainty: possible
Info: The given /etc/init.d script seems to be sourcing an
/etc/default/ file without checking for its existence first.
Files in /etc/default/ can be deleted by the administrator at
any time, and init scripts are required to handle the situation
gracefully.
Ref: policy 9.3.2
Tag: init.d-script-starts-in-stop-runlevel
Severity: serious
Certainty: certain
Info: This /etc/init.d script specifies the 0 or 6 runlevels in
Default-Start in its LSB keyword section. The 0 and 6 runlevels are
meant to only stop services, not to start them. Even if the init script
is doing something that isn't exactly stopping a service, the run-level
should be listed in Default-Stop, not Default-Start, and the script
should perform those actions when passed the stop argument.
Tag: init.d-script-provides-virtual-facility
Severity: normal
Certainty: certain
Info: This /etc/init.d script indicates in its LSB headers that
it provides a virtual facility, denoted by the dollar sign in front of
the name.
.
This is not the correct way to provide a virtual facility. Instead, the
package should include a file in /etc/insserv.conf.d, usually
named after the package, containing:
.
$virtual_facility_name +init-script-name
.
to declare that the named init script provides the named virtual
facility.
Ref: http://wiki.debian.org/LSBInitScripts/DebianVirtualFacilities
Tag: init.d-script-does-not-provide-itself
Severity: minor
Certainty: possible
Info: This /etc/init.d script indicates it provides one or
more facilities, but none of the provided facilities match the name of
the init script. In certain cases, it may be necessary to not follow
that convention, but normally init scripts should always provide a
facility matching the name of the init script.
Ref: http://wiki.debian.org/LSBInitScripts
Tag: init.d-script-should-depend-on-virtual-facility
Severity: important
Certainty: possible
Info: The given /etc/init.d script depends on a non-virtual
facility that should probably be replaced by a virtual facility. For
example, init scripts should depend on the virtual facility
$network rather than the facility networking, and the
virtual facility $named rather than the specific facility
bind9.
.
Properly using virtual facilities allows multiple implementations of the
same facility and accommodates systems where that specific facility may
not be enough to provide everything the script expects.
Tag: init.d-script-possible-missing-stop
Severity: normal
Certainty: possible
Info: The given /etc/init.d script indicates it should be
stopped at one of the runlevels 0, 1, or 6 but not at all of them.
This is usually a mistake. Normally, facilities that need to be stopped
at any of those runlevels need to be stopped at all of them.
.
For example, if it is safe for the facility provided by this init script
to be stopped by sendsigs at runlevels 0 and 6, there should be
no reason to special case runlevel 1, where killprocs would
stop it. If the facility needs special shutdown handling when rebooting
the system (runlevel 6), it probably needs the same handling when
halting the system (runlevel 0) or switching to single-user mode
(runlevel 1).
Tag: init.d-script-missing-start
Severity: normal
Certainty: certain
Info: The given /etc/init.d script indicates it should be
started at one of the runlevels 2-5 but not at all of them. This is a
mistake. The system administrators should be given the opportunity to
customize the runlevels at their will.
Ref: policy 9.3.3.1
Tag: init.d-script-missing-dependency-on-remote_fs
Severity: important
Certainty: possible
Info: The given init script seems to refer to /usr, possibly
using a file or binary from there. Without a dependency on
$remote_fs in Required-Start or Required-Stop, as appropriate,
the init script might be run before /usr is mounted or after
it's unmounted.
.
Using Should-Start or Should-Stop to declare the dependency is
conceptually incorrect since the $remote_fs facility is always
available. Required-Start or Required-Stop should be used instead.
Also, please note that $all should not be used in Required-Stop, only
Required-Start.
Ref: http://wiki.debian.org/LSBInitScripts
Tag: init.d-script-missing-dependency-on-local_fs
Severity: important
Certainty: possible
Info: The given init script seems to refer to /var, possibly
using a file from there. Without a dependency on $local_fs in
Required-Start or Required-Stop, as appropriate, the init script might be
run before /var is mounted or after it's unmounted.
.
Using Should-Start or Should-Stop to declare the dependency is
conceptually incorrect since the $local_fs facility is always
available. Required-Start or Required-Stop should be used instead.
Ref: http://wiki.debian.org/LSBInitScripts
Tag: init.d-script-depends-on-unknown-virtual-facility
Severity: serious
Certainty: possible
Info: The given init script declares a dependency on a virtual facility
that is not known to be provided by any init.d script in the archive.
If the dependency can not be satisfied upon the package's
installation, insserv will refuse the activation of the init.d script.
Ref: http://wiki.debian.org/LSBInitScripts
lintian-2.5.22ubuntu1/checks/systemd.pm 0000664 0000000 0000000 00000020115 12311317622 014737 0 ustar # systemd -- lintian check script -*- perl -*-
#
# Copyright © 2013 Michael Stapelberg
#
# based on the apache2 checks file by:
# Copyright © 2012 Arno Töll
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::systemd;
use strict;
use warnings;
use autodie;
use File::Basename;
use List::MoreUtils qw(any);
use Text::ParseWords qw(shellwords);
use Lintian::Tags qw(tag);
use Lintian::Util qw(
fail is_ancestor_of normalize_pkg_path lstrip rstrip
);
sub run {
my (undef, undef, $info) = @_;
# Figure out whether the maintainer of this package did any effort to
# make the package work with systemd. If not, we will not warn in case
# of an init script that has no systemd equivalent, for example.
my $ships_systemd_file = any { m,/systemd/, } $info->sorted_index;
# An array of names which are provided by the service files.
# This includes Alias= directives, so after parsing
# NetworkManager.service, it will contain NetworkManager and
# network-manager.
my @systemd_targets;
for my $file ($info->sorted_index) {
if ($file =~ m,^etc/tmpfiles\.d/.*\.conf$,) {
tag 'systemd-tmpfiles.d-outside-usr-lib', $file;
}
if ($file =~ m,^etc/systemd/system/.*\.service$,) {
tag 'systemd-service-file-outside-lib', $file;
}
if ($file =~ m,/systemd/system/.*\.service$,) {
check_systemd_service_file($info, $file);
for my $name (extract_service_file_names($info, $file)) {
push @systemd_targets, $name;
}
}
}
my @init_scripts = grep { m,^etc/init\.d/.+, } $info->sorted_index;
# Verify that each init script includes /lib/lsb/init-functions,
# because that is where the systemd diversion happens.
for my $init_script (@init_scripts) {
check_init_script($info, $init_script);
}
@init_scripts = map { basename($_) } @init_scripts;
if ($ships_systemd_file) {
for my $init_script (@init_scripts) {
tag 'systemd-no-service-for-init-script', $init_script
unless any { m/\Q$init_script\E\.service/ } @systemd_targets;
}
}
check_maintainer_scripts($info);
return;
}
sub check_init_script {
my ($info, $file) = @_;
my $basename = $file->basename;
my $lsb_source_seen;
# Couple of special cases we don't care about...
return
if $basename eq 'README'
or $basename eq 'skeleton'
or $basename eq 'rc'
or $basename eq 'rcS';
my $unpacked_file = $info->unpacked($file);
if ($file->is_symlink) {
# We cannot test upstart-jobs
return if $file->link eq '/lib/init/upstart-job';
}
if (!$file->is_regular_file) {
unless (-f $unpacked_file
&& is_ancestor_of($info->unpacked, $unpacked_file)) {
tag 'init-script-is-not-a-file', $file;
return;
}
}
open(my $fh, '<', $unpacked_file);
while (<$fh>) {
lstrip;
next if /^#/;
if (m,^(?:\.|source)\s+/lib/lsb/init-functions,) {
$lsb_source_seen = 1;
last;
}
}
close($fh);
if (!$lsb_source_seen) {
tag 'init.d-script-does-not-source-init-functions', $file;
}
return;
}
sub check_systemd_service_file {
my ($info, $file) = @_;
my @values = extract_service_file_values($info, $file, 'Unit', 'After');
my @obsolete = grep { /^(?:syslog|dbus)\.target$/ } @values;
tag 'systemd-service-file-refers-to-obsolete-target', $file, $_
for @obsolete;
return;
}
sub service_file_lines {
my ($path) = @_;
my @lines;
my $continuation;
open(my $fh, '<', $path);
while (<$fh>) {
chomp;
if (defined($continuation)) {
$_ = $continuation . $_;
$continuation = undef;
}
if (/\\$/) {
$continuation = $_;
$continuation =~ s/\\$/ /;
next;
}
rstrip;
next if $_ eq '';
next if /^[#;\n]/;
push @lines, $_;
}
close($fh);
return @lines;
}
# Extracts the values of a specific Key from a .service file
sub extract_service_file_values {
my ($info, $file, $extract_section, $extract_key) = @_;
my @values;
my $section;
my $unpacked_file = $info->unpacked($file);
unless (
(-f $unpacked_file&& is_ancestor_of($info->unpacked, $unpacked_file))
|| ($file->is_symlink && $file->link eq '/dev/null')) {
tag 'service-file-is-not-a-file', $file;
return;
}
my @lines = service_file_lines($unpacked_file);
if (any { /^\.include / } @lines) {
@lines = map {
if (/^\.include (.+)$/) {
my $path = $1;
my $normalized;
my $included;
if ($path =~ s,^/,,) {
$normalized = normalize_pkg_path('/', $path);
} else {
$normalized = normalize_pkg_path($file->dirname, $path);
}
$included = $info->unpacked($normalized)
if defined($normalized);
if ( defined($included)
&& -f $included
&& is_ancestor_of($info->unpacked, $included)) {
service_file_lines($included);
} else {
# doesn't exist, exists but not a file or "out-of-bounds"
$_;
}
} else {
$_;
}
} @lines;
}
for (@lines) {
# section header
if (/^\[([^\]]+)\]$/) {
$section = $1;
next;
}
if (!defined($section)) {
# Assignment outside of section. Ignoring.
next;
}
my ($key, $value) = ($_ =~ m,^(.*)\s*=\s*(.*)$,);
if ( $section eq $extract_section
&& $key eq $extract_key) {
if ($value eq '') {
# Empty assignment resets the list
@values = ();
} else {
push(@values, shellwords($value));
}
}
}
return @values;
}
sub extract_service_file_names {
my ($info, $file) = @_;
my @aliases= extract_service_file_values($info, $file, 'Install', 'Alias');
return (basename($file), @aliases);
}
sub check_maintainer_scripts {
my ($info) = @_;
open(my $fd, '<', $info->lab_data_path('control-scripts'));
while (<$fd>) {
m/^(\S*) (.*)$/ or fail("bad line in control-scripts file: $_");
my $interpreter = $1;
my $file = $2;
my $filename = $info->control($file);
# Don't follow links
next if -l $filename;
# Don't try to parse the file if it does not appear to be a
# shell script
next if $interpreter !~ m/sh\b/;
open(my $sfd, '<', $filename);
while (<$sfd>) {
# skip comments
next if substr($_, 0, $-[0]) =~ /#/;
# systemctl should not be called in maintainer scripts at all,
# except for systemctl --daemon-reload calls.
if (m/^(?:.+;)?\s*systemctl\b/ && !/daemon-reload/) {
tag 'maintainer-script-calls-systemctl', "$file:$.";
}
}
close($sfd);
}
close($fd);
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/symlinks.pm 0000664 0000000 0000000 00000010152 12311317622 015120 0 ustar # symlinks -- lintian check script -*- perl -*-
#
# Copyright (C) 2011 Niels Thykier
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::symlinks;
use strict;
use warnings;
use autodie;
use File::Basename qw(dirname);
use Lintian::Tags qw(tag);
use Lintian::Data;
my $WELL_KNOWN_SYMLINKS_TARGET = Lintian::Data->new(
'symlinks/well-known-symlinks-target',
qr/\s*\~\~\s*/,
sub {
return qr/$_[0]/x;
});
sub run {
my ($pkg, undef, $info, $proc, $group) = @_;
my $ginfo = $group->info;
my (@brokenlinks, @dindexes);
FILE:
foreach my $file ($info->sorted_index) {
if ($file->is_symlink){
my $target = $file->link//''; # the link target
my $path; # the target (from the pkg root)
# Should not happen (too often) - but just in case
next unless $target;
$path = $file->link_normalized;
if (not defined $path) {
# Unresolvable link
tag 'package-contains-unsafe-symlink', $file;
next;
}
# Links to the package root is always going to exist (although
# self-recursive and possibly not very useful)
next if $path eq '';
# Skip usr/share/doc/ - we got a separate check for
# that.
next if $file eq "usr/share/doc/$pkg";
# Check if the destination is in the package itself
next if $info->index($path) || $info->index("$path/");
$target =~ s,^/++,,o; # strip leading slashes (for reporting)
# Ignore links pointing to common things that may exist
# even if they are not shipped by any binary from this
# source package.
foreach my $wellknowntarget ($WELL_KNOWN_SYMLINKS_TARGET->all) {
my $regex
= $WELL_KNOWN_SYMLINKS_TARGET->value($wellknowntarget);
if($path =~ m{$regex}) {
next FILE;
}
}
# Skip langpack links (used in Ubuntu) - after we check that
# it appears to be consistent.
if ($path =~ m,/([^/]+)-langpack/,o) {
my $pre = $1;
my $t = $path;
$t =~ s,/\Q$pre\E-langpack/,/help/,;
next if $t eq $file;
}
# Possibly broken symlink
push @brokenlinks, [$file, $path, $target]
unless $info->index($path);
}
}
return unless @brokenlinks;
# Check our dependencies:
foreach my $depproc (@{ $ginfo->direct_dependencies($proc)}) {
push @dindexes, $depproc->info;
}
BLINK:
foreach my $blink (@brokenlinks){
my ($file, $path, $target) = @$blink;
foreach my $dinfo (@dindexes){
# Is it in our dependency?
next BLINK if $dinfo->index($path) || $dinfo->index("$path/");
}
# nope - not found in any of our direct dependencies.
if ($target =~ m/\*/) {
# If it contains a "*" it probably a bad ln -s target/*.so link
# expansion.
tag 'package-contains-broken-symlink-wildcard', $file, $target;
} else {
tag 'package-contains-broken-symlink', $file, $target;
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/description.desc 0000664 0000000 0000000 00000016565 12153060143 016107 0 ustar Check-Script: description
Author: Christian Schwarz
Abbrev: des
Type: binary, udeb
Info: Check if the Description control field of a binary package conforms
to the rules in the Policy Manual (section 3.4).
Tag: package-has-no-description
Severity: serious
Certainty: certain
Info: The binary package does not have a "Description:" control field.
Tested: empty
Ref: policy 3.4
Tag: description-synopsis-is-empty
Severity: serious
Certainty: certain
Info: The first line in the "Description:" is empty.
Ref: policy 3.4
Tag: extended-description-contains-empty-paragraph
Severity: normal
Certainty: certain
Info: The extended description (the lines after the first line of the
"Description:" field) contains an empty paragraph.
Tag: extended-description-is-empty
Severity: serious
Certainty: certain
Info: The extended description (the lines after the first line of the
"Description:" field) is empty.
Ref: policy 3.4
Tag: extended-description-is-probably-too-short
Severity: minor
Certainty: possible
Ref: devref 6.2.1, devref 6.2.3
Info: The extended description (the lines after the first line of the
"Description:" field) is only one or two lines long. The extended
description should provide a user with enough information to decide
whether they want to install this package, what it contains, and how it
compares to similar packages. One or two lines is normally not enough to
do this.
Tag: description-contains-invalid-control-statement
Severity: serious
Certainty: certain
Info: The description contains a line starting with a dot (.). This is
not allowed.
Ref: policy 5.6.13
Tag: description-too-long
Severity: minor
Certainty: certain
Info: The first line of the "Description:" must not exceed 80 characters.
Ref: policy 3.4.1
Tag: description-starts-with-package-name
Severity: important
Certainty: certain
Info: The first line of the "Description:" should not start with the
package name. For example, the package foo should not
have a description like this: "foo is a program that...".
Ref: policy 3.4.1
Tag: description-synopsis-starts-with-article
Severity: minor
Certainty: certain
Info: The first line of the "Description:" should omit any initial indefinite
or definite article: "a", "an", or "the". A good heuristic is that it should
be possible to substitute the package name and synopsis
into this formula:
.
The package name provides {a,an,the,some} synopsis.
Ref: devref 6.2.2
Tag: description-contains-tabs
Severity: important
Certainty: certain
Info: The package "Description:" must not contain tab characters.
Ref: policy 5.6.13
Tag: description-starts-with-leading-spaces
Severity: normal
Certainty: possible
Info: The package "Description:" starts with leading spaces. Usually,
leading spaces are used to switch "verbatim display" on (i.e., lines
are not wrapped) so this might be a bug in the package.
Tag: possible-unindented-list-in-extended-description
Severity: normal
Certainty: possible
Info: The package "Description:" contains an unindented line which
starts with a dash (-) or asterisk (*). If this was meant to be a
list of items these lines need to be indented (dselect would
word-wrap these lines otherwise).
Ref: policy 5.6.13
Tag: description-is-debmake-template
Severity: important
Certainty: certain
Info: The synopsis or the extended description just says "Missing",
which is a template provided by debmake.
Tag: description-is-dh_make-template
Severity: serious
Certainty: certain
Info: The synopsis or the extended description has not been changed
from the template provided by dh_make.
Tag: description-contains-dh-make-perl-template
Severity: normal
Certainty: certain
Info: The extended description contains the statement that it was
automagically extracted by dh-make-perl. Please check the description
for correctness and usefulness and remove the dh-make-perl statement
to signal that you have done so.
Tag: description-synopsis-might-not-be-phrased-properly
Severity: minor
Certainty: possible
Info: The synopsis (first line in the package "Description:" field, the
short description) ends with a full stop "." character. This is not
necessary, as the synopsis doesn't need to be a full sentence. It is
recommended that a descriptive phrase is used instead.
.
Note also that the synopsis is not part of the rest of the "Description:"
field.
Ref: devref 6.2.2
Tag: description-synopsis-is-duplicated
Severity: important
Certainty: certain
Info: The first line of the extended Description: should not repeat the
synopsis exactly. This indicates that either the synopsis is badly formed
or that the extended description has been wrongly copied and pasted.
Ref: policy 3.4.2
Tag: extended-description-line-too-long
Severity: normal
Certainty: certain
Info: One or more lines in the extended part of the "Description:" field
have been found to contain more than 80 characters. For the benefit of
users of 80x25 terminals, it is recommended that the lines do not exceed
80 characters.
Ref: policy 3.4.1
Tag: description-contains-homepage
Severity: normal
Certainty: certain
Info: The extended description contains a "Homepage:" pseudo-header
following the old Developer's Reference recommendation. As of 1.14.6,
dpkg now supports Homepage: as a regular field in
debian/control. This header should be moved from the extended
description to the fields for the relevant source or binary packages.
Tag: spelling-error-in-description
Severity: minor
Certainty: certain
Info: Lintian found a spelling error in the package description. Lintian
has a list of common misspellings that it looks for. It does not have a
dictionary like a spelling checker does. It is particularly picky about
spelling and capitalization in package descriptions since they're very
visible to end users.
Tag: capitalization-error-in-description
Severity: minor
Certainty: wild-guess
Info: Lintian found a possible capitalization error in the package
description. Lintian has a list of common capitalization errors,
primarily of upstream projects, that it looks for. It does not have a
dictionary like a spelling checker does.
.
This is a particularly picky check of capitalization in package
descriptions, since they're very visible to end users, but it will have
false positives for project names used in a context where they should be
lowercase, such as package names or executable names.
Tag: description-contains-duplicated-word
Severity: normal
Certainty: possible
Info: The description contains a duplicated word. Usually this is a
mistake, or at least an awkward phrasing.
Tag: using-first-person-in-description
Severity: minor
Certainty: possible
Info: You should avoid the use of first person ("I will do this..." or
"We recommend..."). The computer is not a person and the description
does not speak for the maintainer or maintainers. Instead, use a more
neutral construction and try to rephrase into factual statements about
the package.
.
For example, rather than saying "I don't recommend this package if you
are short on memory," say something like "this package is not suitable
for low-memory systems."
Tag: description-possibly-contains-homepage
Severity: wishlist
Certainty: wild-guess
Info: This package has no Homepage field but has a URL in the description
and wording that might indicate this is the package Homepage. If it is,
add a Homepage control field containing it rather than mentioning it in
the package description.
lintian-2.5.22ubuntu1/checks/debconf.pm 0000664 0000000 0000000 00000052461 12311317602 014656 0 ustar # debconf -- lintian check script -*- perl -*-
# Copyright (C) 2001 Colin Watson
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::debconf;
use strict;
use warnings;
use autodie;
use Lintian::Relation;
use Lintian::Tags qw(tag);
use Lintian::Util qw(read_dpkg_control :constants $PKGNAME_REGEX);
# From debconf-devel(7), section 'THE TEMPLATES FILE', up to date with debconf
# version 1.5.24. Added indices for cdebconf (indicates sort order for
# choices); debconf doesn't support it, but it ignores it, which is safe
# behavior. Likewise, help is supported as of cdebconf 0.143 but is not yet
# supported by debconf.
my %template_fields
= map { $_ => 1 } qw(template type choices indices default description help);
# From debconf-devel(7), section 'THE TEMPLATES FILE', up to date with debconf
# version 1.5.24.
my %valid_types = map { $_ => 1 } qw(
string
password
boolean
select
multiselect
note
error
title
text);
# From debconf-devel(7), section 'THE DEBCONF PROTOCOL' under 'INPUT', up to
# date with debconf version 1.5.24.
my %valid_priorities = map { $_ => 1 } qw(low medium high critical);
# All the packages that provide debconf functionality. Anything using debconf
# needs to have dependencies that satisfy one of these.
my $ANY_DEBCONF = Lintian::Relation->new(
join(
' | ', qw(debconf debconf-2.0 cdebconf
cdebconf-udeb libdebconfclient0 libdebconfclient0-udeb)
));
sub run {
my ($pkg, $type, $info) = @_;
my ($seenconfig, $seentemplates, $usespreinst);
if ($type eq 'source') {
my @binaries = $info->binaries;
my @files = map { "$_.templates" } @binaries;
push @files, 'templates';
foreach my $file (@files) {
my $templates_file = $info->debfiles($file);
my $binary = $file;
$binary =~ s/\.?templates$//;
# Single binary package (so @files contains "templates" and
# "binary.templates")?
if (!$binary && @files == 2) {
$binary = $binaries[0];
}
if (-f $templates_file) {
my @templates;
eval {
@templates
= read_dpkg_control($templates_file,
DCTRL_DEBCONF_TEMPLATE);
};
if ($@) {
chomp $@;
$@ =~ s/^internal error: //;
$@ =~ s/^syntax error in //;
tag 'syntax-error-in-debconf-template', "$file: $@";
next;
}
foreach my $template (@templates) {
if ( exists $template->{template}
and exists $template->{_choices}) {
tag 'template-uses-unsplit-choices',
"$binary - $template->{template}";
}
}
}
}
# The remainder of the checks are for binary packages, so we exit now
return;
}
my $preinst = $info->control('preinst');
my $ctrl_config = $info->control('config');
my $ctrl_templates = $info->control('templates');
if (-f $preinst and not -l $preinst) {
open(my $fd, '<', $preinst);
while (<$fd>) {
s/\#.*//; # Not perfect for Perl, but should be OK
if ( m,/usr/share/debconf/confmodule,
or m/(?:Debconf|Debian::DebConf)::Client::ConfModule/) {
$usespreinst=1;
last;
}
}
close($fd);
}
$seenconfig = 1 if -f $ctrl_config and not -l $ctrl_config;
$seentemplates = 1 if -f $ctrl_templates and not -l $ctrl_templates;
# This still misses packages that use debconf only in the postrm.
# Packages that ask debconf questions in the postrm should load
# the confmodule in the postinst so that debconf can register
# their templates.
return unless $seenconfig or $seentemplates or $usespreinst;
# parse depends info for later checks
# Consider every package to depend on itself.
my $selfrel;
if (defined $info->field('version')) {
$_ = $info->field('version');
$selfrel = "$pkg (= $_)";
} else {
$selfrel = "$pkg";
}
# Include self and provides as a package providing debconf presumably
# satisfies its own use of debconf (if any).
my $selfrelation
= Lintian::Relation->and($info->relation('provides'), $selfrel);
my $alldependencies
= Lintian::Relation->and($info->relation('strong'), $selfrelation);
# See if the package depends on dbconfig-common. Packages that do
# are allowed to have a config file with no templates, since they
# use the dbconfig-common templates.
my $usesdbconfig = $alldependencies->implies('dbconfig-common');
# Check that both debconf control area files are present.
if ($seenconfig and not $seentemplates and not $usesdbconfig) {
tag 'no-debconf-templates';
} elsif ($seentemplates
and not $seenconfig
and not $usespreinst
and $type ne 'udeb') {
tag 'no-debconf-config';
}
# $seenconfig will be false if $ctrl_config is a symlink or if it was
# not a file, so we do not have to check with -f/-l here again.
if ($seenconfig and not -x $ctrl_config) {
tag 'debconf-config-not-executable';
}
# Lots of template checks.
my (@templates, %potential_db_abuse, @templates_seen);
if ($seentemplates) {
eval {
# $seentemplates (above) will be false if $ctrl_templates is a
# symlink or not a file, so this should be safe without
# (re-checking) with -f/-l.
@templates
= read_dpkg_control($ctrl_templates, DCTRL_DEBCONF_TEMPLATE);
};
if ($@) {
chomp $@;
$@ =~ s/^internal error: //;
$@ =~ s/^syntax error in //;
tag 'syntax-error-in-debconf-template', "templates: $@";
@templates = ();
}
}
foreach my $template (@templates) {
my $isselect = '';
if (not exists $template->{template}) {
tag 'no-template-name';
$template->{template} = 'no-template-name';
} else {
push @templates_seen, $template->{template};
if ($template->{template}!~m|[A-Za-z0-9.+-](?:/[A-Za-z0-9.+-])|) {
tag 'malformed-template-name', "$template->{template}";
}
}
if (not exists $template->{type}) {
tag 'no-template-type', "$template->{template}";
} elsif (not $valid_types{$template->{type}}) {
tag 'unknown-template-type', "$template->{type}";
} elsif ($template->{type} eq 'select') {
$isselect = 1;
} elsif ($template->{type} eq 'multiselect') {
$isselect = 1;
} elsif ($template->{type} eq 'boolean') {
tag 'boolean-template-has-bogus-default',
"$template->{template} $template->{default}"
if defined $template->{default}
and $template->{default} ne 'true'
and $template->{default} ne 'false';
}
if ($template->{choices} && ($template->{choices} !~ /^\s*$/)) {
my $nrchoices = count_choices($template->{choices});
for my $key (keys %$template) {
if ($key =~ /^choices-/) {
if (!$template->{$key} || ($template->{$key} =~ /^\s*$/o)){
tag 'empty-translated-choices',
"$template->{template} $key";
}
if (count_choices($template->{$key}) != $nrchoices) {
tag 'mismatch-translated-choices',
"$template->{template} $key";
}
}
}
if ($template->{choices} =~ /^\s*(yes\s*,\s*no|no\s*,\s*yes)\s*$/i)
{
tag 'select-with-boolean-choices', "$template->{template}";
}
}
if ($isselect and not exists $template->{choices}) {
tag 'select-without-choices', "$template->{template}";
}
if (not exists $template->{description}) {
tag 'no-template-description', "$template->{template}";
} elsif ($template->{description}=~m/^\s*(.*?)\s*?\n\s*\1\s*$/) {
# Check for duplication. Should all this be folded into the
# description checks?
tag 'duplicate-long-description-in-template',
"$template->{template}";
}
my %languages;
foreach my $field (sort keys %$template) {
# Tests on translations
my ($mainfield, $lang) = split m/-/, $field, 2;
if (defined $lang) {
$languages{$lang}{$mainfield}=1;
}
unless ($template_fields{$mainfield}){ # Ignore language codes here
tag 'unknown-field-in-templates',
"$template->{template} $field";
}
}
if ($template->{template} && $template->{type}) {
$potential_db_abuse{$template->{template}} = 1
if ( ($template->{type} eq 'note')
or ($template->{type} eq 'text'));
}
# Check the description against the best practices in the
# Developer's Reference, but skip all templates where the
# short description contains the string "for internal use".
my ($short, $extended);
if (defined $template->{description}) {
($short, $extended) = split(/\n/, $template->{description}, 2);
unless (defined $short) {
$short = $template->{description};
$extended = '';
}
} else {
($short, $extended) = ('', '');
}
my $ttype = $template->{type} || '';
unless ($short =~ /for internal use/i) {
my $isprompt = grep { $_ eq $ttype } qw(string password);
if ($isprompt) {
if (
$short
&& ( $short !~ m/:$/
|| $short =~ m/^(what|who|when|where|which|how)/i)
) {
tag 'malformed-prompt-in-templates', $template->{template};
}
}
if ($isselect) {
if ($short =~ /^(Please|Cho+se|Enter|Select|Specify|Give)/) {
tag 'using-imperative-form-in-templates',
$template->{template};
}
}
if ($ttype eq 'boolean') {
if ($short !~ /\?/) {
tag 'malformed-question-in-templates',
$template->{template};
}
}
if (defined($extended) && $extended =~ /[^\?]\?(\s+|$)/) {
tag 'using-question-in-extended-description-in-templates',
$template->{template};
}
if ($ttype eq 'note') {
if ($short =~ /[.?;:]$/) {
tag 'malformed-title-in-templates', $template->{template};
}
}
if (length($short) > 75) {
tag 'too-long-short-description-in-templates',
$template->{template}
unless $type eq 'udeb' && $ttype eq 'text';
}
if (defined $template->{description}) {
if ($template->{description}
=~ /(\A|\s)(I|[Mm]y|[Ww]e|[Oo]ur|[Oo]urs|mine|myself|ourself|me|us)(\Z|\s)/
) {
tag 'using-first-person-in-templates',
$template->{template};
}
if ( $template->{description} =~ /[ \'\"]yes[ \'\",;.]/i
and $ttype eq 'boolean') {
tag 'making-assumptions-about-interfaces-in-templates',
$template->{template};
}
}
# Check whether the extended description is too long.
if ($extended) {
my $lines = 0;
for my $string (split("\n", $extended)) {
while (length($string) > 80) {
my $pos = rindex($string, ' ', 80);
if ($pos == -1) {
$pos = index($string, ' ');
}
if ($pos == -1) {
$string = '';
} else {
$string = substr($string, $pos + 1);
$lines++;
}
}
$lines++;
}
if ($lines > 20) {
tag 'too-long-extended-description-in-templates',
$template->{template};
}
}
}
}
# Check the maintainer scripts.
my ($config_calls_db_input, $db_purge);
my (%templates_used, %template_aliases);
for my $file (qw(config prerm postrm preinst postinst)) {
my $potential_makedev = {};
my $path = $info->control($file);
if (-f $path and not -l $path) {
my $usesconfmodule='';
my $obsoleteconfmodule='';
my $db_input='';
my $isdefault='';
my $usesseen='';
open(my $fd, '<', $path);
# Only check scripts.
my $fl = <$fd>;
unless ($fl && $fl =~ /^\#!/) {
close($fd);
next;
}
while (<$fd>) {
s/#.*//; # Not perfect for Perl, but should be OK
next unless m/\S/;
while (s%\\$%%) {
my $next = <$fd>;
last unless $next;
$_ .= $next;
}
if ( m,(?:\.|source)\s+/usr/share/debconf/confmodule,
|| m/(?:use|require)\s+Debconf::Client::ConfModule/) {
$usesconfmodule=1;
}
if (
not $obsoleteconfmodule
and m,(/usr/share/debconf/confmodule\.sh|
Debian::DebConf::Client::ConfModule),x
) {
my $cmod = $1;
tag 'loads-obsolete-confmodule', "$file:$. $cmod";
$usesconfmodule = 1;
$obsoleteconfmodule = 1;
}
if ($file eq 'config' and m/db_input/) {
$config_calls_db_input = 1;
}
if ( $file eq 'postinst'
and not $db_input
and m/db_input/
and not $config_calls_db_input) {
# TODO: Perl?
tag 'postinst-uses-db-input'
unless $type eq 'udeb';
$db_input=1;
}
if (m%/dev/%) {
$potential_makedev->{$.} = 1;
}
if (
m/\A \s*(?:db_input|db_text)\s+
[\"\']? (\S+?) [\"\']? \s+ (\S+)\s/xsm
) {
my ($priority, $template) = ($1, $2);
$templates_used{$template} = 1;
if ($priority !~ /^\$\S+$/) {
tag 'unknown-debconf-priority', "$file:$. $1"
unless ($valid_priorities{$priority});
tag 'possible-debconf-note-abuse',
"$file:$. $template"
if (
$potential_db_abuse{$template}
and (
not($potential_makedev->{($. - 1)}
and ($priority eq 'low')))
and ($priority =~ /^(low|medium)$/));
}
}
if (
m/ \A \s* (?:db_get|db_set(?:title)?) \s+
[\"\']? (\S+?) [\"\']? (?:\s|\Z)/xsm
) {
$templates_used{$1} = 1;
}
# Try to handle Perl somewhat.
if ( m/^\s*(?:.*=\s*get|set)\s*\(\s*[\"\'](\S+?)[\"\']/
|| m/\b(?:metaget|settitle)\s*\(\s*[\"\'](\S+?)[\"\']/) {
$templates_used{$1} = 1;
}
if (m/^\s*db_register\s+[\"\']?(\S+?)[\"\']?\s+(\S+)\s/) {
my ($template, $question) = ($1, $2);
push @{$template_aliases{$template}}, $question;
}
if (not $isdefault and m/db_fset.*isdefault/) {
# TODO: Perl?
tag 'isdefault-flag-is-deprecated', $file;
$isdefault = 1;
}
if (not $db_purge and m/db_purge/) { # TODO: Perl?
$db_purge = 1;
}
}
if ($file eq 'postinst' or $file eq 'config') {
unless ($usesconfmodule) {
tag "$file-does-not-load-confmodule"
unless ($type eq 'udeb'
|| ($file eq 'postinst' && !$seenconfig));
}
}
if ($file eq 'postrm') {
# If we haven't seen db_purge we emit the tag unless the
# package is a debconf provider (in which case db_purge
# won't be available)
unless ($db_purge or $selfrelation->implies($ANY_DEBCONF)) {
tag 'postrm-does-not-purge-debconf';
}
}
close($fd);
} elsif ($file eq 'postinst') {
tag 'postinst-does-not-load-confmodule'
unless ($type eq 'udeb' || !$seenconfig);
} elsif ($file eq 'postrm') {
# Make an exception for debconf providing packages as some of
# them (incl. "debconf" itself) cleans up in prerm and have no
# postrm script at all.
tag 'postrm-does-not-purge-debconf'
unless $type eq 'udeb'
or $selfrelation->implies($ANY_DEBCONF);
}
}
foreach my $template (@templates_seen) {
$template =~ s/\s+\Z//;
my $used = 0;
if ($templates_used{$template}) {
$used = 1;
} else {
foreach my $alias (@{$template_aliases{$template}}) {
if ($templates_used{$alias}) {
$used = 1;
last;
}
}
}
unless ($used or $pkg eq 'debconf' or $type eq 'udeb') {
tag 'unused-debconf-template', $template
unless $template =~ m,^shared/packages-(wordlist|ispell)$,
or $template =~ m,/languages$,;
}
}
# Check that the right dependencies are in the control file. Accept any
# package that might provide debconf functionality.
if ($usespreinst) {
unless ($info->relation('pre-depends')->implies($ANY_DEBCONF)) {
tag 'missing-debconf-dependency-for-preinst'
unless $type eq 'udeb';
}
} else {
unless ($alldependencies->implies($ANY_DEBCONF) or $usesdbconfig) {
tag 'missing-debconf-dependency';
}
}
# Now make sure that no scripts are using debconf as a registry.
# Unfortunately this requires us to unpack to level 2 and grep all the
# scripts in the package.
# the following checks is ignored if the package being checked is debconf
# itself.
return if ($pkg eq 'debconf') || ($type eq 'udeb');
foreach my $filename (sort keys %{$info->scripts}) {
open(my $fd, '<', $info->unpacked($filename));
while (<$fd>) {
s/#.*//; # Not perfect for Perl, but should be OK
if ( m,/usr/share/debconf/confmodule,
or m/(?:Debconf|Debian::DebConf)::Client::ConfModule/) {
tag 'debconf-is-not-a-registry', $filename;
last;
}
}
close($fd);
}
return;
} #
# -----------------------------------
# Count the number of choices. Splitting code copied from debconf 1.5.8
# (Debconf::Question).
sub count_choices {
my ($choices) = @_;
my @items;
my $item = '';
for my $chunk (split /(\\[, ]|,\s+)/, $choices) {
if ($chunk =~ /^\\([, ])$/) {
$item .= $1;
} elsif ($chunk =~ /^,\s+$/) {
push(@items, $item);
$item = '';
} else {
$item .= $chunk;
}
}
push(@items, $item) if $item ne '';
return scalar(@items);
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/shared-libs.desc 0000664 0000000 0000000 00000042547 12310413144 015756 0 ustar Check-Script: shared-libs
Author: Christian Schwarz
Abbrev: shl
Type: binary, udeb
Needs-Info: unpacked, file-info, objdump-info, bin-pkg-control, index
Info: This script checks if a binary package conforms to shared library policy.
Tag: shlib-with-executable-bit
Severity: important
Certainty: certain
Info: Shared libraries should be mode 0644.
Ref: policy 8.1
Tag: shlib-with-bad-permissions
Severity: normal
Certainty: certain
Info: Shared libraries should be mode 0644.
Ref: policy 8.1
Tag: shlib-with-non-pic-code
Severity: serious
Certainty: possible
Ref: policy 10.2
Info: The listed shared libraries contain object code that was compiled
without -fPIC. All object code in shared libraries should be recompiled
separately from the static libraries with the -fPIC option.
.
Another common mistake that causes this problem is linking with
gcc -Wl,-shared instead of gcc -shared.
.
In some cases, exceptions to this rule are warranted. If this is such a
case, follow the procedure outlined in Policy and then please document
the exception by adding a lintian override to this package.
.
To check whether a shared library has this problem, run readelf
-d on the shared library. If a tag of type TEXTREL is present, the
shared library contains non-PIC code.
Tag: shlib-without-versioned-soname
Severity: normal
Certainty: possible
Ref: policy 10.2, policy 8.6
Info: The listed shared library in a public library directory has an
SONAME that does not contain any versioning information, either after the
.so or before it and set off by a hyphen. It cannot therefore
be represented in the shlibs system, and if linked by binaries its
interface cannot safely change. There is no backward-compatible way to
migrate programs linked against it to a new ABI.
.
Normally, this means the shared library is a private library for a
particular application and is not meant for general use. Policy
recommends that such libraries be installed in a subdirectory of
/usr/lib rather than in a public shared library directory.
.
To view the SONAME of a shared library, run readelf -d on the
shared library and look for the tag of type SONAME.
.
There are some special stub libraries or special-purpose shared objects
for which an ABI version is not meaningful. If this is one of those
cases, please add an override.
Tag: ldconfig-symlink-missing-for-shlib
Severity: important
Certainty: certain
Info: The package should not only include the shared library itself, but also
the symbolic link which ldconfig would produce. (This is necessary, so
that the link gets removed by dpkg automatically when the package
gets removed.) If the symlink is in the package, check that the SONAME of the
library matches the info in the shlibs file.
Ref: policy 8.1
Tag: dev-pkg-without-shlib-symlink
Severity: normal
Certainty: certain
Info: A "-dev" package is supposed to install a "libsomething.so" symbolic
link referencing the corresponding shared library. Notice how the link name
doesn't include the version number -- this is because such a link is used
by the linker when other programs are built against this shared library.
.
The symlink is generally expected in the same directory as the library
itself. The major exception to this rule is if the library is installed
in (or beneath) /lib, where the symlink must be installed in the
same dir beneath /usr.
.
Example: If the library is installed in /lib/i386-linux-gnu/libXYZ.so.V,
the symlink is expected at /usr/lib/i386-linux-gnu/libXYZ.so.
.
Implementation detail: This tag is emitted for the library package and not
the "-dev" package.
Ref: policy 8.4
Tag: non-dev-pkg-with-shlib-symlink
Severity: normal
Certainty: possible
Info: Although this package is not a "-dev" package, it installs a
"libsomething.so" symbolic link referencing the corresponding shared
library. When the link doesn't include the version number, it is used by
the linker when other programs are built against this shared library.
.
Shared libraries are supposed to place such symbolic links in their
respective "-dev" packages, so it is a bug to include it with the main
library package.
.
However, if this is a small package which includes the runtime and the
development libraries, this is not a bug. In the latter case, please
override this warning.
Ref: policy 8.4
Tag: preinst-calls-ldconfig
Severity: normal
Certainty: certain
Info: The preinst script calls ldconfig. Calls to ldconfig should only be
in postinst and postrm scripts.
Ref: policy 8.1.1
Tag: prerm-calls-ldconfig
Severity: normal
Certainty: certain
Info: The prerm script calls ldconfig. Calls to ldconfig should only
be in postinst and postrm scripts.
Ref: policy 8.1.1
Tag: postrm-unsafe-ldconfig
Severity: normal
Certainty: certain
Info: The postrm script calls ldconfig unsafely. The postrm
must only call ldconfig when given the argument "remove".
Ref: policy 8.1.1
Tag: no-shlibs-control-file
Severity: serious
Certainty: possible
Info: Although the package includes a shared library, the package does not
have a shlibs control file. If this is intentional, please override this
error.
Ref: policy 8.6
Tag: pkg-has-shlibs-control-file-but-no-actual-shared-libs
Severity: important
Certainty: certain
Info: Although the package does not include any shared libraries, it does
have a shlibs control file. If you did include a shared library, check that
the SONAME of the library is set and that it matches the contents of the
shlibs file.
.
SONAMEs are set with something like gcc -Wl,-soname,libfoo.so.0,
where 0 is the major version of the library. If your package uses libtool,
then libtool invoked with the right options should be doing this.
.
Note this is sometimes triggered for packages with a private shared
library due to a bug in Debhelper.
Ref: #204975, #633853
Tag: duplicate-entry-in-shlibs-control-file
Severity: important
Certainty: certain
Info: The shlibs control file contains a duplicate entry.
Tag: shlib-missing-in-control-file
Severity: important
Certainty: possible
Info: The package contains a shared library that is not listed in the
shlibs control file. If this is intentional, please override this error.
Ref: policy 8.6
Tag: unused-shlib-entry-in-control-file
Severity: normal
Certainty: certain
Info: The shlibs control file contains an entry for a shared library that
is not installed by this package.
Ref: policy 8.6
Tag: shlibs-declares-dependency-on-other-package
Severity: normal
Certainty: possible
Info: This package declares in its shlibs control file either a dependency
on some other package not listed in the Provides of this package or on a
version of this package that the package version doesn't satisfy.
.
Packages should normally only list in their shlibs control file the
shared libraries included in that package, and therefore the dependencies
listed there should normally be satisfied by either the package itself or
one of its Provides.
.
In unusual circumstances where it's necessary to declare more complex
dependencies in the shlibs control file, please add a lintian override
for this warning.
Ref: policy 8.6
Tag: ldconfig-symlink-referencing-wrong-file
Severity: important
Certainty: certain
Info: The symbolic link references the wrong file. (It should reference
the shared library.)
Ref: policy 8.1
Tag: ldconfig-symlink-is-not-a-symlink
Severity: important
Certainty: certain
Info: The package installs a file with the name, ldconfig would use for
the symbolic link to reference the shared library.
Ref: policy 8.1
Tag: postinst-has-useless-call-to-ldconfig
Severity: minor
Certainty: certain
Info: The postinst script calls ldconfig even though no shared libraries are
installed in a directory controlled by the dynamic library loader.
.
Note this may be triggered by a bug in debhelper, that causes it to
auto-generate an ldconfig snippet for packages that does not need it.
Ref: policy 8.1.1, #204975
Tag: udeb-postinst-must-not-call-ldconfig
Severity: important
Certainty: certain
Info: The postinst script calls ldconfig, which is an error in udebs.
ldconfig is not available and not needed in debian-installer
Tag: postrm-has-useless-call-to-ldconfig
Severity: minor
Certainty: certain
Info: The postrm script calls ldconfig even though no shared libraries are
installed in a directory controlled by the dynamic library loader.
.
Note this may be triggered by a bug in debhelper, that causes it to
auto-generate an ldconfig snippet for packages that does not need it.
Ref: policy 8.1.1, #204975
Tag: postinst-must-call-ldconfig
Severity: serious
Certainty: certain
Info: The package installs shared libraries in a directory controlled by
the dynamic library loader. Therefore, the package must call "ldconfig" in
its postinst script.
Ref: policy 8.1.1
Tag: postrm-should-call-ldconfig
Severity: important
Certainty: certain
Info: The package installs shared libraries in a directory controlled by
the dynamic library loader. Therefore, the package should call "ldconfig"
in its postrm script.
Ref: policy 8.1.1
Tag: sharedobject-in-library-directory-missing-soname
Severity: important
Certainty: possible
Info: A shared object was identified in a library directory (a directory
in the standard linker path) which doesn't have a SONAME. This is
usually an error.
.
SONAMEs are set with something like gcc -Wl,-soname,libfoo.so.0,
where 0 is the major version of the library. If your package uses libtool,
then libtool invoked with the right options should be doing this.
.
To view the SONAME of a shared library, run readelf -d on the
shared library and look for the tag of type SONAME.
Tag: shlib-without-PT_GNU_STACK-section
Severity: important
Certainty: certain
Info: The listed shared libraries lacks a PT_GNU_STACK section. This forces
the dynamic linker to make the stack executable.
.
The shared lib is linked either with a non-GNU linker or a linker which is
very old. This problem can be fixed with a rebuild.
.
To see whether a shared library has this section, run readelf -l
on it and look for a program header of type GNU_STACK.
Tag: shlib-with-executable-stack
Severity: normal
Certainty: possible
Info: The listed shared libraries declares the stack as executable.
.
Executable stack is usually an error as it is only needed if the code
contains GCC trampolines or similar constructs which uses code on the
stack. One possible source for false positives are object files built
from assembler files which don't define a proper .note.GNU-stack
section.
.
To see the permissions on the stack, run readelf -l on the
shared library and look for the program header of type GNU_STACK. In the
flag column, there should not be an E flag set.
Tag: symbols-file-contains-current-version-with-debian-revision
Severity: important
Certainty: certain
Info: Debian revisions should be stripped from versions in symbols files.
Not doing so leads to dependencies unsatisfiable by backports (1.0-1~bpo
<< 1.0-1 while 1.0-1~bpo >= 1.0). If the debian revision can't
be stripped because the symbol really appeared between two specific
Debian revisions, you should postfix the version with a single "~"
(example: 1.0-3~ if the symbol appeared in 1.0-3).
.
This problem normally means that the symbols were added automatically by
dpkg-gensymbols. dpkg-gensymbols uses the full version number for the
dependency associated to any new symbol that it detects. The maintainer
must update the debian/<package>.symbols file by adding
the new symbols with the corresponding upstream version.
Tag: symbols-file-contains-debian-revision
Severity: normal
Certainty: certain
Info: Debian revisions should be stripped from versions in symbols files.
Not doing so leads to dependencies unsatisfiable by backports (1.0-1~bpo
<< 1.0-1 while 1.0-1~bpo >= 1.0). If the debian revision can't
be stripped because the symbol really appeared between two specific
Debian revisions, you should postfix the version with a single "~"
(example: 1.0-3~ if the symbol appeared in 1.0-3).
Ref: dpkg-gensymbols(1), http://wiki.debian.org/UsingSymbolsFiles
Tag: syntax-error-in-symbols-file
Severity: important
Certainty: certain
Info: The symbols file contains an entry that does not follow the syntax
rules for symbols files.
.
This may be due to the entry appearing out of sequence.
Ref: deb-symbols(5)
Tag: duplicate-entry-in-symbols-control-file
Severity: important
Certainty: certain
Info: The symbols control file contains a duplicate entry.
Tag: no-symbols-control-file
Severity: wishlist
Certainty: certain
Info: Although the package includes a shared library, the package does not
have a symbols control file.
.
dpkg can use symbols files in order to generate more accurate library
dependencies for applications, based on the symbols from the library that
are actually used by the application.
Ref: dpkg-gensymbols(1), http://wiki.debian.org/UsingSymbolsFiles
Tag: pkg-has-symbols-control-file-but-no-shared-libs
Severity: important
Certainty: certain
Info: Although the package does not include any shared libraries, it does
have a symbols control file. If you did include a shared library, check that
the SONAME of the library is set and that it matches the contents of the
symbols file.
.
SONAMEs are set with something like gcc -Wl,-soname,libfoo.so.0,
where 0 is the major version of the library. If your package uses libtool,
then libtool invoked with the right options should be doing this.
Tag: shlib-missing-in-symbols-control-file
Severity: normal
Certainty: possible
Info: The package contains a shared library that is not listed in the
symbols control file. This may not be a problem if, for example,
the library is a C++ library.
Tag: unused-shlib-entry-in-symbols-control-file
Severity: normal
Certainty: certain
Info: The symbols control file contains an entry for a shared library that
is not installed by this package.
Tag: symbols-declares-dependency-on-other-package
Severity: normal
Certainty: possible
Info: This package declares in its symbols control file a dependency on
some other package (and not one listed in the Provides of this package).
.
Packages should normally only list in their symbols control file the
shared libraries included in that package, and therefore the dependencies
listed there should normally be satisfied by either the package itself or
one of its Provides.
.
In unusual circumstances where it's necessary to declare more complex
dependencies in the symbols control file, please add a lintian override
for this warning.
Ref: policy 8.6
Tag: invalid-template-id-in-symbols-file
Severity: important
Certainty: certain
Info: The symbol definition refers to an alternative dependency template
which is not defined for the library containing the symbol.
.
The first alternative dependency template for a library the id number
of 1, with the ids of subsequent alternative templates increasing in
sequence.
Tag: unknown-meta-field-in-symbols-file
Severity: important
Certainty: certain
Info: The symbols control file contains an unknown meta-information field.
.
A list of currently supported fields may be found in deb-control(5).
Ref: deb-control(5)
Tag: symbols-declared-but-not-shlib
Severity: important
Certainty: certain
Info: The symbols control file contains dependency and symbol information
for a shared library which is not listed in the shlibs control file.
Tag: shlib-calls-exit
Severity: wishlist
Certainty: possible
Experimental: yes
Info: The listed shared library calls the C library exit() or _exit()
functions.
.
In the case of an error, the library should instead return an appropriate
error code to the calling program which can then determine how to handle
the error, including performing any required clean-up.
.
In most cases, removing the call should be discussed with upstream,
particularly as it may produce an ABI change.
Tag: incorrect-libdir-in-la-file
Severity: important
Certainty: possible
Info: The given .la file points to a libdir other than the path where it is
installed. This can be caused by resetting prefix at make install
time instead of using DESTDIR. The incorrect path will cause
packages linking to this library using libtool to build incorrectly (adding
incorrect paths to RPATH, for example).
Tag: non-empty-dependency_libs-in-la-file
Severity: serious
Certainty: certain
Info: The dependency_libs field in the .la file has not been cleared. It has
long been a release goal to get rid of unneeded .la files and clearing the
dependency_libs field from the rest of them.
.
A non-empty dependency_libs field will also stall the Multi-Arch
conversion.
.
The .la file in itself may be useful, if the library is loaded dynamically
via libltdl.
Ref: http://wiki.debian.org/ReleaseGoals/LAFileRemoval,
http://lists.debian.org/debian-devel/2011/05/msg01003.html,
http://lists.debian.org/debian-devel/2011/05/msg01146.html
Tag: shlib-in-multi-arch-foreign-package
Severity: serious
Certainty: certain
Ref: https://wiki.ubuntu.com/MultiarchSpec
Info: The package is marked as Multi-Arch: foreign, but it includes a shared
library in a public library directory.
Tag: shlibs-uses-obsolete-relation
Ref: policy 7.1
Severity: normal
Certainty: certain
Info: The forms "<" and ">" mean "<=" and ">=", not "<<"
and ">>" as one might expect. For that reason these forms are
obsolete, and should not be used in new packages. Use the longer forms
instead.
lintian-2.5.22ubuntu1/checks/phppear.desc 0000664 0000000 0000000 00000005746 12310413144 015220 0 ustar Check-Script: phppear
Author: Mathieu Parent
Abbrev: phppear
Type: source
Needs-Info: index, debfiles, unpacked
Info: This script checks if the packages comply with various aspects of the
debian PHP policy.
Tag: pear-package-without-pkg-php-tools-builddep
Severity: normal
Certainty: possible
Info: The package contains an package.xml or package2.xml file but doesn't
build-depend on pkg-php-tools.
.
pkg-php-tools is the recommended tool for building PEAR and PECL packages. For
more information, install it and read the included README.PEAR.
Tag: pear-channel-without-pkg-php-tools-builddep
Severity: normal
Certainty: possible
Info: The package contains an channel.xml file but doesn't build-depend on
pkg-php-tools.
.
pkg-php-tools is the recommended tool for building PEAR and PECL packages. For
more information, install it and read the included README.PEAR.
Tag: pear-package-but-missing-dependency
Severity: normal
Certainty: possible
Info: The package is a PEAR package but its control file doesn't have
${phppear:Debian-Depends} in Depends or ${phppear:Debian-Recommends}.
Tag: pear-package-not-using-substvar
Severity: wishlist
Certainty: possible
Info: The package is a PEAR package but its control file doesn't have
${phppear:summary} or ${phppear:description} in its description fields.
.
Those substitution variables should only be used if the description
included in PEAR package is of sufficient quality and respect Debian
packaging best practices.
Ref: http://www.debian.org/doc/manuals/developers-reference/best-pkging-practices.html#bpp-desc-basics
Tag: pear-package-feature-requires-newer-pkg-php-tools
Severity: normal
Certainty: possible
Info: The package requires a newer pkg-php-tools for a specific feature.
Tag: pecl-package-requires-build-dependency
Severity: normal
Certainty: possible
Info: The package is a PECL package but its control file doesn't have
php5-dev or dh-php5 as a build dependency.
Tag: composer-package-without-pkg-php-tools-builddep
Severity: wishlist
Certainty: possible
Info: The package contains an composer.json file but doesn't build-depend on
pkg-php-tools.
.
pkg-php-tools is the recommended tool for building PHP Composer packages. For
more information, install it and read the included README.Composer.
Tag: missing-pkg-php-tools-buildsystem
Severity: normal
Certainty: possible
Info: The package uses pkg-php-tools but dh command is called without
--buildsystem=phppear
.
pkg-php-tools build system is the recommended tool for building PHP PEAR
packages. For more information, install it and read the included README.PEAR.
Tag: missing-pkg-php-tools-addon
Severity: normal
Certainty: possible
Info: The package uses pkg-php-tools but dh command is called without
--with phppear or --with phpcomposer. A PECL package should also have
--with php5.
.
pkg-php-tools db addons are the recommended tool for building PHP PEAR or
Composer packages. For more information, install it and read the included
README.PEAR or README.Composer.
lintian-2.5.22ubuntu1/checks/group-checks.desc 0000664 0000000 0000000 00000005354 12310413144 016146 0 ustar Check-Script: group-checks
Author: Niels Thykier
Abbrev: gchck
# This is a source check, so we only run it once per group
Type: source
Info: This script checks for some issues that may appear in packages
built from the same source. This includes intra-source circular
dependencies and intra-source priority checks.
Tag: intra-source-package-circular-dependency
Severity: normal
Certainty: certain
Info: The listed packages from the same source circularly depend
(or pre-depend) on each other. This makes it difficult for tools
to properly handle install/upgrade sequences. Furthermore this
complicates automated removal of unused packages.
.
If possible, consider removing or reducing one of the depends.
.
Note: This check is limited to packages created from the same
source package. Full circular dependencies between binaries from
different source packages is beyond the scope of Lintian.
Ref: policy 7.2
Tag: package-depends-on-lower-priority-package
Severity: normal
Certainty: certain
Ref: policy 2.5, http://qa.debian.org/debcheck.php
Info: The package depends on a package with lower priority than
itself.
.
Note: This check is limited to packages created from the same source
package. A full check of all dependencies built from different
source packages is beyond the scope of Lintian. The depcheck service
can do this.
Tag: binaries-have-file-conflict
Severity: normal
Certainty: possible
Experimental: no
Info: The binaries appears to have overlapping files without proper
conflicts relation.
.
Note the check is completely based on the file index for the
packages. Possible known false-positives include dpkg-diverts in
maintainer scripts.
Tag: dependency-is-not-multi-archified
Severity: normal
Certainty: possible
Info: The package is Multi-Arch "same", but it depends on a package that
is neither Multi-Arch "same" nor "foreign".
Ref: https://wiki.ubuntu.com/MultiarchSpec
Tag: debug-package-for-multi-arch-same-pkg-not-coinstallable
Severity: minor
Certainty: possible
Info: The debug package appear to be containing debug symbols for a
"Multi-Arch: same" package, but the debug package itself is not
"Multi-Arch: same". If so, it is not possible to have the debug
symbols for all architecture variants of the binaries available
at the same time.
.
Making a debug package co-installable with itself is very trivial,
when installing the debug symbols beneath:
/usr/lib/debug/.build-id/<XX>/<rest-id>.debug
.
dh_strip does this in debhelper compat 9. Otherwise, the expected
location of the debug symbols of a given ELF binary can be determined
by using:
.
readelf -n <binary-elf> | \
perl -ne 'print if s,^\s*Build ID:\s*(\S\S)(\S+),/usr/lib/debug/.build-id/$1/$2.debug,'
lintian-2.5.22ubuntu1/checks/systemd.desc 0000664 0000000 0000000 00000005701 12310413206 015237 0 ustar Check-Script: systemd
Author: Michael Stapelberg
Type: binary
Info: Checks various systemd policy things
Needs-Info: scripts, index, unpacked, file-info, bin-pkg-control
Tag: systemd-service-file-outside-lib
Severity: serious
Certainty: certain
Info: The package ships a systemd service file outside
/lib/systemd/system/
.
System administrators should have the possibility to overwrite a
service file (or parts of it, in newer systemd versions) by placing a
file in /etc/systemd/system, so the canonical location used
for service files is /lib/systemd/system/.
Tag: systemd-tmpfiles.d-outside-usr-lib
Severity: serious
Certainty: certain
Info: The package ships a systemd tmpfiles.d(5) conf file outside
/usr/lib/tmpfiles.d/
Tag: systemd-service-file-refers-to-obsolete-target
Severity: normal
Certainty: certain
Info: The systemd service file refers to an obsolete target.
.
Some targets are obsolete by now, e.g. syslog.target or dbus.target. For
example, declaring After=syslog.target is unnecessary by now because
syslog is socket-activated and will therefore be started when needed.
Tag: systemd-no-service-for-init-script
Severity: serious
Certainty: certain
Info: The listed init.d script has no systemd equivalent.
.
Systemd has a SysV init.d script compatibility mode. It provides access to
each SysV init.d script as long as there is no native service file with the
same name (e.g. /lib/systemd/system/rsyslog.service corresponds to
/etc/init.d/rsyslog).
.
Your package ships a service file, but for the listed init.d script, there is
no corresponding systemd service file.
Tag: init.d-script-does-not-source-init-functions
Severity: normal
Certainty: certain
Info: The /etc/init.d script does not source
/lib/lsb/init-functions. The systemd package provides
/lib/lsb/init-functions.d/40-systemd to redirect
/etc/init.d/$script calls to systemctl.
.
Please add a line like this to your /etc/init.d script:
.
. /lib/lsb/init-functions
Tag: maintainer-script-calls-systemctl
Severity: normal
Certainty: certain
Ref: https://wiki.debian.org/Systemd/Packaging
Info: The maintainer script calls systemctl directly. Actions such as enabling
a unit file should be done using deb-systemd-helper so that they work
on machines with or without systemd. Starting a service should be done via
invoke-rc.d, if the service has a corresponding sysvinit script, or
deb-systemd-invoke if it doesn’t.
.
If you are using debhelper, please use the dh-systemd debhelper
addon.
Tag: init-script-is-not-a-file
Severity: serious
Certainty: certain
Info: The package contains an init script that is not a regular file or
resolvable symlink.
Tag: service-file-is-not-a-file
Severity: serious
Certainty: certain
Info: The package contains a service file that is not a regular file or
resolvable symlink.
lintian-2.5.22ubuntu1/checks/cruft.desc 0000664 0000000 0000000 00000067340 12314062063 014706 0 ustar Check-Script: cruft
Author: Sean 'Shaleh' Perry
Abbrev: deb
Type: source
Info: This looks for cruft in Debian packaging or upstream source
Needs-Info: unpacked, debfiles, diffstat, file-info, index, md5sums
Tag: native-package-with-dash-version
Severity: normal
Certainty: certain
Info: Native packaging should only be used if a piece of software was
written specifically to be turned into a Debian package. In this case,
the version number should not contain a Debian revision part.
.
Native source packages are sometimes created by accident. In most cases
the reason is the location of the original source tarball. For version
1.0 source packages, dpkg-source determines whether they're non-native by
looking for a file named <package>_<upversion>.orig.tar.gz
in the parent directory, where <upversion> is the upstream version
from the most recent debian/changelog entry. For version 3.0
packages, check debian/source/format for an erroneous
"(native)" package format.
Tag: non-native-package-with-native-version
Severity: normal
Certainty: certain
Info: This package has a native version number (a version number
without a dash and a Debian portion) but is built as a non-native
package. Usually this is an error caused by forgetting the Debian
revision for a non-native package. In this case the solution is to
add a Debian revision.
.
This error can also happen if the package is a 1.0 source format and
there is a stray *.orig.tar.gz file in the parent directory.
The file will trick dpkg-source into believing it was
supposed to be a non-native package. Here the error can be solved by
converting it to 3.0 (native) package or removing/renaming the
*.orig.tar.gz file.
.
If you do not know what a "native" or a "non-native" package is, you are
very likely working on a non-native package.
Tag: debian-files-list-in-source
Severity: important
Certainty: certain
Info: Leaving debian/files causes problems for the autobuilders,
since that file will likely include the list of .deb files for another
architecture, which will cause dpkg-buildpackage run by the buildd to fail.
.
The clean rule for the package should remove this file.
Ref: policy 4.12
Tag: diff-contains-cmake-cache-file
Severity: serious
Certainty: possible
Info: The Debian diff contains a CMake cache file. These files embed the
full path of the source tree in which they're created and cause build
failures if they exist when the source is built under a different path,
so they will always cause errors on the buildds. The file was probably
accidentally included. If it is present in the upstream source, don't
modify it in the Debian diff; instead, delete it before the build in
debian/rules.
Tag: diff-contains-cvs-control-dir
Severity: normal
Certainty: certain
Info: The Debian diff or native package contains files in a CVS directory.
These are usually artifacts of the revision control system used by the
Debian maintainer and not useful in a diff or native package.
dpkg-source will automatically exclude these if it is passed
-I or -i for native and non-native packages respectively.
Ref: dpkg-source(1)
Tag: source-contains-cvs-control-dir
Severity: pedantic
Certainty: certain
Info: The upstream source contains a CVS directory. It was most likely
included by accident since CVS directories usually don't belong in
releases. When packaging a CVS snapshot, export from CVS rather than use
a checkout. If an upstream release tarball contains CVS directories, you
usually should report this as a bug to upstream.
Tag: diff-contains-svn-control-dir
Severity: normal
Certainty: certain
Info: The Debian diff or native package contains files in an .svn
directory. These are usually artifacts of the revision control system
used by the Debian maintainer and not useful in a diff or native package.
dpkg-source will automatically exclude these if it is passed
-I or -i for native and non-native packages respectively.
Ref: dpkg-source(1)
Tag: source-contains-svn-control-dir
Severity: pedantic
Certainty: certain
Info: The upstream source contains an .svn directory. It was most likely
included by accident since Subversion version control directories
usually don't belong in releases. When packaging a Subversion snapshot,
export from subversion rather than checkout. If an upstream release
tarball contains .svn directories, this should be reported as a bug to
upstream since it can double the size of the tarball to no purpose.
Tag: diff-contains-bzr-control-dir
Severity: normal
Certainty: certain
Info: The Debian diff or native package contains files in a .bzr
directory. These are usually artifacts of the revision control system
used by the Debian maintainer and not useful in a diff or native package.
dpkg-source will automatically exclude these if it is passed
-I or -i for native and non-native packages respectively.
Ref: dpkg-source(1)
Tag: source-contains-bzr-control-dir
Severity: pedantic
Certainty: certain
Info: The upstream source contains a .bzr directory. It was most likely
included by accident since bazaar-ng version control directories usually
don't belong in releases and may contain the entire repository. When
packaging a bzr snapshot, use bzr export to create a clean tree. If an
upstream release tarball contains .bzr directories, you should usually
report this as a bug upstream.
Tag: diff-contains-arch-control-dir
Severity: normal
Certainty: certain
Info: The Debian diff or native package contains files in an {arch} or
.arch-ids directory or a directory starting with ,, (used by baz
for debugging traces). These are usually artifacts of the revision
control system used by the Debian maintainer and not useful in a diff or
native package. dpkg-source will automatically exclude these if
it is passed -I or -i for native and non-native
packages respectively.
Ref: dpkg-source(1)
Tag: source-contains-arch-control-dir
Severity: pedantic
Certainty: certain
Info: The upstream source contains an {arch} or .arch-ids directory or a
directory starting with ,, (used by baz for debugging traces).
It was most likely included by accident since Arch version control
directories usually don't belong in releases. If an upstream release
tarball contains these directories, you should usually report this as a
bug upstream.
Tag: diff-contains-git-control-dir
Severity: normal
Certainty: certain
Info: The Debian diff or native package contains files in a .git
directory. These are usually artifacts of the revision control system
used by the Debian maintainer and not useful in a diff or native package.
dpkg-source will automatically exclude these if it is passed
-I or -i for native and non-native packages respectively.
Ref: dpkg-source(1)
Tag: source-contains-git-control-dir
Severity: pedantic
Certainty: certain
Info: The upstream source contains a .git directory. It was most likely
included by accident since git version control directories usually don't
belong in releases and may contain a complete copy of the repository. If
an upstream release tarball contains .git directories, you should usually
report this as a bug upstream.
Tag: diff-contains-hg-control-dir
Severity: normal
Certainty: certain
Info: The Debian diff or native package contains files in a .hg
directory. These are usually artifacts of the revision control system
used by the Debian maintainer and not useful in a diff or native package.
dpkg-source will automatically exclude these if it is passed
-I or -i for native and non-native packages respectively.
Ref: dpkg-source(1)
Tag: source-contains-hg-control-dir
Severity: pedantic
Certainty: certain
Info: The upstream source contains a .hg directory. It was most likely
included by accident since hg version control directories usually don't
belong in releases and may contain a complete copy of the repository. If
an upstream release tarball contains .hg directories, you should usually
report this as a bug upstream.
Tag: diff-contains-bts-control-dir
Severity: normal
Certainty: certain
Info: The Debian diff or native package contains files in a directory
used by a bug tracking system, which are not useful in a diff or native
package. dpkg-source will automatically exclude these if it
is passed -I or -i for native and non-native packages
respectively.
Ref: dpkg-source(1)
Tag: diff-contains-quilt-control-dir
Severity: normal
Certainty: certain
Info: The Debian diff or native package contains files in a directory
used by quilt, which are not useful in a diff or native package.
dpkg-source will automatically exclude these if it is passed
-I or -i for native and non-native packages
respectively.
Ref: dpkg-source(1)
Tag: source-contains-bts-control-dir
Severity: pedantic
Certainty: certain
Info: The upstream source contains a directory used by a bug tracking
system. It was most likely included by accident since bug tracking system
directories usually don't belong in releases.
Tag: diff-contains-svn-commit-file
Severity: minor
Certainty: certain
Info: The Debian diff or native package contains an
svn-commit(.NNN).tmp, almost certainly a left-over from a failed
Subversion commit by the Debian package maintainer.
Tag: source-contains-svn-commit-file
Severity: pedantic
Certainty: certain
Info: The upstream source contains an svn-commit(.NNN).tmp,
almost certainly a left-over from a failed Subversion commit. You may
want to report this as an upstream bug.
Tag: diff-contains-svk-commit-file
Severity: minor
Certainty: certain
Info: The Debian diff or native package contains an
svk-commitNNN.tmp, almost certainly a left-over from a failed
svk commit by the Debian package maintainer.
Tag: source-contains-svk-commit-file
Severity: pedantic
Certainty: certain
Info: The upstream source contains an svk-commitNNN.tmp,
almost certainly a left-over from a failed Subversion commit. You may
want to report this as an upstream bug.
Tag: diff-contains-arch-inventory-file
Severity: normal
Certainty: certain
Info: The Debian diff or native package contains an
.arch-inventory file. This is Arch metadata that should
normally not be distributed.
Tag: source-contains-arch-inventory-file
Severity: pedantic
Certainty: certain
Info: The upstream source contains an .arch-inventory file. This
is Arch metadata that should normally not be distributed. You may want
to report this as an upstream bug.
Tag: diff-contains-hg-tags-file
Severity: normal
Certainty: certain
Info: The Debian diff or native package contains an .hgtags
file. This file is Mercurial metadata that should normally not be
distributed. It stores hashes of tagged commits in a Mercurial
repository and isn't therefore useful without the repository.
Tag: source-contains-hg-tags-file
Severity: pedantic
Certainty: certain
Info: The upstream source contains an .hgtags file. This file is
Mercurial metadata that should normally not be distributed. It stores
hashes of tagged commits in a Mercurial repository and isn't therefore
useful without the repository. You may want to report this as an
upstream bug.
Tag: diff-contains-cvs-conflict-copy
Severity: normal
Certainty: certain
info: The Debian diff or native package contains a CVS conflict copy.
These have file names like .#file.version and are generated by
CVS when a conflict was detected when merging local changes with updates
from a source repository. They're useful only while resolving the
conflict and should not be included in the package.
Tag: source-contains-cvs-conflict-copy
Severity: pedantic
Certainty: certain
info: The upstream source contains a CVS conflict copy. These have file
names like .#file.version and are generated by CVS when a
conflict was detected when merging local changes with updates from a
source repository. They're useful only while resolving the conflict and
were probably included by accident. You may want to report this as an
upstream bug.
Tag: diff-contains-svn-conflict-file
Severity: normal
Certainty: certain
info: The Debian diff or native package contains a file that looks like a
Subversion conflict file. These are generated by Subversion when a
conflict was detected while merging local changes with updates from a
source repository. Use svn resolved to remove them and clear
the Subversion conflict state after you have resolved the conflict.
Tag: source-contains-svn-conflict-file
Severity: pedantic
Certainty: certain
info: The upstream source contains a file that looks like a Subversion
conflict file. These are generated by Subversion when a conflict was
detected while merging local changes with updates from a source
repository. They're useful only while resolving the conflict and
were probably included by accident. You may want to report this as an
upstream bug.
Tag: diff-contains-patch-failure-file
Severity: normal
Certainty: possible
Info: The Debian diff or native package contains a file that looks like
the files left behind by the patch utility when it cannot
completely apply a diff. This may be left over from a patch applied by
the maintainer. Normally such files should not be included in the
package.
Tag: diff-contains-editor-backup-file
Severity: minor
Certainty: certain
Info: The Debian diff or native package contains a file ending in
~ or of the form .xxx.swp, which is normally either an
Emacs or vim backup file or a backup file created by programs such as
autoheader or debconf-updatepo. This usually causes no
harm, but it's messy and bloats the size of the Debian diff to no useful
purpose.
Tag: diff-contains-substvars
Severity: normal
Certainty: certain
Info: Lintian found a substvars file in the Debian diff for this source
package. The debian/substvars (or debian/package.substvars) file
is usually generated and modified dynamically by debian/rules targets, in
which case it must be removed by the clean target.
Ref: policy 4.9
Tag: empty-debian-diff
Severity: normal
Certainty: possible
Info: The Debian diff of this non-native package appears to be completely
empty. This usually indicates a mistake when generating the upstream
tarball, or it may mean that this was intended to be a native package and
was built non-native by mistake.
.
If the Debian packaging is maintained in conjunction with upstream, this
may be intentional, but it's not recommended best practice. If the
software is only for Debian, it should be a native package; otherwise,
it's better to omit the debian directory from upstream releases
and add it in the Debian diff. Otherwise, it can cause problems for some
package updates in Debian (files can't be removed from the
debian directory via the diff, for example).
Tag: configure-generated-file-in-source
Severity: normal
Certainty: possible
Info: Leaving config.cache/status causes autobuilders problems.
config.cache and config.status are produced by GNU autoconf's configure
scripts. If they are left in the source package, autobuilders may pick
up settings for the wrong architecture.
.
The clean rule in debian/rules should remove this file. This
should ideally be done by fixing the upstream build system to do it when
you run the appropriate cleaning command (and don't forget to forward the
fix to the upstream authors so it doesn't happen in the next release). If
that is already implemented, then make sure you are indeed cleaning it in
the clean rule. If all else fails, a simple rm -f should work.
.
Note that Lintian cannot reliably detect the removal in the clean rule,
so once you fix this, please ignore or override this warning.
Tag: ancient-autotools-helper-file
Severity: important
Certainty: possible
Info: The referenced file has a time stamp older than year 2004 and the
package does not build-depend on autotools-dev or automake and therefore
apparently does not update it. This usually means that the source
package will not build correctly on all currently released architectures.
.
For packages using debhelper, the tools from the dh-autoreconf
package should handle this issue. cdbs will automatically update
these files if autotools-dev is installed during build, but the build
dependency on autotools-dev is still necessary.
.
Otherwise, read /usr/share/doc/autotools-dev/README.Debian.gz (from the
autotools-dev package) for information on how to fix this problem.
Tag: outdated-autotools-helper-file
Severity: normal
Certainty: possible
Info: The referenced file has a time stamp older than April of 2012 and the
package does not build-depend on autotools-dev or automake and therefore
apparently does not update it. This usually means that the source
package will not build correctly on ARM64, for which a Debian port is
currently in progress, and may not support other newer architectures.
.
For packages using debhelper, the tools from the dh-autoreconf
package should handle this issue. cdbs will automatically update
these files if autotools-dev is installed during build, but the build
dependency on autotools-dev is still necessary.
.
Otherwise, read /usr/share/doc/autotools-dev/README.Debian.gz (from the
autotools-dev package) for information on how to fix this problem.
Tag: ancient-libtool
Severity: normal
Certainty: possible
Info: The referenced file seems to be from a libtool version older than
1.5.2-2. This might lead to build errors on some newer architectures not
known to this libtool.
.
Please ask your upstream maintainer to re-libtoolize the package or do it
yourself if there is no active upstream. You will also need to run
Autoconf to regenerate the configure script. Usually it is best to do
this during the build by depending on autoconf, libtool, and automake if
it is used, and then running:
.
autoreconf -i --force
.
before running configure. Depending on how old the package is, this may
require additional modifications to configure.ac or
configure.in or other work. If you do this during the build,
determine which files it will add or update and be sure to remove those
files in the clean target.
.
If you have fixed architecture-specific issues with minimal patches,
rather than updating libtool, and verified that it builds correctly,
please override this tag. Lintian will not be able to verify that.
Tag: source-contains-prebuilt-binary
Severity: pedantic
Certainty: certain
Info: The source tarball contains a prebuilt ELF object. They are usually
left by mistake when generating the tarball by not cleaning the source
directory first. You may want to report this as an upstream bug, in case
there is no sign that this was intended.
Tag: source-contains-prebuilt-flash-object
Severity: pedantic
Certainty: possible
Info: The source tarball contains a prebuilt file in the Shockwave Flash (SWF)
or Flash Video (FLV) format. These are often included by mistake when
developers generate a tarball without cleaning the source directory
first. An exception is simple video files, which are their own
source.
.
If there is no sign this was intended, consider reporting it as an
upstream bug.
.
If the Flash file is not meant to be modified directly, please make
sure the package includes the source for the file and that the
packaging rebuilds it.
Tag: source-contains-prebuilt-flash-project
Severity: pedantic
Certainty: possible
Info: The source tarball contains a prebuilt file in the Shockwave Flash
project (FLA) format. These are often included by mistake when
developers generate a tarball without cleaning the source directory
first.
.
If there is no sign this was intended, consider reporting it as an
upstream bug.
.
If the Flash file is not meant to be modified directly, please make
sure the package includes the source for the file and that the
packaging rebuilds it.
Tag: source-contains-prebuilt-java-object
Severity: pedantic
Certainty: possible
Info: The source tarball contains a prebuilt Java class file. These are often
included by mistake when developers generate a tarball without cleaning
the source directory first. If there is no sign this was intended,
consider reporting it as an upstream bug.
Tag: source-contains-prebuilt-javascript-object
Severity: pedantic
Certainty: possible
Info: The source tarball contains a prebuilt (minified) JavaScript object.
They are usually left by mistake when generating the tarball by not
cleaning the source directory first. You may want to report this as
an upstream bug, in case there is no sign that this was intended.
Tag: source-contains-prebuilt-python-object
Severity: pedantic
Certainty: possible
Info: The source tarball contains a prebuilt Python object. They are
usually left by mistake when generating the tarball by not cleaning the
source directory first. You may want to report this as an upstream bug,
in case there is no sign that this was intended.
Tag: source-contains-prebuilt-silverlight-object
Severity: serious
Certainty: possible
Info: The source tarball contains a prebuilt Silverlight control.
Unfortunately, the tools used to build such files have non-free
dependencies and are not present in Debian. This file must be
completely removed.
Tag: source-contains-prebuilt-windows-binary
Severity: pedantic
Certainty: certain
Info: The source tarball contains a prebuilt binary for Microsoft Windows.
They are usually provided for the convenience of users. These files
usually just take up space in the tarball and are of no use in Debian.
.
Check if upstream also provides source-only tarballs that you can use as
the upstream distribution instead. If not, you may want to ask upstream
to provide source-only tarballs.
Tag: source-contains-waf-binary
Severity: important
Certainty: certain
Info: The source tarball contains a waf binary. This file is a Python
script with an embedded bzip2 archive, which is uncompressed and unpacked
at runtime.
.
Although corresponding sources can be easily extracted, FTP Team does not
consider waf binary as the preferred form of modification; it should be
provided unpacked instead, or completely removed, if possible.
.
You might want to follow these guidelines to obtain an unpacked waf:
http://wiki.debian.org/UnpackWaf
Ref: http://wiki.debian.org/UnpackWaf, #654523
Tag: tar-errors-from-source
Severity: normal
Certainty: wild-guess
Info: tar produced an error while unpacking this source package. This
probably means there's something broken or at least strange about the way
the upstream tar file was constructed. You may want to report this as an
upstream bug.
Tag: control-file-with-CRLF-EOLs
Severity: important
Certainty: possible
Info: The given control file uses CRLF as line terminator
instead of the traditional UNIX LF terminator. Since some
tools were only designed with the UNIX end-of-line terminators in mind,
it is possible that they misbehave or lead to unexpected results.
.
Running the following command against the given file removes any
CR character in the file:
.
sed -i 's/\r//g' path/to/file
Tag: license-problem-json-evil
Severity: serious
Certainty: possible
Info: The given source file is copyrighted under the non free
license of json and the infamous clause:
The Software shall be used for Good, not Evil.
Ref: http://wiki.debian.org/qa.debian.org/jsonevil
Tag: license-problem-gfdl-invariants
Severity: serious
Certainty: possible
Info: The given source file is licensed under GFDL with invariant
section or front-cover or back-cover text.
.
GFDL with invariant sections, front-cover or back-cover texts are not
suitable for main.
.
Should this file be multi-licensed, please override the tag.
.
Should this be a false-positive, please report a bug.
Ref: http://wiki.debian.org/qa.debian.org/gfdlinvariant,
http://www.debian.org/vote/2006/vote_001
Tag: license-problem-non-free-RFC
Severity: serious
Certainty: possible
Info: The given source file is licensed under the newer RFC
license.
.
The majority of IETF documents, such as RFCs, are not licensed
under DFSG-free terms, and should thus not be included in Debian main.
.
If this file is multi-licensed, please override the tag.
.
If this is a false-positive, please report a bug against Lintian.
Ref: https://wiki.debian.org/NonFreeIETFDocuments
Tag: license-problem-non-free-RFC-BCP78
Severity: serious
Certainty: possible
Info: The given source file is licensed under the non-free RFC
license (BCP78).
.
The majority of IETF documents, such as RFCs, are not licensed
under DFSG-free terms, and should thus not be included in Debian main.
.
If this file is multi-licensed, please override the tag.
.
If this is a false-positive, please report a bug against Lintian.
Ref: https://wiki.debian.org/NonFreeIETFDocuments
Tag: license-problem-gfdl-invariants-empty
Severity: minor
Certainty: possible
Info: The given source file is licensed under GFDL, but without any
precision about the presence of invariant sections, front-cover or
back-cover text.
.
GFDL license explicitly requests you to document this non presence.
.
Ref: http://wiki.debian.org/qa.debian.org/gfdlinvariant,
http://www.debian.org/vote/2006/vote_001
Tag: license-problem-gfdl-non-official-text
Severity: pedantic
Certainty: possible
Info: The given source file is licensed under GFDL, but using a
non-official text for the "no invariant sections" part.
.
Please ask upstream to always use (case insensitive):
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
Tag: license-problem-nvidia-intellectual
Severity: serious
Certainty: possible
Info: The following source files include material under a
non-distributable license from Nvidia. Therefore, it is
not even possible to ship this in non-free.
.
Please re-package the package without the file (if possible)
or ask the FTP-masters to remove the package.
.
If the package has been uploaded to Debian before, please
remember to also notify snapshot.debian.org about this
package containing a non-distributable file.
.
If this is a false-positive, please report a bug against Lintian.
Ref: http://bugs.debian.org/724930#27
Tag: license-problem-md5sum-non-distributable-file
Severity: serious
Certainty: certain
Info: The following file is not distributable even in the non-free
archive.
.
Please re-package the package without the file (if possible)
or ask the FTP-masters to remove the package.
.
If the package has been uploaded to Debian before, please
remember to also notify snapshot.debian.org about this
package containing a non-distributable file.
.
If this is a false-positive, please report a bug against Lintian.
Tag: license-problem-md5sum-non-free-file
Severity: serious
Certainty: certain
Info: The following file is not suitable for main or contrib.
.
Please re-package the package without the file (if possible)
or ask the FTP-masters to remove the package.
.
You could also split this package and move this file into the
non-free archive.
.
If this is a false-positive, please report a bug against Lintian.
Tag: source-contains-unsafe-symlink
Severity: serious
Certainty: possible
Info: The source contains an unsafe symlink. If followed, the link
will escape the source root. Note that all absolute symlinks are
unconditionally considered "unsafe" in this case (unlike in binary
packages).
.
If it is a part of the package's testsuite, Lintian may have failed
to recognise it as a test. In that case, please override the tag.
Tag: source-is-missing
Severity: serious
Certainty: possible
Info: The source of the following file is missing. Lintian checked a few
possible paths to find the source, and do not find it.
.
Please repack your package to include the source or add it to
"debian/missing-sources" directory.
.
If this is a false-positive, please report a bug against Lintian.
lintian-2.5.22ubuntu1/checks/source-copyright.pm 0000664 0000000 0000000 00000025630 12311317621 016563 0 ustar # source-copyright-file -- lintian check script -*- perl -*-
# Copyright (C) 2011 Jakub Wilk
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::source_copyright;
use strict;
use warnings;
use autodie;
use List::MoreUtils qw(any);
use Text::Levenshtein qw(distance);
use Lintian::Relation::Version qw(versions_compare);
use Lintian::Tags qw(tag);
use Lintian::Util qw(parse_dpkg_control slurp_entire_file);
my $dep5_last_normative_change = '0+svn~166';
my $dep5_last_overhaul = '0+svn~148';
my %dep5_renamed_fields = (
'format-specification' => 'format',
'maintainer' => 'upstream-contact',
'upstream-maintainer' => 'upstream-contact',
'contact' => 'upstream-contact',
'name' => 'upstream-name',
);
sub run {
my (undef, undef, $info) = @_;
my $copyright_filename = $info->debfiles('copyright');
if (-l $copyright_filename) {
tag 'debian-copyright-is-symlink';
return;
}
if (not -f $copyright_filename) {
my @pkgs = $info->binaries;
tag 'no-debian-copyright';
$copyright_filename = undef;
if (scalar @pkgs == 1) {
# If debian/copyright doesn't exist, and the only a single
# binary package is built, there's a good chance that the
# copyright file is available as
# debian/.copyright.
$copyright_filename = $info->debfiles($pkgs[0] . '.copyright');
if (not -f $copyright_filename or -l $copyright_filename) {
$copyright_filename = undef;
}
}
}
return unless defined $copyright_filename;
my $contents = slurp_entire_file($copyright_filename);
my (@dep5, @lines);
if (
$contents =~ m{
(^ | \n)
(?i: format(:|[-\s]spec) )
(?: . | \n\s+ )*
(?: /dep[5s]?\b | \bDEP-?5\b
| [Mm]achine-readable\s(?:license|copyright)
| /copyright-format/ | CopyrightFormat
| VERSIONED_FORMAT_URL
) }x
) {
# Before trying to parse the copyright as Debian control file, try to
# determine the format URI.
my $first_para = $contents;
$first_para =~ s,^#.*,,mg;
$first_para =~ s,[ \t]+$,,mg;
$first_para =~ s,^\n+,,g;
$first_para =~ s,\n\n.*,\n,s; #;; hi emacs
$first_para =~ s,\n?[ \t]+, ,g;
$first_para =~ m,^Format(?:-Specification)?:\s*(.*),mi;
my $uri = $1;
$uri =~ s/^([^#\s]+)#/$1/ if defined $uri; # strip fragment identifier
if (defined $uri) {
my $original_uri = $uri;
my $version;
if ($uri =~ m,\b(?:rev=REVISION|VERSIONED_FORMAT_URL)\b,) {
tag 'boilerplate-copyright-format-uri', $uri;
} elsif (
$uri =~ s{ http://wiki\.debian\.org/
Proposals/CopyrightFormat\b}{}xsm
) {
$version = '0~wiki';
$uri =~ m,^\?action=recall&rev=(\d+)$,
and $version = "$version~$1";
} elsif ($uri =~ m,^http://dep\.debian\.net/deps/dep5/?$,) {
$version = '0+svn';
} elsif (
$uri =~ s{\A http://svn\.debian\.org/
wsvn/dep/web/deps/dep5\.mdwn\b}{}xsm
) {
$version = '0+svn';
$uri =~ m,^\?(?:\S+[&;])?rev=(\d+)(?:[&;]\S+)?$,
and $version = "$version~$1";
} elsif (
$uri =~ s{ \A http://(?:svn|anonscm)\.debian\.org/
viewvc/dep/web/deps/dep5\.mdwn\b}{}xsm
) {
$version = '0+svn';
$uri =~ m{\A \? (?:\S+[&;])?
(?:pathrev|revision|rev)=(\d+)(?:[&;]\S+)?
\Z}xsm
and $version = "$version~$1";
} elsif (
$uri =~ m{ \A
http://www\.debian\.org/doc/
(?:packaging-manuals/)?copyright-format/(\d+\.\d+)/?
\Z}xsm
) {
$version = $1;
} else {
tag 'unknown-copyright-format-uri', $original_uri;
}
if (defined $version) {
if ($version =~ m,wiki,) {
tag 'wiki-copyright-format-uri', $original_uri;
} elsif ($version =~ m,svn$,) {
tag 'unversioned-copyright-format-uri', $original_uri;
} elsif (versions_compare $version,
'<<', $dep5_last_normative_change) {
tag 'out-of-date-copyright-format-uri', $original_uri;
}
if (versions_compare $version, '>=', $dep5_last_overhaul) {
# We are reasonably certain that we're dealing
# with an up-to-date DEP-5 format. Let's try to do
# more strict checks.
eval {
open(my $fd, '<', \$contents);
@dep5 = parse_dpkg_control($fd, 0, \@lines);
close($fd);
};
if ($@) {
chomp $@;
$@ =~ s/^syntax error at //;
tag 'syntax-error-in-dep5-copyright', $@;
}
}
}
} else {
tag 'unknown-copyright-format-uri';
}
}
if (@dep5) {
my $first_para = shift @dep5;
my %standalone_licenses;
my %required_standalone_licenses;
for my $field (keys %{$first_para}) {
my $renamed_to = $dep5_renamed_fields{$field};
if (defined $renamed_to) {
tag 'obsolete-field-in-dep5-copyright', $field,
$renamed_to, "(line $lines[0]{$field})";
}
}
if ( not defined $first_para->{'format'}
and not defined $first_para->{'format-specification'}) {
tag 'missing-field-in-dep5-copyright', 'format',
"(line $lines[0]{'format'})";
}
for my $license (split_licenses($first_para->{'license'})) {
$required_standalone_licenses{$license} = 1;
}
my @commas_in_files;
my $i = 0;
for my $para (@dep5) {
$i++;
my ($files_fname, $files) = get_field($para, 'files', $lines[$i]);
my $license = get_field($para, 'license', $lines[$i]);
my $copyright = get_field($para, 'copyright', $lines[$i]);
if (not defined $files and defined $license and defined $copyright)
{
tag 'ambiguous-paragraph-in-dep5-copyright',
"paragraph at line $lines[$i]{'START-OF-PARAGRAPH'}";
# If it is the first paragraph, it might be an instance of
# the (no-longer) optional "first Files-field".
$files = '*' if $i == 1;
}
if (defined $license and not defined $files) {
# Standalone license paragraph
if (not $license =~ m/\n/) {
tag 'missing-license-text-in-dep5-copyright',lc $license,
"(paragraph at line $lines[$i]{'START-OF-PARAGRAPH'})";
}
($license, undef) = split /\n/, $license, 2;
for (split_licenses($license)) {
$standalone_licenses{$_} = $i;
}
} elsif (defined $files) {
# Files paragraph
if (not @commas_in_files and $files =~ /,/) {
@commas_in_files = ($i, $files_fname);
}
if (defined $license) {
for (split_licenses($license)) {
$required_standalone_licenses{$_} = $i;
}
} else {
tag 'missing-field-in-dep5-copyright', 'license',
"(paragraph at line $lines[$i]{'START-OF-PARAGRAPH'})";
}
if (not defined $copyright) {
tag 'missing-field-in-dep5-copyright', 'copyright',
"(paragraph at line $lines[$i]{'START-OF-PARAGRAPH'})";
}
} else {
tag 'unknown-paragraph-in-dep5-copyright', 'paragraph at line',
$lines[$i]{'START-OF-PARAGRAPH'};
}
}
if (@commas_in_files) {
my ($paragraph_no, $field_name) = @commas_in_files;
if (not any { m/,/xsm } $info->sorted_index) {
tag 'comma-separated-files-in-dep5-copyright',
'paragraph at line',
$lines[$paragraph_no]{$field_name};
}
}
while ((my $license, $i) = each %required_standalone_licenses) {
if (not defined $standalone_licenses{$license}) {
tag 'missing-license-paragraph-in-dep5-copyright', $license,
"(paragraph at line $lines[$i]{'START-OF-PARAGRAPH'})";
}
}
while ((my $license, $i) = each %standalone_licenses) {
if (not defined $required_standalone_licenses{$license}) {
tag 'unused-license-paragraph-in-dep5-copyright', $license,
"(paragraph at line $lines[$i]{'START-OF-PARAGRAPH'})";
}
}
}
return;
}
sub split_licenses {
my ($license) = @_;
return () unless defined($license);
return () if $license =~ /\n/;
$license =~ s/[(),]//;
return map { "\L$_" } (split(m/\s++(?:and|or)\s++/, $license));
}
sub get_field {
my ($para, $field, $line) = @_;
if (exists $para->{$field}) {
return $para->{$field} unless wantarray;
return ($field, $para->{$field});
}
# Fall back to a "likely misspelling" of the field.
foreach my $f (sort keys %$para) {
if (distance($field, $f) < 3) {
tag 'field-name-typo-in-dep5-copyright', $f, '->', $field,
"(line $line->{$f})";
return $para->{$f} unless wantarray;
return ($f, $para->{$f});
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/debian-readme.desc 0000664 0000000 0000000 00000002723 12153060143 016230 0 ustar Check-Script: debian-readme
Author: Richard Braakman
Abbrev: drm
Type: binary
Needs-Info: debian-readme
Info: This script checks the README.Debian file for various problems.
Tag: readme-debian-mentions-usr-doc
Severity: normal
Certainty: possible
Info: The README.Debian file installed by this package apparently points
users at /usr/doc. /usr/doc has been retired and all documentation
migrated to /usr/share/doc. This reference should probably also be
updated.
Tag: readme-debian-contains-debmake-template
Severity: normal
Certainty: certain
Info: The README.Debian file installed by this package contains one of the
template phrases from the README.Debian provided by deb-make or dh_make:
.
Comments regarding the package
So far nothing to say
<possible notes regarding this package - if none, delete this file>
.
If there is real information in the file, please delete any generic
template phrases. If there is nothing to say in the file, it is best
removed.
Tag: readme-debian-contains-invalid-email-address
Severity: normal
Certainty: certain
Info: The README.Debian file contains an invalid email address: the domain
needs at least one dot. This looks like a mistake.
Tag: spelling-error-in-readme-debian
Severity: minor
Certainty: certain
Info: Lintian found a spelling error in the README.Debian file. Lintian
has a list of common misspellings that it looks for. It does not have a
dictionary like a spelling checker does.
lintian-2.5.22ubuntu1/checks/shared-libs.pm 0000664 0000000 0000000 00000067502 12311317621 015456 0 ustar # shared-libs -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::shared_libs;
use strict;
use warnings;
use autodie;
use File::Basename;
use List::MoreUtils qw(any none);
use Lintian::Data;
use Lintian::Relation;
use Lintian::Tags qw(tag);
use Lintian::Util qw(fail normalize_pkg_path slurp_entire_file);
# Libraries that should only be used in the presence of certain capabilities
# may be located in subdirectories of the standard ldconfig search path with
# one of the following names.
my $HWCAP_DIRS = Lintian::Data->new('shared-libs/hwcap-dirs');
# The following architectures should always have a STACK setting in shared
# libraries to disable executable stack. Other architectures don't always add
# this section and therefore can't be checked.
my %stack_arches = map { $_ => 1 }qw(
alpha
amd64
i386
m68k
powerpc
s390
sparc
);
my $ldconfig_dirs = Lintian::Data->new('shared-libs/ldconfig-dirs');
my $MA_DIRS = Lintian::Data->new('common/multiarch-dirs', qr/\s++/);
sub run {
my ($pkg, $type, $info, $proc, $group) = @_;
my ($must_call_ldconfig, %SONAME, %sharedobject);
my @shlibs;
my @words;
my @devpkgs;
my $objdump = $info->objdump_info;
# 1st step: get info about shared libraries installed by this package
foreach my $file (sort keys %{$objdump}) {
$SONAME{$file} = $objdump->{$file}->{SONAME}[0]
if scalar @{ $objdump->{$file}->{SONAME} };
}
foreach my $file ($info->sorted_index) {
my $fileinfo = $info->file_info($file);
if ($fileinfo =~ m/^[^,]*\bELF\b/ && $fileinfo =~ m/shared object/) {
$sharedobject{$file} = 1;
}
}
if (%SONAME) {
foreach my $bin ($group->get_binary_processables) {
next unless $bin->pkg_name =~ m/\-dev$/;
if ($bin->info->relation('strong')->implies($pkg)) {
push @devpkgs, $bin;
}
}
}
# 2nd step: read package contents
for my $cur_file ($info->sorted_index) {
# shared library?
my $normalized_target;
$normalized_target
= normalize_pkg_path(join('/', dirname($cur_file), $cur_file->link))
if defined $cur_file->link;
if (
exists $SONAME{$cur_file}
or (defined $normalized_target
and exists $SONAME{$normalized_target})
) {
# yes!!
my ($real_file, $perm);
if (exists $SONAME{$cur_file}) {
$real_file = $cur_file;
$perm = $cur_file->operm;
} else {
$real_file = $normalized_target;
# perm not needed for this branch
}
# Installed in a directory controlled by the dynamic
# linker? We have to strip off directories named for
# hardware capabilities.
if (needs_ldconfig($cur_file)) {
# yes! so postinst must call ldconfig
$must_call_ldconfig = $real_file;
}
# At this point, we do not want to process symlinks as
# they will only lead to duplicate warnings.
next unless $cur_file eq $real_file;
# Now that we're sure this is really a shared library, report on
# non-PIC problems.
if ($objdump->{$cur_file}->{TEXTREL}) {
tag 'shlib-with-non-pic-code', $cur_file;
}
my @symbol_names
= map { @{$_}[2] } @{$objdump->{$cur_file}->{SYMBOLS}};
if ( (any { m/^_?exit$/ } @symbol_names)
&& (none { $_ eq 'fork' } @symbol_names)) {
# If it has an INTERP section it might be an application with
# a SONAME (hi openjdk-6, see #614305). Also see the comment
# for "shlib-with-executable-bit" below.
tag 'shlib-calls-exit', $cur_file
unless $objdump->{$cur_file}->{INTERP};
}
# executable?
my $perms = sprintf('%04o', $perm);
if ($perm & 0111) {
# Yes. But if the library has an INTERP section, it's
# designed to do something useful when executed, so don't
# report an error. Also give ld.so a pass, since it's
# special.
tag 'shlib-with-executable-bit', $cur_file, $perms
unless ($objdump->{$cur_file}->{INTERP}
or $cur_file =~ m,^lib(?:32|64)?/ld-[\d.]+\.so$,);
} elsif ($perm != 0644) {
tag 'shlib-with-bad-permissions', $cur_file, $perms;
}
# executable stack. We can only warn about a missing
# section on some architectures. Only warn if there's an
# Architecture field; if that's missing, we'll already be
# complaining elsewhere.
if (not defined $objdump->{$cur_file}->{'PH'}->{STACK}) {
if (defined $info->field('architecture')) {
my $arch = $info->field('architecture');
tag 'shlib-without-PT_GNU_STACK-section', $cur_file
if $stack_arches{$arch};
}
} elsif ($objdump->{$cur_file}->{'PH'}->{STACK}->{flags} ne 'rw-'){
tag 'shlib-with-executable-stack', $cur_file;
}
} elsif ($ldconfig_dirs->known(dirname($cur_file))
&& exists $sharedobject{$cur_file}) {
tag 'sharedobject-in-library-directory-missing-soname', $cur_file;
} elsif ($cur_file =~ m/\.la$/ and not defined $cur_file->link) {
local $_;
open(my $fd, '<', $info->unpacked($cur_file));
while(<$fd>) {
next
unless (m/^(libdir)='(.+?)'$/)
or (m/^(dependency_libs)='(.+?)'$/);
my ($field, $value) = ($1, $2);
if ($field eq 'libdir') {
# dirname with leading slash and without the trailing one.
my $expected = '/' . substr($cur_file->dirname, 0, -1);
$value =~ s,/+$,,;
# python-central is a special case since the
# libraries are moved at install time.
next
if ($value
=~ m,^/usr/lib/python[\d.]+/(?:site|dist)-packages,
and $expected =~ m,^/usr/share/pyshared,);
tag 'incorrect-libdir-in-la-file', $cur_file,
"$value != $expected"
unless($expected eq $value);
} elsif ($field eq 'dependency_libs'){
tag 'non-empty-dependency_libs-in-la-file', $cur_file;
}
}
close($fd);
}
}
# 3rd step: check if shlib symlinks are present and in correct order
for my $shlib_file (keys %SONAME) {
# file found?
if (not $info->index($shlib_file)) {
fail(
"shlib $shlib_file not found in package (should not happen!)");
}
my ($dir, $shlib_name) = $shlib_file =~ m,(.*)/([^/]+)$,;
# not a public shared library, skip it
next unless $ldconfig_dirs->known($dir);
# symlink found?
my $link_file = "$dir/$SONAME{$shlib_file}";
if (not $info->index($link_file)) {
tag 'ldconfig-symlink-missing-for-shlib',
"$link_file $shlib_file $SONAME{$shlib_file}";
} else {
# $link_file really another file?
if ($link_file eq $shlib_file) {
# the library file uses its SONAME, this is ok...
} else {
# $link_file really a symlink?
if ($info->index($link_file)->is_symlink) {
# yes.
# $link_file pointing to correct file?
if ($info->index($link_file)->link eq $shlib_name) {
# ok.
} else {
tag 'ldconfig-symlink-referencing-wrong-file',
join(q{ },
"$link_file ->",
$info->index($link_file)->link,
"instead of $shlib_name");
}
} else {
tag 'ldconfig-symlink-is-not-a-symlink',
"$shlib_file $link_file";
}
}
}
# libtool "-release" variant
$link_file =~ s/-[\d\.]+\.so$/.so/o;
# determine shlib link name (w/o version)
$link_file =~ s/\.so.+$/.so/o;
# shlib symlink may not exist.
# if shlib doesn't _have_ a version, then $link_file and
# $shlib_file will be equal, and it's not a development link,
# so don't complain.
if ($info->index($link_file) and $link_file ne $shlib_file) {
tag 'non-dev-pkg-with-shlib-symlink', "$shlib_file $link_file";
} elsif (@devpkgs) {
# -dev package - it needs a shlib symlink
my $ok = 0;
my @alt;
# If the shared library is in /lib, we have to look for
# the dev symlink in /usr/lib
$link_file = "usr/$link_file" unless $shlib_file =~ m,^usr/,;
push @alt, $link_file;
if ($proc->pkg_src =~ m/^gcc-(\d+.\d+)$/o) {
# gcc has a lot of bi-arch libs and puts the dev symlink
# in slightly different directories (to be co-installable
# with itself I guess). Allegedly, clang (etc.) have to
# handle these special cases, so it should be
# acceptable...
my $gcc_ver = $1;
my $basename = basename($link_file);
my $madir = $MA_DIRS->value($proc->pkg_arch);
my $stem;
# Generally we are looking for
# * usr/lib/gcc/MA-TRIPLET/$gcc_ver/${BIARCH}$basename
#
# Where BIARCH is one of {,32/,n32/,x32/,sf/,hf/}. Note
# the "empty string" as a possible option.
#
# The two-three letter name directory before the
# basename is bi-arch names.
$stem = "usr/lib/gcc/$madir/$gcc_ver" if defined $madir;
# But in the rare case we don't know the Multi-arch dir,
# just do without it as often (but not always) works.
$stem = "usr/lib/gcc/$gcc_ver" unless defined $madir;
push @alt, map { "$stem/$_" } ('', qw(32 n32 x32 sf hf));
}
PKG:
foreach my $devpkg (@devpkgs) {
my $dinfo = $devpkg->info;
foreach my $link (@alt) {
if ($devpkg->info->index($link)) {
$ok = 1;
last PKG;
}
}
}
tag 'dev-pkg-without-shlib-symlink', "$shlib_file $link_file"
unless $ok;
}
}
# 4th step: check shlibs control file
# $version may be undef in very broken packages
my $version = $info->field('version');
my $provides = $pkg;
$provides .= "( = $version)" if defined $version;
# Assume the version to be a non-native version to avoid
# uninitialization warnings later.
$version = '0-1' unless defined $version;
$provides = Lintian::Relation->and($info->relation('provides'), $provides);
my $shlibsf = $info->control('shlibs');
my $symbolsf = $info->control('symbols');
my (%shlibs_control, %symbols_control);
# Libraries with no version information can't be represented by
# the shlibs format (but can be represented by symbols). We want
# to warn about them if they appear in public directories. If
# they're in private directories, assume they're plugins or
# private libraries and are safe.
my %unversioned_shlibs;
for (keys %SONAME) {
my $soname = format_soname($SONAME{$_});
if ($soname !~ / /) {
$unversioned_shlibs{$_} = 1;
tag 'shlib-without-versioned-soname', $_, $soname
if $ldconfig_dirs->known(dirname($_));
}
}
@shlibs = grep { !$unversioned_shlibs{$_} } keys %SONAME;
if (-l $shlibsf) {
# control files are not symlinks, skip this part.
} elsif ($#shlibs == -1) {
# no shared libraries included in package, thus shlibs control
# file should not be present
if (-f $shlibsf) {
tag 'pkg-has-shlibs-control-file-but-no-actual-shared-libs';
}
} else {
# shared libraries included, thus shlibs control file has to exist
if (not -f $shlibsf) {
if ($type ne 'udeb') {
for my $shlib (@shlibs) {
# skip it if it's not a public shared library
next unless $ldconfig_dirs->known(dirname($shlib));
tag 'no-shlibs-control-file', $shlib
unless is_nss_plugin($shlib);
}
}
} else {
my (%shlibs_control_used, @shlibs_depends);
open(my $fd, '<', $shlibsf);
while (<$fd>) {
chop;
next if m/^\s*$/ or /^#/;
# We exclude udebs from the checks for correct shared library
# dependencies, since packages may contain dependencies on
# other udeb packages.
my $udeb = '';
$udeb = 'udeb: ' if s/^udeb:\s+//o;
@words = split(/\s+/o,$_);
my $shlibs_string = $udeb.$words[0].' '.$words[1];
if ($shlibs_control{$shlibs_string}) {
tag 'duplicate-entry-in-shlibs-control-file',
$shlibs_string;
} else {
$shlibs_control{$shlibs_string} = 1;
push(@shlibs_depends, join(' ', @words[2 .. $#words]))
unless $udeb;
}
}
close($fd);
for my $shlib (@shlibs) {
my $shlib_name = $SONAME{$shlib};
$shlib_name = format_soname($shlib_name);
$shlibs_control_used{$shlib_name} = 1;
$shlibs_control_used{'udeb: '.$shlib_name} = 1;
unless (exists $shlibs_control{$shlib_name}) {
# skip it if it's not a public shared library
next unless $ldconfig_dirs->known(dirname($shlib));
# no!!
tag 'shlib-missing-in-control-file', $shlib_name, 'for',
$shlib
unless is_nss_plugin($shlib);
}
}
for my $shlib_name (keys %shlibs_control) {
tag 'unused-shlib-entry-in-control-file', $shlib_name
unless $shlibs_control_used{$shlib_name};
}
# Check that all of the packages listed as dependencies in
# the shlibs file are satisfied by the current package or
# its Provides. Normally, packages should only declare
# dependencies in their shlibs that they themselves can
# satisfy.
#
# Deduplicate the list of dependencies before warning so
# that we don't dupliate warnings.
my %seen;
@shlibs_depends = grep { !$seen{$_}++ } @shlibs_depends;
for my $depend (@shlibs_depends) {
unless ($provides->implies($depend)) {
tag 'shlibs-declares-dependency-on-other-package', $depend;
}
tag 'shlibs-uses-obsolete-relation', $depend
if $depend =~ m/\(\s*[><](?![<>=])\s*/;
}
}
}
# 5th step: check symbols control file. Add back in the unversioned shared
# libraries, since they can still have symbols files.
if (-l $symbolsf) {
# control files are not symlinks, skip this part.
} elsif ($#shlibs == -1 and not %unversioned_shlibs) {
# no shared libraries included in package, thus symbols
# control file should not be present
if (-f $symbolsf) {
tag 'pkg-has-symbols-control-file-but-no-shared-libs';
}
} elsif (not -f $symbolsf) {
if ($type ne 'udeb') {
for my $shlib (@shlibs, keys %unversioned_shlibs) {
# skip it if it's not a public shared library
next unless $ldconfig_dirs->known(dirname($shlib));
tag 'no-symbols-control-file', $shlib
unless is_nss_plugin($shlib);
}
}
} elsif (-f $symbolsf) {
my $version_wo_rev = $version;
$version_wo_rev =~ s/^(.+)-([^-]+)$/$1/;
my ($full_version_count, $full_version_sym) = (0, undef);
my ($debian_revision_count, $debian_revision_sym) = (0, undef);
my ($soname, $dep_package, $dep);
my %symbols_control_used;
my @symbols_depends;
my $dep_templates = 0;
my $meta_info_seen = 0;
my $warned = 0;
my $symbol_count = 0;
open(my $fd, '<', $symbolsf);
while (<$fd>) {
chomp;
next if m/^\s*$/ or /^#/;
if (m/^([^\s|*]\S+)\s\S+\s*(?:\(\S+\s+\S+\)|\#MINVER\#)?/) {
# soname, main dependency template
$soname = $1;
s/^\Q$soname\E\s*//;
$soname = format_soname($soname);
if ($symbols_control{$soname}) {
tag 'duplicate-entry-in-symbols-control-file', $soname;
} else {
$symbols_control{$soname} = 1;
$warned = 0;
foreach my $part (split /\s*,\s*/) {
foreach my $subpart (split /\s*\|\s*/, $part) {
$subpart
=~ m,^(\S+)(\s*(?:\(\S+\s+\S+\)|#MINVER#))?$,;
($dep_package, $dep) = ($1, $2 || '');
if (defined $dep_package) {
push @symbols_depends, $dep_package . $dep;
} else {
tag 'syntax-error-in-symbols-file', $.
unless $warned;
$warned = 1;
}
}
}
}
$dep_templates = 0;
$meta_info_seen = 0;
$symbol_count = 0;
} elsif (m/^\|\s+\S+\s*(?:\(\S+\s+\S+\)|#MINVER#)?/) {
# alternative dependency template
$warned = 0;
if ($meta_info_seen or not defined $soname) {
tag 'syntax-error-in-symbols-file', $.;
$warned = 1;
}
s/^\|\s*//;
foreach my $part (split /\s*,\s*/) {
foreach my $subpart (split /\s*\|\s*/, $part) {
$subpart =~ m,^(\S+)(\s*(?:\(\S+\s+\S+\)|#MINVER#))?$,;
($dep_package, $dep) = ($1, $2 || '');
if (defined $dep_package) {
push @symbols_depends, $dep_package . $dep;
} else {
tag 'syntax-error-in-symbols-file', $.
unless $warned;
$warned = 1;
}
}
}
$dep_templates++ unless $warned;
} elsif (m/^\*\s(\S+):\s\S+/) {
# meta-information
# This should probably be in a hash, but there's
# only one supported value currently
tag 'unknown-meta-field-in-symbols-file', "$1, line $."
unless $1 eq 'Build-Depends-Package';
tag 'syntax-error-in-symbols-file', $.
unless defined $soname and $symbol_count == 0;
$meta_info_seen = 1;
} elsif (m/^\s+(\S+)\s(\S+)(?:\s(\S+(?:\s\S+)?))?$/) {
# Symbol definition
tag 'syntax-error-in-symbols-file', $.
unless defined $soname;
$symbol_count++;
my ($sym, $v, $dep_order) = ($1, $2, $3);
$dep_order ||= '';
if (($v eq $version) and ($version =~ /-/)) {
$full_version_sym ||= $sym;
$full_version_count++;
} elsif (($v =~ /-/)
and (not $v =~ /~$/)
and ($v ne $version_wo_rev)) {
$debian_revision_sym ||= $sym;
$debian_revision_count++;
}
if (length $dep_order) {
if ($dep_order !~ /^\d+$/ or $dep_order > $dep_templates) {
tag 'invalid-template-id-in-symbols-file', $.;
}
}
} else {
# Unparseable line
tag 'syntax-error-in-symbols-file', $.;
}
}
close($fd);
if ($full_version_count) {
$full_version_count--;
my $others = '';
if ($full_version_count > 0) {
$others = " and $full_version_count others";
}
tag 'symbols-file-contains-current-version-with-debian-revision',
"on symbol $full_version_sym$others";
}
if ($debian_revision_count) {
$debian_revision_count--;
my $others = '';
if ($debian_revision_count > 0) {
$others = " and $debian_revision_count others";
}
tag 'symbols-file-contains-debian-revision',
"on symbol $debian_revision_sym$others";
}
for my $shlib (@shlibs, keys %unversioned_shlibs) {
my $shlib_name = $SONAME{$shlib};
$shlib_name = format_soname($shlib_name);
$symbols_control_used{$shlib_name} = 1;
$symbols_control_used{'udeb: '.$shlib_name} = 1;
unless (exists $symbols_control{$shlib_name}) {
# skip it if it's not a public shared library
next unless $ldconfig_dirs->known(dirname($shlib));
tag 'shlib-missing-in-symbols-control-file', $shlib_name,
'for', $shlib
unless is_nss_plugin($shlib);
}
}
for my $shlib_name (keys %symbols_control) {
tag 'unused-shlib-entry-in-symbols-control-file', $shlib_name
unless $symbols_control_used{$shlib_name};
}
# Check that all of the packages listed as dependencies in the symbols
# file are satisfied by the current package or its Provides.
# Normally, packages should only declare dependencies in their symbols
# files that they themselves can satisfy.
#
# Deduplicate the list of dependencies before warning so that we don't
# dupliate warnings.
my %seen;
@symbols_depends = grep { !$seen{$_}++ } @symbols_depends;
for my $depend (@symbols_depends) {
unless ($provides->implies($depend)) {
tag 'symbols-declares-dependency-on-other-package', $depend;
}
}
}
# Compare the contents of the shlibs and symbols control files, but exclude
# from this check shared libraries whose SONAMEs has no version. Those can
# only be represented in symbols files and aren't expected in shlibs files.
if (keys %shlibs_control and keys %symbols_control) {
for my $key (keys %symbols_control) {
unless (exists $shlibs_control{$key} or $key !~ / /) {
tag 'symbols-declared-but-not-shlib', $key;
}
}
}
# 6th step: check pre- and post- control files
if (-f $info->control('preinst') and not -l $info->control('preinst')) {
local $_ = slurp_entire_file($info->control('preinst'));
if (/^[^\#]*\bldconfig\b/m) {
tag 'preinst-calls-ldconfig';
}
}
my $we_call_postinst=0;
if (-f $info->control('postinst') and not -l $info->control('postinst')) {
local $_ = slurp_entire_file($info->control('postinst'));
# Decide if we call ldconfig
if (/^[^\#]*\bldconfig\b/m) {
$we_call_postinst=1;
}
}
if ($type eq 'udeb') {
tag 'udeb-postinst-must-not-call-ldconfig'
if $we_call_postinst;
} else {
tag 'postinst-has-useless-call-to-ldconfig'
if $we_call_postinst and not $must_call_ldconfig;
tag 'postinst-must-call-ldconfig', $must_call_ldconfig
if not $we_call_postinst and $must_call_ldconfig;
}
my $multiarch = $info->field('multi-arch') // 'no';
if ($multiarch eq 'foreign' and $must_call_ldconfig) {
tag 'shlib-in-multi-arch-foreign-package', $must_call_ldconfig;
}
if (-f $info->control('prerm') and not -l $info->control('prerm')) {
local $_ = slurp_entire_file($info->control('prerm'));
if (/^[^\#]*\bldconfig\b/m) {
tag 'prerm-calls-ldconfig';
}
}
if (-f $info->control('postrm') and not -l $info->control('postrm')) {
local $_ = slurp_entire_file($info->control('postrm'));
# Decide if we call ldconfig
if (/^[^\#]*\bldconfig\b/m) {
tag 'postrm-has-useless-call-to-ldconfig',
unless $must_call_ldconfig;
} else {
tag 'postrm-should-call-ldconfig', $must_call_ldconfig
if $must_call_ldconfig;
}
# Decide if we do it safely
s/\bldconfig\b/BldconfigB/g;
s/[ \t]//g;
# this one matches code from debhelper
s/^if\["\$1"=.?remove.?\];?\n*then\n*BldconfigB//gm;
# variations...
s/^if\[.?remove.?="\$1"\];?\n*then\n*BldconfigB//gm;
s/^\["\$1"=.?remove.?\]\&&BldconfigB//gm;
s/^\[.?remove.?="\$1"\]&&BldconfigB//gm;
s/remove(?:\|[^)]+)*\).*?BldconfigB.*?(?:;;|esac)//s;
if (/^[^\#]*BldconfigB/m) {
tag 'postrm-unsafe-ldconfig';
}
}
return;
}
# Extract the library name and the version from an SONAME and return them
# separated by a space. This code should match the split_soname function in
# dpkg-shlibdeps.
sub format_soname {
my $soname = shift;
# libfoo.so.X.X
if ($soname =~ /^(.*)\.so\.(.*)$/) {
$soname = "$1 $2";
# libfoo-X.X.so
} elsif ($soname =~ /^(.*)-(\d.*)\.so$/) {
$soname = "$1 $2";
}
return $soname;
}
# Returns a truth value if the first argument appears to be the path
# to an libc nss plugin (libnss_.so.$version).
sub is_nss_plugin {
my ($path) = @_;
return 1 if $path =~ m,^(.*/)?libnss_[^.]+\.so\.\d+$,o;
return 0;
}
sub needs_ldconfig {
my ($file) = @_;
my $dirname = dirname($file);
my $last;
do {
$dirname =~ s%/([^/]+)$%%;
$last = $1;
} while ($last && $HWCAP_DIRS->known($last));
$dirname .= "/$last" if $last;
# yes! so postinst must call ldconfig
return 1 if $ldconfig_dirs->known($dirname);
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/source-copyright.desc 0000664 0000000 0000000 00000014745 12310413144 017066 0 ustar Check-Script: source-copyright
Author: Jakub Wilk
Abbrev: scpy
Type: source
Needs-Info: debfiles, index
Info: This script checks if a source package conforms to policy
with regard to copyright files.
.
Each source package should have a debian/copyright file.
Tag: debian-copyright-is-symlink
Severity: normal
Certainty: certain
Info: The file debian/copyright is a symlink instead of a regular
file. This makes package checking and manipulation more difficult.
.
This problem may have prevented lintian from performing other checks.
Tag: no-debian-copyright
Severity: minor
Certainty: certain
Ref: policy 12.5
Info: Every package must include the file /usr/share/doc/pkg/copyright.
A copy of this file should be in debian/copyright in the source package.
Tag: unknown-copyright-format-uri
Severity: pedantic
Certainty: wild-guess
Info: The copyright file appears to intended as machine-readable, but lintian
cannot recognize its format URI. It could be a typo for a common URI or a
syntax error in the first paragraph. Please file a bug against Lintian if you
believe that the copyright file in syntactically valid and the URI is
correct.
Tag: boilerplate-copyright-format-uri
Severity: normal
Certainty: possible
Info: Format URI of the machine-readable copyright file contains
VERSIONED_FORMAT_URL or REVISION string. Please replace it
with an actual URI or an actual revision number respectively.
Tag: wiki-copyright-format-uri
Severity: pedantic
Certainty: possible
Ref: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Info: Format URI of the machine-readable copyright file refers to Debian Wiki.
.
Debian Wiki is not used for the format development anymore. Please use
http://www.debian.org/doc/packaging-manuals/copyright-format/version/
as the format URI instead.
Tag: unversioned-copyright-format-uri
Severity: pedantic
Certainty: possible
Ref: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Info: Format URI of the machine-readable copyright file is not versioned.
.
Please use
http://www.debian.org/doc/packaging-manuals/copyright-format/version/
as the format URI instead.
Tag: out-of-date-copyright-format-uri
Severity: pedantic
Certainty: possible
Ref: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Info: A newer version of the machine-readable copyright file specification,
than the one referenced by the copyright file, is available.
.
This problem may have prevented lintian from performing other checks.
Tag: syntax-error-in-dep5-copyright
Severity: normal
Certainty: possible
Ref: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Info: The machine-readable copyright file didn't pass Debian control file
syntax check.
.
This issue may hide other issues as Lintian skips some checks on the
file in this case.
Tag: obsolete-field-in-dep5-copyright
Severity: normal
Certainty: possible
Ref: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Info: The machine-readable copyright file uses a field, that used to be defined
by the specification, but has been renamed since then.
.
Please use Format instead of Format-Specification.
.
Please use Upstream-Contact instead of Contact, Maintainer or Upstream-Maintainer.
.
Please use Upstream-Name instead of Name.
Tag: comma-separated-files-in-dep5-copyright
Severity: normal
Certainty: possible
Ref: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Info: A list of files in the machine-readable copyright format appears to be
separated by commas. The file list should be whitespace separated instead.
.
Please note this tag is only emitted once per checked copyright file.
Tag: missing-field-in-dep5-copyright
Severity: normal
Certainty: possible
Ref: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Info: The paragraph in the machine readable copyright file is missing a field
that is required by the specification.
Tag: missing-license-paragraph-in-dep5-copyright
Severity: normal
Certainty: possible
Ref: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Info: The files paragraph in the machine readable copyright file references a
license, for which no standalone license paragraph exists.
Tag: missing-license-text-in-dep5-copyright
Severity: normal
Certainty: possible
Ref: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Info: The standalone license header contains only short license name, but not
the license text.
Tag: unused-license-paragraph-in-dep5-copyright
Severity: minor
Certainty: possible
Ref: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Info: The license paragraph in the machine-readable copyright file is not
referenced by any files paragraph. It could be a typo in the license name or
the license paragraph is simply not needed and can be removed.
Tag: unknown-paragraph-in-dep5-copyright
Severity: normal
Certainty: possible
Ref: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Info: The machine-readable copyright file contains a paragraph that is neither
a standalone license paragraph nor a files paragraph.
Tag: field-name-typo-in-dep5-copyright
Severity: normal
Certainty: possible
Info: The listed field name is a likely misspelling of one of the documented
DEP-5 fields.
.
Lintian will continue by using the "misspelled" variant, but other parsers
are unlikely to do so.
.
Implementation detail: The typo is detected by using "Levenshtein
edit distance". Therefore, if the typo involve several characters,
Lintian may not detect it.
Tag: ambiguous-paragraph-in-dep5-copyright
Severity: normal
Certainty: possible
Ref: #652380, http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Info: The paragraph has a "License" and a "Copyright" field, but no
"Files" field. Technically, this is a valid paragraph per the DEP-5
specification. However, it is mostly likely a mistake.
.
If it is a stand-alone license paragraph, the "Copyright"
field is not needed and should be removed. On the other hand, if it
is a files paragraph, it is missing the "Files" field.
.
Please note that while the "Files" field was optional in some cases
in some of the earlier draft versions, it is mandatory in all
files paragraphs in the current specification.
.
Lintian will attempt to guess what you intended and continue based on
its guess. If the guess is wrong, you may see spurious tags related
to this paragraph.
lintian-2.5.22ubuntu1/checks/automake.pm 0000664 0000000 0000000 00000002512 12311317575 015065 0 ustar # automake -- lintian check script -*- perl -*-
#
# Copyright (C) 2013 Gautier Minster
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::automake;
use strict;
use warnings;
use autodie;
use Lintian::Tags qw(tag);
sub run {
my (undef, undef, $info) = @_;
my $makefile = $info->index('Makefile.am');
# If there's no Makefile.am, automake probably isn't used, we're fine
return unless defined $makefile;
my $deprecated_configure = $info->index('configure.in');
if (defined $deprecated_configure) {
tag 'deprecated-configure-filename';
}
return;
}
1;
lintian-2.5.22ubuntu1/checks/nmu.desc 0000664 0000000 0000000 00000007632 12310413144 014354 0 ustar Check-Script: nmu
Author: Jeroen van Wolffelaar
Abbrev: nmu
Type: source
Needs-Info: debfiles
Info: This script checks if a source package is consistent about its NMU-ness.
Tag: orphaned-package-should-not-have-uploaders
Severity: important
Certainty: certain
Info: Packages with their maintainer set to packages@qa.debian.org, i.e.
orphaned packages, should not have uploaders. Adopt the package properly if
you want to resume its maintenance.
Tag: qa-upload-has-incorrect-version-number
Severity: normal
Certainty: certain
Info: A QA upload (uploading an orphaned package without adopting it) is
always a maintainer upload: it should not get a NMU revision number.
Tag: team-upload-has-incorrect-version-number
Severity: normal
Certainty: certain
Info: A team upload (uploading a package from the same team without adding
oneself as maintainer or uploader) is a maintainer upload: it should not
get a NMU revision number. Team uploads are recognized by the string
"team upload" on the first line of the changelog file.
Tag: source-nmu-has-incorrect-version-number
Severity: normal
Certainty: certain
Info: A source NMU should have a Debian revision of "-x.x" (or "+nmuX" for a
native package). This is to prevent stealing version numbers from the
maintainer.
.
Maybe you didn't intend this upload to be a NMU, in that case, please
double-check that the most recent entry in the changelog is byte-for-byte
identical to the maintainer or one of the uploaders. If this is a local
package (not intended for Debian), you can suppress this warning by
putting "local" in the version number or "local package" on the first
line of the changelog entry.
Ref: devref 5.11.2
Tag: maintainer-upload-has-incorrect-version-number
Severity: normal
Certainty: certain
Info: A maintainer upload should have a Debian revision without dots.
Revisions with dots are reserved for Non-Maintainer Uploads (NMU's), if you
do a maintainer-upload with dots, a potential NMU'er has problems choosing a
correct version number.
Tag: changelog-should-mention-qa
Severity: normal
Certainty: certain
Info: If this upload is to orphan this package, please mention this fact on
the first line of the changelog. If this is a QA upload, please mention "QA
(group) upload" there.
Tag: changelog-should-mention-nmu
Severity: normal
Certainty: certain
Info: When you NMU a package, that fact should be mentioned on the first line
in the changelog entry. Use the words "NMU" or "Non-maintainer upload"
(case insensitive).
.
Maybe you didn't intend this upload to be a NMU, in that case, please
double-check that the most recent entry in the changelog is byte-for-byte
identical to the maintainer or one of the uploaders. If this is a local
package (not intended for Debian), you can suppress this warning by
putting "local" in the version number or "local package" on the first
line of the changelog entry.
Ref: devref 5.11.3
Tag: changelog-should-not-mention-nmu
Severity: normal
Certainty: possible
Info: The first line of the changelog entry for this package appears to
indicate it is a non-maintainer upload (by including either that string
or the string "NMU" and not saying that it's an acknowledgement), but the
changelog indicates the person making this release is one of the
maintainers.
.
If this was intended to be an NMU, do not add yourself as a maintainer or
uploader. Otherwise, please rephrase your changelog entry to not cause
confusion.
Tag: changelog-is-symlink
Severity: normal
Certainty: certain
Info: The file debian/changelog is a symlink instead of a regular
file. This is unnecessary and makes package checking and manipulation
more difficult. If the changelog should be available in the source
package under multiple names, make debian/changelog the real
file and the other names symlinks to it.
.
This problem may have prevented lintian from performing other checks,
leading to undetected changelog errors.
lintian-2.5.22ubuntu1/checks/control-files.desc 0000664 0000000 0000000 00000002661 12153060143 016334 0 ustar Check-Script: control-files
Author: Christian Schwarz
Abbrev: ctl
Type: binary, udeb
Info: Check for unknown control files in the binary package.
Needs-info: bin-pkg-control
Tag: unknown-control-file
Severity: normal
Certainty: possible
Ref: policy B.2
Info: The package contains an unknown control file. Policy says that
putting additional files in the package control area is not generally a
good idea.
Tag: not-allowed-control-file
Severity: serious
Certainty: certain
Info: The package contains a control file that is not allowed in this
type of package. Some control files are only allowed in either .deb
or .udeb packages and must not be included in packages of the other
type. You should probably just remove the file.
Tag: control-file-is-empty
Severity: normal
Certainty: possible
Info: The package contains an empty control file, which is most probably
an error.
Tag: control-file-has-bad-permissions
Severity: serious
Certainty: certain
Ref: policy 10.9
Info: The config, postinst, postrm,
preinst, and prerm control files should use mode 0755;
all other control files should use 0644.
Tag: control-file-has-bad-owner
Severity: serious
Certainty: certain
Ref: policy 10.9
Info: All control files should be owned by root/root.
Tag: control-file-is-not-a-file
Severity: serious
Certainty: certain
Info: The package contains a control file that is not a regular file.
lintian-2.5.22ubuntu1/checks/debian-readme.pm 0000664 0000000 0000000 00000003766 12311317603 015740 0 ustar # debian-readme -- lintian check script -*- perl -*-
# Copyright (C) 1998 Richard Braakman
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::debian_readme;
use strict;
use warnings;
use autodie;
use Lintian::Check qw(check_spelling);
use Lintian::Tags qw(tag);
sub run {
my ($pkg, undef, $info, undef, $group) = @_;
my $readme = '';
open(my $fd, '<', $info->lab_data_path('README.Debian'));
while (my $line = <$fd>) {
if ($line =~ m,/usr/doc\b,) {
tag 'readme-debian-mentions-usr-doc', "line $.";
}
$readme .= $line;
}
close($fd);
my @template =(
'Comments regarding the Package',
'So far nothing to say',
''
);
my $regex = join('|', @template);
if ($readme =~ m/$regex/io) {
tag 'readme-debian-contains-debmake-template';
} elsif ($readme =~ m/^\s*-- [^<]*<([^> ]+.\@[^>.]*)>/m) {
tag 'readme-debian-contains-invalid-email-address', $1;
}
check_spelling('spelling-error-in-readme-debian',
$readme, undef,$group->info->spelling_exceptions);
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/testsuite.desc 0000664 0000000 0000000 00000010374 12310413144 015603 0 ustar Check-Script: testsuite
Author: Nicolas Boulenguez
Type: source
Needs-Info: index, unpacked
Info: This script checks the Testsuite field in package dsc files,
and debian/tests/control if any.
Tag: debian-tests-control-is-not-a-regular-file
Severity: wishlist
Certainty: certain
Info: In case the dsc file contains a Testsuite field, "debian/tests"
must be a directory and contain a "control" regular file.
Tag: debian-tests-control-uses-national-encoding
Severity: normal
Certainty: certain
Info: The debian/tests/control file should be valid UTF-8, an encoding
of the Unicode character set.
.
There are many ways to convert a file from an encoding like
ISO-8859-1; you may for example use "iconv" like:
.
$ iconv -f ISO-8859-1 -t UTF-8 file > file.new
$ mv file.new file
Tag: illegal-runtime-test-name
Severity: normal
Certainty: certain
Info: Runtime test names in debian/tests/control are only allowed to
contain decimal digits, lowercase ASCII letters, plus or minus signs,
dots or slashes.
Ref: http://anonscm.debian.org/gitweb/?p=autopkgtest/autopkgtest.git;a=blob_plain;f=doc/README.package-tests;hb=HEAD
Tag: inconsistent-testsuite-field
Severity: wishlist
Certainty: certain
Info: The package provides a debian/tests/control file but no
Testsuite field in the dsc file, or the field exists but not the
file.
.
For discoverability, packages shipping tests for the autopkgtest
testing framework should declare their presence in the package
dsc file by adding "XS-Testsuite: autopkgtest" to their debian/control.
Ref: http://anonscm.debian.org/gitweb/?p=autopkgtest/autopkgtest.git;a=blob_plain;f=doc/README.package-tests;hb=HEAD
Tag: missing-runtime-tests-field
Severity: normal
Certainty: certain
Info: A mandatory field is missing in some paragraph of the
debian/tests/control file.
Ref: http://anonscm.debian.org/gitweb/?p=autopkgtest/autopkgtest.git;a=blob_plain;f=doc/README.package-tests;hb=HEAD
Tag: missing-runtime-test-file
Severity: normal
Certainty: possible
Info: A test file listed in the debian/tests/control file does not
exist in the package source.
Ref: http://anonscm.debian.org/gitweb/?p=autopkgtest/autopkgtest.git;a=blob_plain;f=doc/README.package-tests;hb=HEAD
Tag: runtime-test-file-is-not-a-regular-file
Severity: wishlist
Certainty: certain
Info: A runtime test listed by debian/tests/control is not a regular
file.
Ref: http://anonscm.debian.org/gitweb/?p=autopkgtest/autopkgtest.git;a=blob_plain;f=doc/README.package-tests;hb=HEAD
Tag: syntax-error-in-debian-tests-control
Severity: normal
Certainty: certain
Info: The debian/tests/control file didn't pass Debian control file
syntax check.
.
This issue may hide other issues as Lintian skips some checks on the
file in this case.
Ref: http://anonscm.debian.org/gitweb/?p=autopkgtest/autopkgtest.git;a=blob_plain;f=doc/README.package-tests;hb=HEAD
Tag: unknown-runtime-tests-feature
Severity: pedantic
Certainty: wild-guess
Info: A paragraph in debian/tests/control mentions a non standard
value for the Features field. Though allowed, this may indicate an
error, as the value will be ignored.
Ref: http://anonscm.debian.org/gitweb/?p=autopkgtest/autopkgtest.git;a=blob_plain;f=doc/README.package-tests;hb=HEAD
Tag: unknown-runtime-tests-field
Severity: pedantic
Certainty: wild-guess
Info: A paragraph in debian/tests/control mentions a non standard
field. Though allowed, this may indicate an error, as the whole
paragraph will be ignored.
Ref: http://anonscm.debian.org/gitweb/?p=autopkgtest/autopkgtest.git;a=blob_plain;f=doc/README.package-tests;hb=HEAD
Tag: unknown-runtime-tests-restriction
Severity: pedantic
Certainty: wild-guess
Info: A paragraph in debian/tests/control mentions a non standard
value for the Restrictions field. Though allowed, this may indicate an
error, as the whole paragraph will be ignored.
Ref: http://anonscm.debian.org/gitweb/?p=autopkgtest/autopkgtest.git;a=blob_plain;f=doc/README.package-tests;hb=HEAD
Tag: unknown-testsuite
Severity: normal
Certainty: certain
Info: The dsc file sets Testsuite to a value other than autopkgtest,
the only one allowed. This field is most probably copied by
dpkg-source from XS-Testsuite in debian/control.
Ref: http://anonscm.debian.org/gitweb/?p=autopkgtest/autopkgtest.git;a=blob_plain;f=doc/README.package-tests;hb=HEAD
lintian-2.5.22ubuntu1/checks/patch-systems.desc 0000664 0000000 0000000 00000020302 12310413144 016346 0 ustar Check-Script: patch-systems
Author: Marc Brockschmidt
Abbrev: pat
Type: source
Info: This script checks for various possible problems when using patch systems
Needs-Info: debfiles, diffstat
Tag: dpatch-build-dep-but-no-patch-list
Severity: normal
Certainty: certain
Info: Using dpatch requires you to explicitly list all patches you want
to apply in debian/patches/00list. This package build-depends on dpatch,
but does not provide a patch list. You should either remove the dpatch
build dependency or add a patch list.
.
Note that an empty file cannot be represented in the Debian diff, so an
empty patch list will disappear in the source package. If you intended
for the series file to be empty, add a comment line.
Tag: dpatch-index-references-non-existent-patch
Severity: important
Certainty: certain
Info: In the 00list file listing all your dpatches, you referenced a file
that does not exist. This will lead to a fatal error when calling dpatch.
Tag: dpatch-missing-description
Severity: wishlist
Certainty: certain
Info: dpatch files should carry a description of the included patch.
Description lines start with "## DP:".
.
As well as a description of the purpose and function of the patch, the
description should ideally contain author information, a URL for the bug
report (if any), Debian or upstream bugs fixed by it, upstream status,
the Debian version and date the patch was first included, and any other
information that would be useful if someone were investigating the
patch and underlying problem. Please consider using the DEP-3 format for
this information.
Ref: http://dep.debian.net/deps/dep3/
Tag: quilt-patch-using-template-description
Severity: wishlist
Certainty: certain
Info: The patch contains a standard DEP-3 template description
included by dpkg-source(1). Please consider replacing the template
with a real description. You can edit the description by using
quilt header -e when the patch is at the top of the stack.
Alternatively, editing the patch in most text editors should work
as well.
Ref: http://dep.debian.net/deps/dep3/
Tag: quilt-build-dep-but-no-series-file
Severity: normal
Certainty: certain
Info: Using quilt requires you to explicitly list all patches you want
to apply in debian/patches/series. This package build-depends on quilt,
but does not provide a patch list. You should either remove the quilt
build dependency or add a series file.
.
Note that an empty file cannot be represented in the Debian diff, so an
empty series file will disappear in the source package. If you intended
for the series file to be empty, add a comment line.
Tag: quilt-series-but-no-build-dep
Severity: normal
Certainty: possible
Info: The package contains a debian/patches/series file usually used by
quilt to apply patches at build time, but quilt is not listed in the
build dependencies.
.
You should either remove the series file if it's effectively not useful
or add quilt to the build-dependencies if quilt is used during the build
process.
.
If you don't need quilt during build but only during maintenance work,
then you can override this warning.
Tag: quilt-patch-with-non-standard-options
Severity: normal
Certainty: certain
Info: The quilt series file contains non-standard options to apply some of
the listed patches. Quilt uses '-p1' by default if nothing is specified
after the name of the patch and the current series file specify something
else for some of the patches listed.
.
For compatibility with the source "3.0 (quilt)" source package format,
you should avoid using any option at all and make sure that your patches
apply with "-p1". This can be done by refreshing all patches like this:
quilt pop -a; while quilt push; do quilt refresh -pab; done
Tag: quilt-series-references-non-existent-patch
Severity: important
Certainty: certain
Info: In the series file listing all your quilt patches, you referenced a
file that does not exist. This will lead to a fatal error when calling quilt.
Tag: quilt-patch-missing-description
Severity: wishlist
Certainty: certain
Info: quilt patch files should start with a description of patch. All
lines before the start of the patch itself are considered part of the
description. You can edit the description with quilt header -e
when the patch is at the top of the stack.
.
As well as a description of the purpose and function of the patch, the
description should ideally contain author information, a URL for the bug
report (if any), Debian or upstream bugs fixed by it, upstream status,
the Debian version and date the patch was first included, and any other
information that would be useful if someone were investigating the
patch and underlying problem. Please consider using the DEP-3 format for
this information.
Ref: http://dep.debian.net/deps/dep3/
Tag: patch-modifying-debian-files
Severity: important
Certainty: certain
Info: A patch stored in debian/patches/ should never modify files
in the debian directory (even when it's only creating new files) because
the debian directory is always directly provided by the Debian packaging.
And you shouldn't have to modify what you choose to provide in the first
place.
.
If the patch provides a new file (say a manual page), place that file
in the upstream directory hierarchy as if it was ready to be submitted.
Tag: patch-system-but-direct-changes-in-diff
Severity: minor
Certainty: certain
Info: The package uses a patch system, but the Debian diff.gz contains
changes to files or creation of additional files outside of the
debian directory. This often indicates accidental changes that
weren't meant to be in the package or changes that were supposed to be
separated out into a patch. The package will also more easily support
possible future source package formats if all changes outside the
debian directory are stored as patches.
Tag: format-3.0-but-debian-changes-patch
Severity: minor
Certainty: certain
Info: This package declares source format 3.0 (quilt), but the Debian
.debian.tar.gz file contains a debian-changes-VERSION patch, which represents
direct changes to files outside of the debian directory. This often
indicates accidental changes that weren't meant to be in the package or changes
that were supposed to be separated out into a patch.
.
If this is intentional, you may wish to consider adding
single-debian-patch to debian/source/options, and/or a patch
header to debian/source/patch-header explaining why this is done.
Tag: more-than-one-patch-system
Severity: minor
Certainty: certain
Info: Either the build-dependencies list more than one patch system or the
package uses the 3.0 (quilt) source format but also has a
dependency on dpatch. It's unlikely that you need both patch
systems at the same time, and having multiple patch systems in play
simultaneously can make understanding and modifying the source package
unnecessarily complex.
Tag: direct-changes-in-diff-but-no-patch-system
Severity: pedantic
Certainty: certain
Info: The Debian diff.gz contains changes to files or creation of additional
files outside the debian directory. Keeping the changes as separate
patches under the control of a patch system allows for more fine grained
control over them. The package will also more easily support possible
future source package formats if all changes outside the debian
directory are stored as patches.
.
If the diff only creates new files that can be copied into place by the
package build rules, consider putting them in the debian
directory rather than using a patch system.
Tag: patch-system-but-no-source-readme
Severity: normal
Certainty: certain
Info: This package build-depends on a patch system such as dpatch or
quilt, but there is no debian/README.source file. This file is
recommended for any package where dpkg-source -x does not result
in the preferred form for making modifications to the package.
.
If you are using quilt and the package needs no other special handling
instructions, you may want to add a debian/README.source
referring to /usr/share/doc/quilt/README.source. Similarly, you
can refer to /usr/share/doc/dpatch/README.source.gz for dpatch.
Ref: policy 4.14
lintian-2.5.22ubuntu1/checks/files.pm 0000664 0000000 0000000 00000235023 12313541655 014366 0 ustar # files -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz and Richard Braakman
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::files;
use strict;
use warnings;
use autodie;
use File::Basename;
use Lintian::Data;
use Lintian::Output qw(warning);
use Lintian::Tags qw(tag);
use Lintian::Util qw(drain_pipe fail is_string_utf8_encoded open_gz
signal_number2name);
use Lintian::SlidingWindow;
my $FONT_PACKAGES = Lintian::Data->new('files/fonts', qr/\s++/);
my $TRIPLETS = Lintian::Data->new('files/triplets', qr/\s++/);
my $LOCALE_CODES = Lintian::Data->new('files/locale-codes', qr/\s++/);
my $INCORRECT_LOCALE_CODES
= Lintian::Data->new('files/incorrect-locale-codes', qr/\s++/);
my $MULTIARCH_DIRS = Lintian::Data->new('common/multiarch-dirs', qr/\s++/,
sub { return { 'dir' => $_[1], 'match' => qr/\Q$_[1]\E/ } });
my $PRIVACY_BREAKER_WEBSITES
= Lintian::Data->new('files/privacy-breaker-websites',
qr/\s*\~\~/o,sub { return qr/$_[1]/xism });
my $PRIVACY_BREAKER_FRAGMENTS
= Lintian::Data->new('files/privacy-breaker-fragments',
qr/\s*\~\~/o,sub { return qr/$_[1]/xism });
my $COMPRESS_FILE_EXTENSIONS
= Lintian::Data->new('files/compressed-file-extensions',
qr/\s++/,sub { return qr/\Q$_[0]\E/ });
# an OR (|) regex of all compressed extension
my $COMPRESS_FILE_EXTENSIONS_OR_ALL = sub { qr/(:?$_[0])/ }
->(
join('|',
map {$COMPRESS_FILE_EXTENSIONS->value($_) }
$COMPRESS_FILE_EXTENSIONS->all));
# see tag duplicated-compressed-file
my $DUPLICATED_COMPRESSED_FILE_REGEX
= qr/^(.+)\.(?:$COMPRESS_FILE_EXTENSIONS_OR_ALL)$/;
# see tag compressed-symlink-with-wrong-ext
my $COMPRESSED_SYMLINK_POINTING_TO_COMPRESSED_REGEX
= qr/\.($COMPRESS_FILE_EXTENSIONS_OR_ALL)\s*$/;
# vcs control files
my $VCS_FILES = Lintian::Data->new(
'files/vcs-control-files',
qr/\s++/,
sub {
my $regexp = $_[0];
$regexp =~ s/\${COMPRESS_EXT}/$COMPRESS_FILE_EXTENSIONS_OR_ALL/g;
return qr/(:?$regexp)/x;
});
# an OR (|) regex of all vcs files
my $VCS_FILES_OR_ALL = sub { qr/(?:$_[0])/ }
->(join('|', map { $VCS_FILES->value($_) } $VCS_FILES->all));
# A list of known packaged Javascript libraries
# and the packages providing them
my @jslibraries = (
[qr,(?i)mochikit\.js(\.gz)?$, => qr'libjs-mochikit'],
[
qr,(?i)mootools((\.v|-)[\d\.]+)?
(-((core(-server)?)|more)(-(yc|jm|nc))?)?\.js(\.gz)?$,xsm
=> qr'libjs-mootools'
],
[qr,(?i)jquery(\.(min|lite|pack))?\.js(\.gz)?$, => qr'libjs-jquery'],
[qr,(?i)prototype(-[\d\.]+)?\.js(\.gz)?$, => qr'libjs-prototype'],
[qr,(?i)scriptaculous\.js(\.gz)?$, => qr'libjs-scriptaculous'],
[qr,(?i)fckeditor\.js(\.gz)?$, => qr'fckeditor'],
[qr,(?i)ckeditor\.js(\.gz)?$, => qr'ckeditor'],
[qr,(?i)cropper(\.uncompressed)?\.js(\.gz)?$, => qr'libjs-cropper'],
[qr,(?i)(yahoo|yui)-(dom-event|min)\.js(\.gz)?$, => qr'libjs-yui'],
[qr,(?i)jquery\.cookie(\.min)?\.js(\.gz)?$, => qr'libjs-jquery-cookie'],
[qr,(?i)jquery\.form(\.min)?\.js(\.gz)?$, => qr'libjs-jquery-form'],
[
qr,(?i)jquery\.mousewheel(\.min)?\.js(\.gz)?$, =>
qr'libjs-jquery-mousewheel'
],
[qr,(?i)jquery\.easing(\.min)?\.js(\.gz)?$, => qr'libjs-jquery-easing'],
[
qr,(?i)jquery\.event\.drag(\.min)?\.js(\.gz)?$, =>
qr'libjs-jquery-event-drag'
],
[
qr,(?i)jquery\.event\.drop(\.min)?\.js(\.gz)?$, =>
qr'libjs-jquery-event-drop'
],
[qr,(?i)jquery\.fancybox(\.min)?\.js(\.gz)?$, =>qr'libjs-jquery-fancybox'],
[
qr,(?i)jquery\.galleriffic(\.min)?\.js(\.gz)?$, =>
qr'libjs-jquery-galleriffic'
],
[qr,(?i)jquery\.jfeed(\.min)?\.js(\.gz)?$, => qr'libjs-jquery-jfeed'],
[qr,(?i)jquery\.history(\.min)?\.js(\.gz)?$, => qr'libjs-jquery-history'],
[qr,(?i)jquery\.jush(\.min)?\.js(\.gz)?$, => qr'libjs-jquery-jush'],
[qr,(?i)jquery\.meiomask(\.min)?\.js(\.gz)?$, =>qr'libjs-jquery-meiomask'],
[
qr,(?i)jquery\.opacityrollover(\.min)?\.js(\.gz)?$, =>
qr'libjs-jquery-opacityrollover'
],
[qr,(?i)jquery\.tipsy(\.min)?\.js(\.gz)?$, => qr'libjs-jquery-tipsy'],
[qr,(?i)jquery\.metadata(\.min)?\.js(\.gz)?$, =>qr'libjs-jquery-metadata'],
[
qr,(?i)jquery\.tablesorter(\.min)?\.js(\.gz)?$, =>
qr'libjs-jquery-tablesorter'
],
[
qr,(?i)jquery\.livequery(\.min)?\.js(\.gz)?$, =>
qr'libjs-jquery-livequery'
],
[
qr,(?i)jquery\.treetable(\.min)?\.js(\.gz)?$, =>
qr'libjs-jquery-treetable'
],
# Disabled due to false positives. Needs a content check adding to verify
# that the file being checked is /the/ yahoo.js
# [ qr,(?i)yahoo\.js(\.gz)?$, => qr'libjs-yui' ],
[qr,(?i)jsjac(\.packed)?\.js(\.gz)?$, => qr'libjs-jac'],
[qr,(?i)jsMath(-fallback-\w+)?\.js(\.gz)?$, => qr'jsmath'],
[qr,(?i)tiny_mce(_(popup|src))?\.js(\.gz)?$, => qr'tinymce2?'],
[qr,(?i)dojo\.js(\.uncompressed\.js)?(\.gz)?$, => qr'libjs-dojo-\w+'],
[qr,(?i)dijit\.js(\.uncompressed\.js)?(\.gz)?$, => qr'libjs-dojo-\w+'],
[qr,(?i)strophe(\.min)?\.js(\.gz)?$, => qr'libjs-strophe'],
[qr,(?i)swfobject(?:\.min)?\.js(?:\.gz)?$, => qr'libjs-swfobject'],
[qr,(?i)underscore(\.min)?\.js(\.gz)?$, => qr'libjs-underscore'],
# not yet available in unstable:
# [ qr,(?i)(htmlarea|Xinha(Loader|Core))\.js$, => qr'xinha' ],
);
# A list of known packaged PEAR modules
# and the packages providing them
my @pearmodules = (
[qr,(? 'php-http'],
[qr,Auth\.php$, => 'php-auth'],
[qr,Auth/HTTP\.php$, => 'php-auth-http'],
[qr,Benchmark/(Timer|Profiler|Iterate)\.php$, => 'php-benchmark'],
[qr,Cache\.php$, => 'php-cache'],
[qr,Cache/Lite\.php$, => 'php-cache-lite'],
[qr,Compat\.php$, => 'php-compat'],
[qr,Config\.php$, => 'php-config'],
[qr,CBC\.php$, => 'php-crypt-cbc'],
[qr,Date\.php$, => 'php-date'],
[qr,(? 'php-db'],
[qr,(? 'php-file'],
[qr,Log\.php$, => 'php-log'],
[qr,Log/(file|error_log|null|syslog|sql\w*)\.php$, => 'php-log'],
[qr,Mail\.php$, => 'php-mail'],
[qr,(?i)mime(Part)?\.php$, => 'php-mail-mime'],
[qr,mimeDecode\.php$, => 'php-mail-mimedecode'],
[qr,FTP\.php$, => 'php-net-ftp'],
[qr,(? 'php-net-imap'],
[qr,SMTP\.php$, => 'php-net-smtp'],
[qr,(? 'php-net-socket'],
[qr,IPv4\.php$, => 'php-net-ipv4'],
[qr,(? 'php-net-ldap'],
);
# A list of known packaged php (!PEAR) libraries
# and the packages providing them
my @phplibraries = (
[qr,(?i)adodb\.inc\.php$, => qr'libphp-adodb'],
[qr,(?i)Smarty(_Compiler)?\.class\.php$, => qr'smarty3?'],
[qr,(?i)class\.phpmailer(\.(php|inc))+$, => qr'libphp-phpmailer'],
[qr,(?i)phpsysinfo\.dtd$, => qr'phpsysinfo'],
[qr,(?i)class\.(Linux|(Open|Net|Free|)BSD)\.inc\.php$, => qr'phpsysinfo'],
[qr,Auth/(OpenID|Yadis/Yadis)\.php$, => qr'php-openid'],
[qr,(?i)Snoopy\.class\.(php|inc)$, => qr'libphp-snoopy'],
[qr,(?i)markdown\.php$, => qr'libmarkdown-php'],
[qr,(?i)geshi\.php$, => qr'php-geshi'],
[qr,(?i)(class[.-])?pclzip\.(inc|lib)?\.php$, => qr'libphp-pclzip'],
[qr,(?i).*layersmenu.*/(lib/)?PHPLIB\.php$, => qr'libphp-phplayersmenu'],
[qr,(?i)phpSniff\.(class|core)\.php$, => qr'libphp-phpsniff'],
[qr,(?i)(class\.)?jabber\.php$, => qr'libphp-jabber'],
[qr,(?i)(class[\.-])?simplepie(\.(php|inc))+$, => qr'libphp-simplepie'],
[qr,(?i)jpgraph\.php$, => qr'libphp-jpgraph'],
[qr,(?i)fpdf\.php$, => qr'php-fpdf'],
[qr,(?i)getid3\.(lib\.)?(\.(php|inc))+$, => qr'php-getid3'],
[qr,(?i)streams\.php$, => qr'php-gettext'],
[qr,(?i)rss_parse\.(php|inc)$, => qr'libphp-magpierss'],
[qr,(?i)unit_tester\.php$, => qr'php-simpletest'],
[qr,(?i)Sparkline\.php$, => qr'libsparkline-php'],
[qr,(?i)(?:class\.)?nusoap\.(?:php|inc)$, => qr'libnusoap-php'],
[qr,(?i)HTMLPurifier\.php$, => qr'php-htmlpurifier'],
# not yet available in unstable:,
# [ qr,(?i)IXR_Library(\.inc|\.php)+$, => qr'libphp-ixr' ],
# [ qr,(?i)(class\.)?kses\.php$, => qr'libphp-kses' ],
);
# A list of known non-free flash executables
my @flash_nonfree = (
qr<(?i)dewplayer(?:-\w+)?\.swf$>,
qr<(?i)(?:mp3|flv)player\.swf$>,
# Situation needs to be clarified:
# qr,(?i)multipleUpload\.swf$,
# qr,(?i)xspf_jukebox\.swf$,
);
my %PATH_DIRECTORIES = map { $_ => 1 } qw(
bin/ sbin/ usr/bin/ usr/sbin usr/games/ );
# Common files stored in /usr/share/doc/$pkg that aren't sufficient to
# consider the package non-empty.
my $STANDARD_FILES = Lintian::Data->new('files/standard-files');
# Obsolete path
my $OBSOLETE_PATHS = Lintian::Data->new(
'files/obsolete-paths',
qr/\s*\->\s*/,
sub {
my @sliptline = split(/\s*\~\~\s*/, $_[1], 2);
if (scalar(@sliptline) != 2) {
fail 'Syntax error in files/obsolete-paths', $.;
}
my ($newdir, $moreinfo) = @sliptline;
return {
'newdir' => $newdir,
'moreinfo' => $moreinfo,
'match' => qr/$_[0]/x,
'olddir' => $_[0],
};
});
sub run {
my ($pkg, $type, $info, $proc) = @_;
my ($is_python, $is_perl, $has_binary_perl_file);
my @nonbinary_perl_files_in_lib;
my %linked_against_libvga;
my $py_support_nver;
my @devhelp;
my @devhelp_links;
# X11 bitmapped font directories under /usr/share/fonts/X11 in which we've
# seen files.
my %x11_font_dirs;
my $arch_dep_files = 0;
# Note: $proc->pkg_src never includes the source version.
my $source_pkg = $proc->pkg_src;
my $pkg_section = $info->field('section', '');
my $arch = $info->field('architecture', '');
my $isma_same = $info->field('multi-arch', '') eq 'same';
my $ppkg = quotemeta($pkg);
# find out which files are scripts
my %script = map {$_ => 1} (sort keys %{$info->scripts});
# We only want to warn about these once.
my $warned_debug_name = 0;
# Check if package is empty
my $is_dummy = $info->is_pkg_class('any-meta');
# read data from objdump-info file
foreach my $file (sort keys %{$info->objdump_info}) {
my $objdump = $info->objdump_info->{$file};
if (defined $objdump->{NEEDED}) {
for my $lib (@{$objdump->{NEEDED}}) {
$linked_against_libvga{$file} = 1
if $lib =~ /^libvga\.so\./;
}
}
}
if (!$is_dummy) {
my $is_empty = 1;
for my $file ($info->sorted_index) {
my $fname = $file->name;
# Ignore directories
unless ($fname =~ m,/$,) {
# Skip if $file is outside /usr/share/doc/$pkg directory
if ($fname !~ m,^usr/share/doc/\Q$pkg\E,) {
# - except if it is an lintian override.
next
if $fname =~ m{\A
usr/share/lintian/overrides/$ppkg(?:\.gz)?
\Z}xsm;
$is_empty = 0;
last;
}
# Skip if /usr/share/doc/$pkg has files in a subdirectory
if ($fname =~ m,^usr/share/doc/\Q$pkg\E/[^/]++/,) {
$is_empty = 0;
last;
}
# Skip /usr/share/doc/$pkg symlinks.
next if $fname eq "usr/share/doc/$pkg";
# For files directly in /usr/share/doc/$pkg, if the
# file isn't one of the uninteresting ones, the
# package isn't empty.
unless ($STANDARD_FILES->known($file->basename)) {
$is_empty = 0;
last;
}
}
}
if ($is_empty) {
tag 'empty-binary-package' if ($type ne 'udeb');
tag 'empty-udeb-package' if ($type eq 'udeb');
}
}
# Read package contents...
foreach my $file ($info->sorted_index) {
my $fname = $file->name;
my $owner = $file->owner . '/' . $file->group;
my $operm = $file->operm;
my $link = $file->link;
$arch_dep_files = 1 if $fname !~ m,^usr/share/,o && $fname ne 'usr/';
if (exists($PATH_DIRECTORIES{$file->dirname})) {
tag 'file-name-in-PATH-is-not-ASCII', $file
if $file->basename !~ m{\A [[:ascii:]]++ \Z}xsm;
} elsif (!is_string_utf8_encoded($fname)) {
tag 'file-name-is-not-valid-UTF-8', $file;
}
if ($file->is_hardlink) {
my $link_target_dir = $link;
$link_target_dir =~ s,[^/]*$,,;
# It may look weird to sort the file and link target here,
# but since it's a hard link, both files are equal and
# either could be legitimately reported first. tar will
# generate different tar files depending on the hashing of
# the directory, and this sort produces stable lintian
# output despite that.
#
# TODO: actually, policy says 'conffile', not '/etc' ->
# extend!
tag 'package-contains-hardlink', join(' -> ', sort($fname, $link))
if $fname =~ m,^etc/,
or $link =~ m,^etc/,
or $fname !~ m,^\Q$link_target_dir\E[^/]*$,;
}
my ($year) = ($file->date =~ /^(\d{4})/);
if ($year <= 1975) { # value from dak CVS: Dinstall::PastCutOffYear
tag 'package-contains-ancient-file', $file, $file->date;
}
if (
!(
$file->uid < 100
|| $file->uid == 65_534
|| ($file->uid >= 60_000 && $file->uid < 65_000))
|| !(
$file->gid < 100
|| $file->gid == 65_534
|| ($file->gid >= 60_000 && $file->gid < 65_000))
) {
tag 'wrong-file-owner-uid-or-gid', $file,
$file->uid . '/' . $file->gid;
}
# *.devhelp and *.devhelp2 files must be accessible from a directory in
# the devhelp search path: /usr/share/devhelp/books and
# /usr/share/gtk-doc/html. We therefore look for any links in one of
# those directories to another directory. The presence of such a link
# blesses any file below that other directory.
if (defined $link
and $fname =~ m,^usr/share/(?:devhelp/books|gtk-doc/html)/,) {
my $blessed = $file->link_normalized // '';
push(@devhelp_links, $blessed);
}
# check for generic obsolete path
foreach my $obsolete_path ($OBSOLETE_PATHS->all) {
my $obs_data = $OBSOLETE_PATHS->value($obsolete_path);
my $oldpathmatch = $obs_data->{'match'};
if ($fname =~ m{$oldpathmatch}) {
my $oldpath = $obs_data->{'olddir'};
my $newpath = $obs_data->{'newdir'};
my $moreinfo = $obs_data->{'moreinfo'};
tag 'package-install-into-obsolete-dir',
"$file : $oldpath -> $newpath (see also $moreinfo)";
}
}
# ---------------- /etc
if ($fname =~ m,^etc/,) {
# ---------------- /etc/cron.daily, etc.
if ($fname
=~ m,^etc/cron\.(?:daily|hourly|monthly|weekly|d)/[^\.].*[\+\.],
) {
# NB: cron ships ".placeholder" files, which shouldn't be run.
tag 'run-parts-cron-filename-contains-illegal-chars', $file;
}
# ---------------- /etc/cron.d
elsif ($fname =~ m,^etc/cron\.d/[^\.], and $operm != 0644) {
# NB: cron ships ".placeholder" files in etc/cron.d,
# which we shouldn't tag.
tag 'bad-permissions-for-etc-cron.d-script',
sprintf('%s %04o != 0644',$file,$operm);
}
# ---------------- /etc/emacs.*
elsif ( $fname =~ m,^etc/emacs.*/\S,
and $file->is_file
and $operm != 0644) {
tag 'bad-permissions-for-etc-emacs-script',
sprintf('%s %04o != 0644',$file,$operm);
}
# ---------------- /etc/gconf/schemas
elsif ($fname =~ m,^etc/gconf/schemas/\S,) {
tag 'package-installs-into-etc-gconf-schemas', $file;
}
# ---------------- /etc/init.d
elsif ( $fname =~ m,^etc/init\.d/\S,
and $fname !~ m,^etc/init\.d/(?:README|skeleton)$,
and $operm != 0755
and $file->is_file) {
tag 'non-standard-file-permissions-for-etc-init.d-script',
sprintf('%s %04o != 0755',$file,$operm);
}
#----------------- /etc/ld.so.conf.d
elsif ($fname =~ m,^etc/ld\.so\.conf\.d/.+$, and $pkg !~ /^libc/) {
tag 'package-modifies-ld.so-search-path', $file;
}
#----------------- /etc/modprobe.d
elsif ( $fname =~ m,^etc/modprobe\.d/(.+)$,
and $1 !~ m,\.conf$,
and not $file->is_dir) {
tag 'non-conf-file-in-modprobe.d', $file;
}
#---------------- /etc/opt
elsif ($fname =~ m,^etc/opt/.,) {
tag 'dir-or-file-in-etc-opt', $file;
}
#----------------- /etc/pam.conf
elsif ($fname =~ m,^etc/pam.conf, and $pkg ne 'libpam-runtime') {
tag 'config-file-reserved', "$fname by libpam-runtime";
}
#----------------- /etc/php5/conf.d
elsif ($fname =~ m,^etc/php5/conf.d/.+\.ini$,) {
if ($file->is_file) {
open(my $fd, '<', $info->unpacked($file));
while (<$fd>) {
next unless (m/^\s*#/);
tag 'obsolete-comments-style-in-php-ini', $file;
# only warn once per file:
last;
}
close($fd);
}
}
# ---------------- /etc/rc.d && /etc/rc?.d
elsif ( $type ne 'udeb'
and $fname =~ m,^etc/rc(?:\d|S)?\.d/\S,
and $pkg !~ /^(?:sysvinit|file-rc)$/) {
tag 'package-installs-into-etc-rc.d', $file;
}
# ---------------- /etc/rc.boot
elsif ($fname =~ m,^etc/rc\.boot/\S,) {
tag 'package-installs-into-etc-rc.boot', $file;
}
# ---------------- /etc/udev/rules.d
elsif ($fname =~ m,^etc/udev/rules\.d/\S,) {
tag 'udev-rule-in-etc', $file;
}
}
# ---------------- /usr
elsif ($fname =~ m,^usr/,) {
# ---------------- /usr/share/doc
if ($fname =~ m,^usr/share/doc/\S,) {
if ($type eq 'udeb') {
tag 'udeb-contains-documentation-file', $file;
} else {
# file not owned by root?
if ($owner ne 'root/root') {
tag 'bad-owner-for-doc-file',
"$fname $owner != root/root";
}
# file directly in /usr/share/doc ?
if ($file->is_file and $fname =~ m,^usr/share/doc/[^/]+$,){
tag 'file-directly-in-usr-share-doc', $file;
}
# executable in /usr/share/doc ?
if ( $file->is_file
and $fname !~ m,^usr/share/doc/(?:[^/]+/)?examples/,
and ($operm & 0111)) {
if ($script{$file}) {
tag 'script-in-usr-share-doc', $file;
} else {
tag 'executable-in-usr-share-doc', $file,
(sprintf '%04o', $operm);
}
}
# zero byte file in /usr/share/doc/
if ($file->size == 0 and $file->is_regular_file) {
# Exceptions: examples may contain empty files for various
# reasons, Doxygen generates empty *.map files, and Python
# uses __init__.py to mark module directories.
unless (
$fname =~ m,^usr/share/doc/(?:[^/]+/)?examples/,
or $fname=~ m,^usr/share/doc/(?:.+/)?html/.*\.map$,
or $fname
=~ m,^usr/share/doc/(?:.+/)?__init__\.py$,){
tag 'zero-byte-file-in-doc-directory', $file;
}
}
# gzipped zero byte files:
# 276 is 255 bytes (maximal length for a filename)
# + gzip overhead
if ( $fname =~ m,.gz$,
and $file->size <= 276
and $file->is_file
and $info->file_info($file) =~ m/gzip compressed/) {
my $fd = open_gz($info->unpacked($file));
my $f = <$fd>;
close($fd);
unless (defined $f and length $f) {
tag 'zero-byte-file-in-doc-directory', $file;
}
}
# contains an INSTALL file?
if ($fname =~ m,^usr/share/doc/$ppkg/INSTALL(?:\..+)*$,) {
tag 'package-contains-upstream-install-documentation',
$file;
}
# contains a README for another distribution/platform?
if (
$fname =~ m,^usr/share/doc/$ppkg/readme\.
(?:apple|aix|atari|be|beos|bsd|bsdi
|cygwin|darwin|irix|gentoo|freebsd|mac|macos
|macosx|netbsd|openbsd|osf|redhat|sco|sgi
|solaris|suse|sun|vms|win32|win9x|windows
)(?:\.txt)?(?:\.gz)?$,xi
) {
#<<< No tidy (tag name too long)
tag 'package-contains-readme-for-other-platform-or-distro',
$file;
#>>>
}
# contains a compressed version of objects.inv in
# sphinx-generated documentation?
if ($fname
=~ m,^usr/share/doc/$ppkg/(?:[^/]+/)+objects\.inv\.gz$,
and $info->file_info($file) =~ m/gzip compressed/) {
tag 'compressed-objects.inv', $file;
}
}
}
# ---------------- arch-indep pkconfig
elsif ($file->is_regular_file
&& $fname =~ m,^usr/(?:lib|share)/pkgconfig/[^/]+\.pc$,) {
open(my $fd, '<', $info->unpacked($file));
LINE:
while (my $line = <$fd>) {
# check if pkgconfig file include path point to
# arch specific dir
foreach my $multiarch_dir ($MULTIARCH_DIRS->all) {
my $regex
= $MULTIARCH_DIRS->value($multiarch_dir)->{'match'};
if ($line =~ m{$regex}) {
tag 'pkg-config-multi-arch-wrong-dir',$file;
last LINE;
}
}
}
close($fd);
}
#----------------- /usr/X11R6/
# links to FHS locations are allowed
elsif ($fname =~ m,^usr/X11R6/, and not $file->is_symlink) {
tag 'package-installs-file-to-usr-x11r6', $file;
}
# ---------------- /usr/lib/debug
elsif ($fname =~ m,^usr/lib/debug/\S,) {
unless ($warned_debug_name) {
tag 'debug-package-should-be-named-dbg', $file
unless ($pkg =~ /-dbg$/);
$warned_debug_name = 1;
}
if ( $file->is_file
&& $fname
=~ m,^usr/lib/debug/usr/lib/pyshared/(python\d?(?:\.\d+))/(.++)$,o
) {
my $correct = "usr/lib/debug/usr/lib/pymodules/$1/$2";
tag 'python-debug-in-wrong-location', $file, $correct;
}
}
# ---------------- /usr/lib/sgml
elsif ($fname =~ m,^usr/lib/sgml/\S,) {
tag 'file-in-usr-lib-sgml', $file;
}
# ---------------- perllocal.pod
elsif ($fname =~ m,^usr/lib/perl.*/perllocal.pod$,) {
tag 'package-installs-perllocal-pod', $file;
}
# ---------------- .packlist files
elsif ($fname =~ m,^usr/lib/perl.*/.packlist$,) {
tag 'package-installs-packlist', $file;
}elsif ($fname =~ m,^usr/lib/perl5/.*\.(?:pl|pm)$,) {
push @nonbinary_perl_files_in_lib, $file;
}elsif ($fname =~ m,^usr/lib/perl5/.*\.(?:bs|so)$,) {
$has_binary_perl_file = 1;
}
# ---------------- /usr/lib -- needs to go after the other usr/lib/*
elsif ($fname =~ m,^usr/lib/,) {
if ( $type ne 'udeb'
and $file =~ m,\.(?:bmp|gif|jpeg|jpg|png|tiff|xpm|xbm)$,
and not defined $link) {
tag 'image-file-in-usr-lib', $file;
}
}
# ---------------- /usr/local
elsif ($fname =~ m,^usr/local/\S+,) {
if ($file->is_dir) {
tag 'dir-in-usr-local', $file;
} else {
tag 'file-in-usr-local', $file;
}
}
# ---------------- /usr/share/applications
elsif (
$fname =~ m,^usr/share/applications/mimeinfo.cache(?:\.gz)?$,){
tag 'package-contains-mimeinfo.cache-file', $file;
}
# ---------------- /usr/share/man and /usr/X11R6/man
elsif ($fname =~ m,^usr/X11R6/man/\S+,
or $fname =~ m,^usr/share/man/\S+,) {
if ($type eq 'udeb') {
tag 'udeb-contains-documentation-file', $file;
}
if ($file->is_dir) {
tag 'stray-directory-in-manpage-directory', $file
if ($fname
!~ m,^usr/(?:X11R6|share)/man/(?:[^/]+/)?(?:man\d/)?$,
);
} elsif ($file->is_file and ($operm & 0111)) {
tag 'executable-manpage', $file;
}
}
# ---------------- /usr/share/fonts/X11
elsif ($fname =~ m,^usr/share/fonts/X11/([^/]+)/\S+,) {
my $dir = $1;
if ($dir =~ /^(?:PEX|CID|Speedo|cyrillic)$/) {
tag 'file-in-discouraged-x11-font-directory', $file;
} elsif (
$dir !~ /^(?:100dpi|75dpi|misc|Type1|encodings|util)$/) {
tag 'file-in-unknown-x11-font-directory', $file;
}
if ($dir =~ /^(?:100dpi|75dpi|misc)$/) {
$x11_font_dirs{$dir}++;
}
}
# ---------------- /usr/share/info
elsif ($fname =~ m,^usr/share/info\S+,) {
if ($type eq 'udeb') {
tag 'udeb-contains-documentation-file', $file;
}
if ($fname =~ m,^usr/share/info/dir(?:\.old)?(?:\.gz)?$,) {
tag 'package-contains-info-dir-file', $file;
}
}
# ---------------- /usr/share/linda/overrides
elsif ($fname =~ m,^usr/share/linda/overrides/\S+,) {
tag 'package-contains-linda-override', $file;
}
# ---------------- /usr/share/mime
elsif ($fname =~ m,^usr/share/mime/[^/]+$,) {
tag 'package-contains-mime-cache-file', $file;
}
# ---------------- /usr/share/vim
elsif ($fname =~ m,^usr/share/vim/vim(?:current|\d{2})/([^/]++),) {
my $is_vimhelp = $1 eq 'doc' && $pkg =~ m,^vimhelp-\w++$,;
my $is_vim = $source_pkg =~ m,vim,;
tag 'vim-addon-within-vim-runtime-path', $file
unless $is_vim
or $is_vimhelp;
}
# ---------------- /usr/share
elsif ($fname =~ m,^usr/share/[^/]+$,) {
if ($file->is_file) {
tag 'file-directly-in-usr-share', $file;
}
}
# ---------------- /usr/bin
elsif ($fname =~ m,^usr/bin/,) {
if ( $file->is_dir
and $fname =~ m,^usr/bin/.,
and $fname !~ m,^usr/bin/(?:X11|mh)/,) {
tag 'subdir-in-usr-bin', $file;
}
}
# ---------------- /usr subdirs
elsif ($type ne 'udeb' and $fname =~ m,^usr/[^/]+/$,)
{ # FSSTND dirs
if ($fname =~ m,^usr/(?:dict|doc|etc|info|man|adm|preserve)/,){
tag 'FSSTND-dir-in-usr', $file;
}
# FHS dirs
elsif (
$fname !~ m,^usr/(?:X11R6|X386|
bin|games|include|
lib|
local|sbin|share|
src|spool|tmp)/,x
) {
if ($fname =~ m,^usr/lib(?'libsuffix'64|x?32)/,) {
my $libsuffix = $+{libsuffix};
# eglibc exception is due to FHS. Other are
# transitional, waiting for full
# implementation of multi-arch. Note that we
# allow (e.g.) "lib64" packages to still use
# these dirs, since their use appears to be by
# intention.
unless ($source_pkg eq 'eglibc'
or $pkg =~ m/^lib$libsuffix/) {
tag 'non-multi-arch-lib-dir', $file;
}
} else {
tag 'non-standard-dir-in-usr', $file;
}
}
# unless $file =~ m,^usr/[^/]+-linuxlibc1/,; was tied
# into print above...
# Make an exception for the altdev dirs, which will go
# away at some point and are not worth moving.
}
# ---------------- .desktop files
# People have placed them everywhere, but nowadays the
# consensus seems to be to stick to the fd.org standard
# drafts, which says that .desktop files intended for
# menus should be placed in $XDG_DATA_DIRS/applications.
# The default for $XDG_DATA_DIRS is
# /usr/local/share/:/usr/share/, according to the
# basedir-spec on fd.org. As distributor, we should only
# allow /usr/share.
#
# KDE hasn't moved its files from /usr/share/applnk, so
# don't warn about this yet until KDE adopts the new
# location.
elsif ($fname =~ m,^usr/share/gnome/apps/.*\.desktop$,) {
tag 'desktop-file-in-wrong-dir', $file;
}
# ---------------- non-games-specific data in games subdirectory
elsif ($fname
=~ m,^usr/share/games/(?:applications|mime|icons|pixmaps)/,
and not $file->is_dir) {
tag 'global-data-in-games-directory', $file;
}
}
# ---------------- /var subdirs
elsif ($type ne 'udeb' and $fname =~ m,^var/[^/]+/$,) { # FSSTND dirs
if ($fname =~ m,^var/(?:adm|catman|named|nis|preserve)/,) {
tag 'FSSTND-dir-in-var', $file;
}
# base-files is special
elsif ($pkg eq 'base-files'
&& $fname =~ m,^var/(?:backups|local)/,){
# ignore
}
# FHS dirs with exception in Debian policy
elsif (
$fname !~ m{\A var/
(?: account|lib|cache|crash|games
|lock|log|opt|run|spool|state
|tmp|www|yp)/
}xsm
) {
tag 'non-standard-dir-in-var', $file;
}
} elsif ($type ne 'udeb' and $fname =~ m,^var/lib/games/.,) {
tag 'non-standard-dir-in-var', $file;
# ---------------- /var/lock, /var/run
} elsif ($type ne 'udeb' and $fname =~ m,^var/lock/.,) {
tag 'dir-or-file-in-var-lock', $file;
} elsif ($type ne 'udeb' and $fname =~ m,^var/run/.,) {
tag 'dir-or-file-in-var-run', $file;
} elsif ($type ne 'udeb' and $fname =~ m,^run/.,o) {
tag 'dir-or-file-in-run', $file;
}
# ---------------- /var/www
# Packages are allowed to create /var/www since it's
# historically been the default document root, but they
# shouldn't be installing stuff under that directory.
elsif ($fname =~ m,^var/www/\S+,) {
tag 'dir-or-file-in-var-www', $file;
}
# ---------------- /opt
elsif ($fname =~ m,^opt/.,) {
tag 'dir-or-file-in-opt', $file;
} elsif ($fname =~ m,^hurd/,) {
next;
} elsif ($fname =~ m,^servers/,) {
next;
}
# -------------- /home
elsif ($fname =~ m,^home/.,) {
tag 'dir-or-file-in-home', $file;
} elsif ($fname =~ m,^root/.,) {
tag 'dir-or-file-in-home', $file;
}
# ---------------- /tmp, /var/tmp, /usr/tmp
elsif ($fname =~ m,^tmp/., or $fname =~ m,^(?:var|usr)/tmp/.,) {
tag 'dir-or-file-in-tmp', $file;
}
# ---------------- /mnt
elsif ($fname =~ m,^mnt/.,) {
tag 'dir-or-file-in-mnt', $file;
}
# ---------------- /bin
elsif ($fname =~ m,^bin/,) {
if ($file->is_dir and $fname =~ m,^bin/.,) {
tag 'subdir-in-bin', $file;
}
}
# ---------------- /srv
elsif ($fname =~ m,^srv/.,) {
tag 'dir-or-file-in-srv', $file;
}
# build directory
elsif ($fname =~ m,^var/cache/pbuilder/build/.,
or $fname =~ m,^var/lib/sbuild/.,
or $fname =~ m,^var/lib/buildd/.,) {
unless ($source_pkg eq 'sbuild') {
tag 'dir-or-file-in-build-tree', $file;
}
}
# ---------------- FHS directory?
elsif (
$fname =~ m,^[^/]+/$,o
and $fname !~ m{\A (?:
bin|boot|dev|etc|home|lib
|mnt|opt|root|run|sbin|srv|sys
|tmp|usr|var) /
}oxsm
) {
# Make an exception for the base-files package here and
# other similar packages because they install a slew of
# top-level directories for setting up the base system.
# (Specifically, /cdrom, /floppy, /initrd, and /proc are
# not mentioned in the FHS).
if ($fname =~ m,^lib(?'libsuffix'64|x?32)/,) {
my $libsuffix = $+{libsuffix};
# see comments for ^usr/lib(?'libsuffix'64|x?32)
unless ($source_pkg eq 'eglibc'
or $pkg =~ m/^lib$libsuffix/) {
tag 'non-multi-arch-lib-dir', $file;
}
} else {
unless ($pkg eq 'base-files'
or $pkg eq 'hurd'
or $pkg eq 'hurd-udeb'
or $pkg =~ /^rootskel(?:-bootfloppy)?/) {
tag 'non-standard-toplevel-dir', $file;
}
}
}
# ---------------- compatibility symlinks should not be used
if ( $fname =~ m,^usr/(?:spool|tmp)/,
or $fname =~ m,^usr/(?:doc|bin)/X11/,
or $fname =~ m,^var/adm/,) {
tag 'use-of-compat-symlink', $file;
}
# ---------------- .ali files (Ada Library Information)
if ($fname =~ m,^usr/lib/.*\.ali$, && $operm != 0444) {
tag 'bad-permissions-for-ali-file', $file;
}
# ---------------- any files
if (not $file->is_dir) {
unless (
$type eq 'udeb'
or $fname =~ m,^usr/(?:bin|dict|doc|games|
include|info|lib(?:x?32|64)?|
man|sbin|share|src|X11R6)/,x
or $fname =~ m,^lib(?:x?32|64)?/(?:modules/|libc5-compat/)?,
or $fname =~ m,^var/(?:games|lib|www|named)/,
or $fname =~ m,^(?:bin|boot|dev|etc|sbin)/,
# non-FHS, but still usual
or $fname =~ m,^usr/[^/]+-linux[^/]*/,
or $fname =~ m,^usr/iraf/,
# not allowed, but tested indivudually
or $fname =~ m{\A (?:
home|mnt|opt|root|run|srv
|(?:(?:usr|var)/)?tmp)|var/www/}xsm
) {
tag 'file-in-unusual-dir', $file;
}
}
if ($fname =~ m,^(?:usr/)?lib/([^/]+)/$,o) {
my $subdir = $1;
if ($TRIPLETS->known($subdir)) {
tag 'triplet-dir-and-architecture-mismatch', "$file is for",
$TRIPLETS->value($subdir)
unless ($arch eq $TRIPLETS->value($subdir));
}
}
# ---------------- .pyc/.pyo (compiled python files)
# skip any file installed inside a __pycache__ directory
# - we have a separate check for that directory.
if ($fname =~ m,\.py[co]$,o && $fname !~ m,/__pycache__/,o) {
tag 'package-installs-python-bytecode', $file;
}
# ---------------- __pycache__ (directory for pyc/pyo files)
if ($file->is_dir && $fname =~ m,/__pycache__/,o){
tag 'package-installs-python-pycache-dir', $file;
}
# ---------------- .egg (python egg files)
if (
$fname =~ m,\.egg$,o
&& ( $fname =~ m,usr/lib/python\d+(?:\.\d+/),o
|| $fname =~ m,usr/lib/pyshared,o
|| $fname =~ m,usr/share/,o)
) {
tag 'package-installs-python-egg', $file;
}
# ---------------- /usr/lib/site-python
if ($fname =~ m,^usr/lib/site-python/\S,) {
tag 'file-in-usr-lib-site-python', $file;
}
# ---------------- pythonX.Y extensions
if ($fname =~ m,^usr/lib/python\d\.\d/\S,
and not $fname =~ m,^usr/lib/python\d\.\d/(?:site|dist)-packages/,)
{
# check if it's one of the Python proper packages
unless (defined $is_python) {
$is_python = 0;
$is_python = 1
if $source_pkg =~ m/^python(?:\d\.\d)?$/
or $source_pkg =~ m{\A python\d?-
(?:stdlib-extensions|profiler|old-doctools) \Z}xsm;
}
tag 'third-party-package-in-python-dir', $file
unless $is_python;
}
# ---------------- perl modules
if ($fname =~ m,^usr/(?:share|lib)/perl/\S,) {
# check if it's the "perl" package itself
unless (defined $is_perl) {
$is_perl = 0;
$is_perl = 1 if $source_pkg eq 'perl';
}
tag 'perl-module-in-core-directory', $file
unless $is_perl;
}
# ---------------- perl modules using old libraries
# we do the same check on perl scripts in checks/scripts
{
my $dep = $info->relation('strong');
if ( $file->is_file
&& $fname =~ m,\.pm$,
&& !$dep->implies(
'libperl4-corelibs-perl | perl (<< 5.12.3-7)')) {
open(my $fd, '<', $info->unpacked($file));
while (<$fd>) {
if (
m{ (?:do|require)\s+(?:'|") # do/require
# Huge list of perl4 modules...
(abbrev|assert|bigfloat|bigint|bigrat
|cacheout|complete|ctime|dotsh|exceptions
|fastcwd|find|finddepth|flush|getcwd|getopt
|getopts|hostname|importenv|look|newgetopt
|open2|open3|pwd|shellwords|stat|syslog
|tainted|termcap|timelocal|validate)
# ... so they end with ".pl" rather than ".pm"
\.pl(?:'|")
}xsm
) {
tag 'perl-module-uses-perl4-libs-without-dep',
"$file:$. ${1}.pl";
}
}
close($fd);
}
}
# ---------------- license files
if (
$file->basename =~ m{ \A
# Look for commonly used names for license files
(?: copying | licen[cs]e | l?gpl | bsd | artistic )
# ... possibly followed by a version
[v0-9._-]*
(?:\. .* )? \Z
}xsmi
# Ignore some common extensions for source or compiled
# extension files. There was at least one file named
# "license.el". These are probably license-displaying
# code, not license files. Also ignore executable files
# in general. This means we get false-negatives for
# licenses files marked executable, but these will trigger
# a warning about being executable. (See #608866)
#
# Another exception is made for .html and .php because
# preserving working links is more important than saving
# some bytes, and because a package had a HTML form for
# licenses called like that. Another exception is made
# for various picture formats since those are likely to
# just be simply pictures.
#
# DTD files are excluded at the request of the Mozilla
# suite maintainers. Zope products include license files
# for runtime display. underXXXlicense.docbook files are
# from KDE.
#
# Ignore extra license files in examples, since various
# package building software includes example packages with
# licenses.
and ($operm & 0111) == 0
and not $fname =~ m{ \. (?:
# Common "non-license" file extensions...
el|[ch]|py|cc|pl|pm|hi|p_hi|html|php|rb|xpm
|png|jpe?g|gif|svg|dtd|ui|pc
) \Z}xsm
and not $fname =~ m,^usr/share/zope/Products/.*\.(?:dtml|pt|cpt)$,
and not $fname =~ m,/under\S+License\.docbook$,
and not $fname =~ m,^usr/share/doc/[^/]+/examples/,
# liblicense has a manpage called license
and not $fname =~ m,^usr/share/man/(?:[^/]+/)?man\d/,o
# liblicense (again)
and not $fname =~ m,^usr/share/pyshared-data/,o
and not defined $link
) {
# okay, we cannot rule it out based on file name; but if
# it is an elf or a static library, we also skip it. (In
# case you hadn't guessed; liblicense)
my $fileinfo = $info->file_info($file);
tag 'extra-license-file', $file
unless $fileinfo and ($fileinfo =~ m/^[^,]*\bELF\b/)
or ($fileinfo =~ m/\bcurrent ar archive\b/);
}
# ---------------- .devhelp2? files
if (
$fname =~ m,\.devhelp2?(?:\.gz)?$,
# If the file is located in a directory not searched by devhelp, we
# check later to see if it's in a symlinked directory.
and not $fname =~ m,^usr/share/(?:devhelp/books|gtk-doc/html)/,
and not $fname =~ m,^usr/share/doc/[^/]+/examples/,
) {
push(@devhelp, $fname);
}
# ---------------- weird file names
if ($fname =~ m,\s+\z,) {
tag 'file-name-ends-in-whitespace', $file;
}
if ($fname =~ m,/\*\z,) {
tag 'star-file', $file;
}
# ---------------- misplaced lintian overrides
if ( $fname =~ m,^usr/share/doc/$ppkg/override\.[lL]intian(?:\.gz)?$,
or $fname =~ m,^usr/share/lintian/overrides/$ppkg/.+,) {
tag 'override-file-in-wrong-location', $file;
}
# ---------------- pyshared-data
if ($fname =~ m,^usr/share/python-support/$ppkg\.(?:public|private)$,){
$py_support_nver = '(>= 0.90)';
} elsif ($fname =~ m,^usr/share/python-support/\S+,o
&& !$py_support_nver){
$py_support_nver = '';
}
# ---------------- python file locations
# - The python people kindly provided the following table.
# good:
# /usr/lib/python2.5/site-packages/
# /usr/lib/python2.6/dist-packages/
# /usr/lib/python2.7/dist-packages/
# /usr/lib/python3/dist-packages/
#
# bad:
# /usr/lib/python2.5/dist-packages/
# /usr/lib/python2.6/site-packages/
# /usr/lib/python2.7/site-packages/
# /usr/lib/python3.*/*-packages/
if (
$fname =~ m{\A
(usr/lib/debug/)?
usr/lib/python (\d+(?:\.\d+)?)/
(site|dist)-packages/(.++)
\Z}oxsm
){
my ($debug, $pyver, $loc, $rest) = ($1, $2, $3, $4);
my ($pmaj, $pmin) = split(m/\./o, $pyver, 2);
my @correction = ();
$pmin = 0 unless (defined $pmin);
$debug = '' unless (defined $debug);
next if ($pmaj < 2 or $pmaj > 3); # Not python 2 or 3
if ($pmaj == 2 and $pmin < 6){
# 2.4 and 2.5
if ($loc ne 'site') {
@correction = (
"${debug}usr/lib/python${pyver}/$loc-packages/$rest",
"${debug}usr/lib/python${pyver}/site-packages/$rest"
);
}
} elsif ($pmaj == 3){
# python 3. Everything must be in python3/dist-... and
# not python3.X/
if ($pyver ne '3' or $loc ne 'dist'){
# bad mojo
@correction = (
"${debug}usr/lib/python${pyver}/$loc-packages/$rest",
"${debug}usr/lib/python3/dist-packages/$rest"
);
}
} else {
# python 2.6+
if ($loc ne 'dist') {
@correction = (
"${debug}usr/lib/python${pyver}/$loc-packages/$rest",
"${debug}usr/lib/python${pyver}/dist-packages/$rest"
);
}
}
tag 'python-module-in-wrong-location', @correction
if (@correction);
}
if ($fname =~ m,/icons/[^/]+/(\d+)x(\d+)/(?!animations/).*\.png$,){
my ($dwidth, $dheight) = ($1, $2);
my $path;
if ($file->is_symlink) {
$path = $file->link_normalized;
} else {
$path = $fname;
}
my $fileinfo = $info->file_info($path);
if ($fileinfo && $fileinfo =~ m/,\s*(\d+)\s*x\s*(\d+)\s*,/) {
my ($fwidth, $fheight) = ($1, $2);
my $width_delta = abs($dwidth - $fwidth);
my $height_delta = abs($dheight - $fheight);
tag 'icon-size-and-directory-name-mismatch', $file,
$fwidth.'x'.$fheight
unless ($width_delta <= 2 && $height_delta <= 2);
}
}
# ---------------- plain files
if ($file->is_file) {
if ($fname =~ m,/icons/[^/]+/scalable/.*\.(?:png|xpm)$,) {
tag 'raster-image-in-scalable-directory', $file;
}
# ---------------- backup files and autosave files
if ( $fname =~ /~$/
or $fname =~ m,\#[^/]+\#$,
or $fname =~ m,/\.[^/]+\.swp$,) {
tag 'backup-file-in-package', $file;
}
if ($fname =~ m,/\.nfs[^/]+$,) {
tag 'nfs-temporary-file-in-package', $file;
}
# ---------------- vcs control files
if ($fname =~ m,$VCS_FILES_OR_ALL,) {
tag 'package-contains-vcs-control-file', $file;
}
# ---------------- subversion and svk commit message backups
if ($fname =~ m/svn-commit.*\.tmp$/) {
tag 'svn-commit-file-in-package', $file;
}
if ($fname =~ m/svk-commit.+\.tmp$/) {
tag 'svk-commit-file-in-package', $file;
}
# ---------------- executables with language extensions
if (
$fname =~ m{\A
(?:usr/)?(?:s?bin|games)/[^/]+\.
(?:pl|sh|py|php|rb|tcl|bsh|csh|tcl)
\Z}xsm
) {
tag 'script-with-language-extension', $file;
}
# ---------------- Devel files for Windows
if ( $fname =~ m,/.+\.(?:vcproj|sln|dsp|dsw)(?:\.gz)?$,
and $fname !~ m,^usr/share/doc/,) {
tag 'windows-devel-file-in-package', $file;
}
# ---------------- Autogenerated databases from other OSes
if ($fname =~ m,/Thumbs\.db(?:\.gz)?$,i) {
tag 'windows-thumbnail-database-in-package', $file;
}
if ($fname =~ m,/\.DS_Store(?:\.gz)?$,) {
tag 'macos-ds-store-file-in-package', $file;
}
if ($fname =~ m,/\._[^_/][^/]*$, and $file !~ m/\.swp$/) {
tag 'macos-resource-fork-file-in-package', $file;
}
# ---------------- embedded Javascript libraries
foreach my $jslibrary (@jslibraries) {
if ( $fname =~ m,/$jslibrary->[0],
and $pkg !~ m,^$jslibrary->[1]$,) {
tag 'embedded-javascript-library', $file;
}
}
# ---------------- embedded Feedparser library
if ($fname =~ m,/feedparser\.py$, and $source_pkg ne 'feedparser'){
open(my $fd, '<', $info->unpacked($file));
while (<$fd>) {
if (m,Universal feed parser,) {
tag 'embedded-feedparser-library', $file;
last;
}
}
close($fd);
}
# ---------------- embedded PEAR modules
foreach my $pearmodule (@pearmodules) {
if ( $fname =~ m,/$pearmodule->[0],
and $pkg ne $pearmodule->[1]){
open(my $fd, '<', $info->unpacked($file));
while (<$fd>) {
if (m,/pear[/.],i) {
tag 'embedded-pear-module', $file;
last;
}
}
close($fd);
}
}
# ---------------- embedded php libraries
foreach my $phplibrary (@phplibraries) {
if ( $fname =~ m,/$phplibrary->[0],
and $pkg !~ m,^$phplibrary->[1]$,) {
tag 'embedded-php-library', $file;
}
}
# ---------------- html/javascript
if ($fname =~ m,\.(?:x?html?|js|xht|xml|css)$,i) {
detect_privacy_breach($info,$file);
}
# ---------------- fonts
elsif ($fname =~ m,/([\w-]+\.(?:[to]tf|pfb))$,i) {
my $font = lc $1;
if (my $font_owner = $FONT_PACKAGES->value($font)) {
tag 'duplicate-font-file', "$fname also in", $font_owner
if ($pkg ne $font_owner and $type ne 'udeb');
} elsif ($pkg !~ m/^(?:[ot]tf|t1|x?fonts)-/) {
tag 'font-in-non-font-package', $file;
}
my $finfo = $info->file_info($file) || '';
if ($finfo =~ m/PostScript Type 1 font program data/) {
my $path = $info->unpacked($file);
my $foundadobeline = 0;
open(my $t1pipe, '-|', 't1disasm', $path);
while (my $line = <$t1pipe>) {
if ($foundadobeline) {
if (
$line =~ m{\A [%\s]*
All\s*Rights\s*Reserved\.?\s*
\Z}xsmi
) {
#<<< No perltidy - tag name too long
tag 'license-problem-font-adobe-copyrighted-fragment',
$file;
#>>>
last;
} else {
$foundadobeline = 0;
}
}
if (
$line =~ m{\A
[%\s]*Copyright\s*\(c\) \s*
19\d{2}[\-\s]19\d{2}\s*
Adobe\s*Systems\s*Incorporated\.?\s*\Z}xsmi
) {
$foundadobeline = 1;
}
# If copy pasted from black book they are
# copyright adobe a few line before the only
# place where the startlock is documented is
# in the black book copyrighted fragment
if ($line =~ m/startlock\s*get\s*exec/) {
#<<< no perltidy - tag name too long
tag 'license-problem-font-adobe-copyrighted-fragment-no-credit',
$file;
#>>>
last;
}
}
drain_pipe($t1pipe);
eval {close($t1pipe);};
if (my $err = $@) {
# check if we hit #724571 (t1disasm
# seg. faults on files).
my $exit_code_raw = $?;
fail("closing t1disasm $file: $!") if $err->errno;
my $code = ($exit_code_raw >> 8) & 0xff;
my $sig = $exit_code_raw & 0xff;
fail("t1disasm $file exited $code") if $code;
if ($sig) {
my $signame = signal_number2name($sig);
fail("t1disasm $file killed with signal $signame")
unless $signame eq 'SEGV'
or $signame eq 'BUS';
# This is #724571. The problem is that it
# causes the FTP masters to Lintian
# auto-reject to trigger (and lintian.d.o
# to re-check packages daily if the have a
# file triggering this).
# Technically, t1disasm has only triggered
# a SEGV so far, but it we assume it can
# also get hit by a BUS.
warning(
join(q{ },
"t1disasm $file died with a",
'segmentation fault or bus error'),
'This may hide a license-problem warning.'
);
} else {
fail(
join(q{ },
"t1disasm $file died with raw",
"exit code $exit_code_raw"));
}
}
}
}
# ---------------- non-free .swf files
unless ($info->is_non_free) {
foreach my $flash (@flash_nonfree) {
if ($fname =~ m,/$flash,) {
tag 'non-free-flash', $file;
}
}
}
# ---------------- .gz files
if ($fname =~ m/\.gz$/) {
my $finfo = $info->file_info($file) || '';
if ($finfo !~ m/gzip compressed/) {
tag 'gz-file-not-gzip', $file;
} elsif ($isma_same && $fname !~ m/\Q$arch\E/o) {
my $path = $info->unpacked($file);
my $buff;
open(my $fd, '<', $path);
# We need to read at least 8 bytes
if (sysread($fd, $buff, 1024) >= 8) {
# Extract the flags and the mtime.
# NN NN NN NN, NN NN NN NN - bytes read
# __ __ __ __, $mtime - variables
my (undef, $mtime) = unpack('NN', $buff);
if ($mtime){
tag 'gzip-file-is-not-multi-arch-same-safe',$file;
}
} else {
fail "reading $file: $!";
}
close($fd);
}
}
# --------------- compressed + uncompressed files
if ($fname =~ $DUPLICATED_COMPRESSED_FILE_REGEX) {
tag 'duplicated-compressed-file', $file
if $info->file_info($1);
}
# ---------------- general: setuid/setgid files!
if ($operm & 06000) {
my ($setuid, $setgid) = ('','');
# get more info:
$setuid = $file->owner if $operm & 04000;
$setgid = $file->group if $operm & 02000;
# 1st special case: program is using svgalib:
if (exists $linked_against_libvga{$fname}) {
# setuid root is ok, so remove it
if ($setuid eq 'root') {
undef $setuid;
}
}
# 2nd special case: program is a setgid game
if ( $fname =~ m,^usr/lib/games/\S+,
or $fname =~ m,^usr/games/\S+,) {
# setgid games is ok, so remove it
if ($setgid eq 'games') {
undef $setgid;
}
}
# 3rd special case: allow anything with suid in the name
if ($pkg =~ m,-suid,) {
undef $setuid;
}
# Check for setuid and setgid that isn't expected.
if ($setuid and $setgid) {
tag 'setuid-gid-binary', $file,
sprintf('%04o %s',$operm,$owner);
} elsif ($setuid) {
tag 'setuid-binary', $file,
sprintf('%04o %s',$operm,$owner);
} elsif ($setgid) {
tag 'setgid-binary', $file,
sprintf('%04o %s',$operm,$owner);
}
# Check for permission problems other than the setuid status.
if (($operm & 0444) != 0444) {
tag 'executable-is-not-world-readable', $file,
sprintf('%04o',$operm);
} elsif ($operm != 04755
&& $operm != 02755
&& $operm != 06755
&& $operm != 04754) {
tag 'non-standard-setuid-executable-perm', $file,
sprintf('%04o',$operm);
}
}
# ---------------- general: executable files
elsif ($operm & 0111) {
# executable
if ($owner eq 'root/games') {
if ($operm != 2755) {
tag 'non-standard-game-executable-perm', $file,
sprintf('%04o != 2755',$operm);
}
} else {
if (($operm & 0444) != 0444) {
tag 'executable-is-not-world-readable', $file,
sprintf('%04o',$operm);
} elsif ($operm != 0755) {
tag 'non-standard-executable-perm', $file,
sprintf('%04o != 0755',$operm);
}
}
}
# ---------------- general: normal (non-executable) files
else {
# not executable
# special case first: game data
if ( $operm == 0664
and $owner eq 'root/games'
and $fname =~ m,^var/(lib/)?games/\S+,) {
# everything is ok
} elsif ($operm == 0444 and $fname =~ m,^usr/lib/.*\.ali$,) {
# Ada library information files should be read-only
# since GNAT behaviour depends on that
# everything is ok
} elsif ($operm == 0600 and $fname =~ m,^etc/backup.d/,) {
# backupninja expects configurations files to be 0600
} elsif ($fname =~ m,^etc/sudoers.d/,) {
# sudo requires sudoers files to be mode 0440
tag 'bad-perm-for-file-in-etc-sudoers.d', $file,
sprintf('%04o != 0440', $operm)
unless $operm == 0440;
} elsif ($operm != 0644) {
tag 'non-standard-file-perm', $file,
sprintf('%04o != 0644',$operm);
}
}
}
# ---------------- directories
elsif ($file->is_dir) {
# special cases first:
# game directory with setgid bit
if ( $fname =~ m,^var/(?:lib/)?games/\S+,
and $operm == 02775
and $owner eq 'root/games') {
# do nothing, this is allowed, but not mandatory
} elsif ((
$fname eq 'tmp/'
or $fname eq 'var/tmp/'
or $fname eq 'var/lock/'
)
and $operm == 01777
and $owner eq 'root/root'
) {
# actually shipping files here is warned about elsewhere
} elsif ($fname eq 'usr/src/'
and $operm == 02775
and $owner eq 'root/src') {
# /usr/src as created by base-files is a special exception
} elsif ($fname eq 'var/local/'
and $operm == 02775
and $owner eq 'root/staff') {
# actually shipping files here is warned about elsewhere
}
# otherwise, complain if it's not 0755.
elsif ($operm != 0755) {
tag 'non-standard-dir-perm', $file,
sprintf('%04o != 0755', $operm);
}
if ($fname =~ m,/CVS/?$,) {
tag 'package-contains-vcs-control-dir', $file;
}
if ($fname =~ m,/\.(?:svn|bzr|git|hg)/?$,) {
tag 'package-contains-vcs-control-dir', $file;
}
if ( ($fname =~ m,/\.arch-ids/?$,)
|| ($fname =~ m,/\{arch\}/?$,)) {
tag 'package-contains-vcs-control-dir', $file;
}
if ($fname =~ m,/\.(?:be|ditrack)/?$,) {
tag 'package-contains-bts-control-dir', $file;
}
if ($fname =~ m,/\.xvpics/?$,) {
tag 'package-contains-xvpics-dir', $file;
}
if ($fname =~ m,usr/share/doc/[^/]+/examples/examples/?$,) {
tag 'nested-examples-directory', $file;
}
if ($fname =~ m,^usr/share/locale/([^/]+)/$,) {
# Without encoding:
my ($lwccode) = split(/[.@]/, $1);
# Without country code:
my ($lcode) = split(/_/, $lwccode);
# special exception:
if ($lwccode ne 'l10n') {
if ($INCORRECT_LOCALE_CODES->known($lwccode)) {
tag 'incorrect-locale-code',
"$lwccode ->",
$INCORRECT_LOCALE_CODES->value($lwccode);
} elsif ($INCORRECT_LOCALE_CODES->known($lcode)) {
tag 'incorrect-locale-code',
"$lcode ->",
$INCORRECT_LOCALE_CODES->value($lcode);
} elsif (!$LOCALE_CODES->known($lcode)) {
tag 'unknown-locale-code', $lcode;
} elsif ($LOCALE_CODES->known($lcode)
&& defined($LOCALE_CODES->value($lcode))) {
# If there's a key-value pair in the codes
# list it means the ISO 639-2 code is being
# used instead of ISO 639-1's
tag 'incorrect-locale-code', "$lcode ->",
$LOCALE_CODES->value($lcode);
}
}
}
}
# ---------------- symbolic links
elsif ($file->is_symlink) {
# link
my $mylink = $link;
if ($mylink =~ s,//+,/,g) {
tag 'symlink-has-double-slash', "$fname $link";
}
if ($mylink =~ s,(.)/$,$1,) {
tag 'symlink-ends-with-slash', "$fname $link";
}
# determine top-level directory of file
$fname =~ m,^/?([^/]*),;
my $filetop = $1;
if ($mylink =~ m,^/([^/]*),) {
# absolute link, including link to /
# determine top-level directory of link
my $linktop = $1;
if ($type ne 'udeb' and $filetop eq $linktop) {
# absolute links within one toplevel directory are _not_ ok!
tag 'symlink-should-be-relative', "$fname $link";
}
# Any other case is already definitely non-recursive
tag 'symlink-is-self-recursive', "$fname $link"
if $mylink eq '/';
} else {
# relative link, we can assume from here that the link
# starts nor ends with /
my @filecomponents = split('/', $fname);
# chop off the name of the symlink
pop @filecomponents;
my @linkcomponents = split('/', $mylink);
# handle `../' at beginning of $link
my $lastpop = undef;
my $linkcomponent = undef;
while ($linkcomponent = shift @linkcomponents) {
if ($linkcomponent eq '.') {
tag 'symlink-contains-spurious-segments',"$fname $link"
unless $mylink eq '.';
next;
}
last if $linkcomponent ne '..';
if (@filecomponents) {
$lastpop = pop @filecomponents;
} else {
tag 'symlink-has-too-many-up-segments',"$fname $link";
goto NEXT_LINK;
}
}
if (!defined $linkcomponent) {
# After stripping all starting .. components, nothing left
tag 'symlink-is-self-recursive', "$fname $link";
}
# does the link go up and then down into the same
# directory? (lastpop indicates there was a backref
# at all, no linkcomponent means the symlink doesn't
# get up anymore)
if ( defined $lastpop
&& defined $linkcomponent
&& $linkcomponent eq $lastpop) {
tag 'lengthy-symlink', "$fname $link";
}
if ($#filecomponents == -1) {
# we've reached the root directory
if ( ($type ne 'udeb') && (!defined $linkcomponent)
|| ($filetop ne $linkcomponent)) {
# relative link into other toplevel directory.
# this hits a relative symbolic link in the root too.
tag 'symlink-should-be-absolute', "$fname $link";
}
}
# check additional segments for mistakes like `foo/../bar/'
foreach (@linkcomponents) {
if ($_ eq '..' || $_ eq '.') {
tag 'symlink-contains-spurious-segments',
"$fname $link";
last;
}
}
}
NEXT_LINK:
if ($link =~ $COMPRESSED_SYMLINK_POINTING_TO_COMPRESSED_REGEX) {
# symlink is pointing to a compressed file
# symlink has correct extension?
unless ($fname =~ m,\.$1\s*$,) {
tag 'compressed-symlink-with-wrong-ext', "$fname $link";
}
}
}
# ---------------- special files
else {
# special file
tag 'special-file', $fname, sprintf('%04o',$operm);
}
}
if (!$is_dummy && !$arch_dep_files && $arch ne 'all') {
tag 'package-contains-no-arch-dependent-files'
unless $type eq 'udeb';
}
# python-support check
if (defined($py_support_nver) && $pkg ne 'python-support'){
# Okay - package installs something to /usr/share/python-support/
# $py_support_nver is either the empty string or a version
# describing what we need.
#
# We also skip debug packages since they are okay as long as
# foo-dbg depends on foo (= $version) and foo has its dependency
# correct.
my $dep = $info->relation('depends');
tag 'missing-dependency-on-python-support',
"python-support $py_support_nver"
unless ($pkg =~ m/-dbg$/
|| $dep->implies("python-support $py_support_nver"));
}
# Check for section games but nothing in /usr/games. Check for
# any binary to save ourselves from game-data false positives:
my $games = dir_counts($info, 'usr/games/');
my $other = dir_counts($info, 'bin/') + dir_counts($info, 'usr/bin/');
if ($pkg_section =~ m,games$, and $games == 0 and $other > 0) {
tag 'package-section-games-but-contains-no-game';
}
if ($pkg_section =~ m,games$, and $games > 0 and $other > 0) {
tag 'package-section-games-but-has-usr-bin';
}
if ($pkg_section !~ m,games$, and $games > 0 and $other == 0) {
tag 'games-package-should-be-section-games';
}
# Warn about empty directories, but ignore empty directories in
# /var (packages create directories to hold dynamically created
# data) or /etc (configuration files generated by maintainer
# scripts). Also skip base-files, which is a very special case.
#
# Empty Perl directories are an ExtUtils::MakeMaker artifact that
# will be fixed in Perl 5.10, and people can cause more problems
# by trying to fix it, so just ignore them.
#
# python-support needs a directory for each package even it might
# be empty
if ($pkg ne 'base-files') {
foreach my $dir ($info->sorted_index) {
next if not $dir->is_dir;
my $dirname = $dir->name;
next if ($dirname =~ m{^var/} or $dirname =~ m{^etc/});
if (scalar($dir->children) == 0) {
if ( $dirname ne 'usr/lib/perl5/'
and $dirname ne 'usr/share/perl5/'
and $dirname !~ m;^usr/share/python-support/;) {
tag 'package-contains-empty-directory', $dirname;
}
}
}
}
if (!$has_binary_perl_file && @nonbinary_perl_files_in_lib) {
foreach my $file (@nonbinary_perl_files_in_lib) {
tag 'package-installs-nonbinary-perl-in-usr-lib-perl5', $file;
}
}
# Check for .devhelp2? files that aren't symlinked into paths searched by
# devhelp.
for my $file (@devhelp) {
my $found = 0;
for my $link (@devhelp_links) {
if ($file =~ m,^\Q$link,) {
$found = 1;
last;
}
}
tag 'package-contains-devhelp-file-without-symlink', $file
unless $found;
}
# Check for including multiple different DPIs of fonts in the same X11 bitmap
# font package.
if ($x11_font_dirs{'100dpi'} and $x11_font_dirs{'75dpi'}) {
tag 'package-contains-multiple-dpi-fonts';
}
if ($x11_font_dirs{misc} and keys(%x11_font_dirs) > 1) {
tag 'package-mixes-misc-and-dpi-fonts';
}
return;
}
sub dir_counts {
my ($info, $filename) = @_;
if (my $file = $info->index($filename)) {
return scalar($file->children);
}
return 0;
}
sub is_localhost {
my ($urlshort) = @_;
if( $urlshort =~ m!^(?:[^/]+@)?localhost(?:[:][^/]+)?/!i
|| $urlshort =~ m!^(?:[^/]+@)?::1(?:[:][^/]+)?/!i
|| $urlshort =~ m!^(?:[^/]+@)?127(?:\.\d{1,3}){3}(?:[:][^/]+)?/!i) {
return 1;
}else {
return 0;
}
}
sub detect_privacy_breach {
my ($info, $file) = @_;
my %privacybreachhash = ();
# detect only in regular file
unless($file->is_regular_file) {
return;
}
open(my $fd, '<:raw', $info->unpacked($file));
my $sfd = Lintian::SlidingWindow->new($fd,sub { $_=lc($_); });
while (my $block = $sfd->readwindow()) {
# try generic fragment tagging
foreach my $breaker_tag ($PRIVACY_BREAKER_FRAGMENTS->all) {
my $regex = $PRIVACY_BREAKER_FRAGMENTS->value($breaker_tag);
if ($block =~ m{$regex}) {
unless (exists $privacybreachhash{'tag-'.$breaker_tag}) {
$privacybreachhash{'tag-'.$breaker_tag} = 1;
tag $breaker_tag, $file;
}
}
}
# According to html norm src attribute is used by tags:
#
# audio(v5+), embed (v5+), iframe (v4), frame, img, input, script, source, track(v5), video (v5)
# Add other tags with src due to some javascript code:
# div due to div.js
# div data-href due to jquery
# css with @import
EXTERNAL_TAG:
while(
$block=~ m,
(?'fulltag'
<\s*
(?:
(?'tagattr'div|embed|i?frame|img|input|script|source|track|video)
(?&ba)
src\s*=\s*(?'url'(?&loc))
|
(?'tagattr'div)
(?&ba)
data-href\s*=\s*(?'url'(?&loc))
|
(?'tagattr'applet|object)
(?&ba)
codebase\s*=\s*(?'url'(?&loc))
|
(?'tagattr'object)
(?&ba)
data\s*=\s*(?'url'(?&loc))
|
(?'tagattr'video)
(?&ba)
poster\s*=\s*(?'url'(?&loc))
|
(?'tagattr'link)
(?&ba)
href\s*=\s*(?'url'(?&loc))
)
[^>]*?
>
|
(?'tagattr'[@]import)
\s+ url \s* \( \s*
(?'url'(?&loc))
\s* \) \s* ;
)
(?(DEFINE)
(?(?:\s+[^>]+)? \s+)
(?"(?:http|ftp)s?://[^"\r\n]*?")
),xismog
) {
my $url=$+{url};
my $tagattr=$+{tagattr};
my $fulltag=$+{fulltag};
my $website = $url;
$website =~ s,^"(?:http|ftp)s?://,,;
$website =~ s/"$//;
if (is_localhost($website)){
# do nothing ok
next EXTERNAL_TAG;
}
# reparse fulltag for rel
if ($tagattr eq 'link') {
$fulltag =~ m,<\s* link
(?:\s+[^>]+)? \s+
rel \s* = \s* "([^"\r\n]*?)"
[^>]*?
>,xismog;
my $relcontent = $1;
if (defined($relcontent)) {
if ($relcontent eq 'schema.dct') {
next EXTERNAL_TAG;
}
}
}
# track well known site
foreach my $breaker_tag ($PRIVACY_BREAKER_WEBSITES->all) {
my $regex= $PRIVACY_BREAKER_WEBSITES->value($breaker_tag);
if ($website =~ m{$regex}) {
unless (exists $privacybreachhash{'tag-'.$breaker_tag}){
$privacybreachhash{'tag-'.$breaker_tag}= 1;
tag $breaker_tag, $file;
}
# do not go to generic case
next EXTERNAL_TAG;
}
}
# generic case
unless (exists $privacybreachhash{'tag-generic-'.$website}){
tag 'privacy-breach-generic', $file, $website;
$privacybreachhash{'tag-generic-'.$website} = 1;
}
}
}
close($fd);
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/conffiles.desc 0000664 0000000 0000000 00000005112 12310413144 015514 0 ustar Check-Script: conffiles
Author: Christian Schwarz
Abbrev: cnf
Type: binary
Needs-Info: bin-pkg-control, index
Info: This script checks if the conffiles control file of a binary
package is correct.
Tag: file-in-usr-marked-as-conffile
Severity: serious
Certainty: certain
Ref: policy 10.7.2
Info: All configuration files must reside in /etc. Files below
/usr may not be marked as conffiles since /usr might be
mounted read-only. The local system administrator would therefore not
have a chance to modify this configuration file.
Tag: non-etc-file-marked-as-conffile
Severity: serious
Certainty: possible
Info: A file installed in some other directory than /etc
is marked as conffile. A conffile typically implies a configuration
file, and Policy mandates such files to be in /etc.
Ref: policy 10.7.2
Tag: relative-conffile
Severity: important
Certainty: certain
Ref: policy E.1
Info: All entries in the debian/conffiles control file should
have an absolute path specification.
Tag: duplicate-conffile
Severity: important
Certainty: certain
Info: The file is listed more than once in your debian/conffiles file.
Usually, this is because debhelper (dh_installdeb, compat level 3 or higher)
will add any files in your package located in /etc automatically to the list
of conffiles, so if you do that manually too, you'll get duplicates.
Tag: file-in-etc-not-marked-as-conffile
Severity: serious
Certainty: certain
Ref: policy 10.7
Info: Files in /etc must be marked conffiles if they are included
in a package. Otherwise they should be created by maintainer scripts.
Tag: file-in-etc-rc.d-marked-as-conffile
Severity: important
Certainty: certain
Ref: policy 9.3.3
Info: The symbolic links in /etc/rc?.d may not be marked as conffiles.
Tag: conffile-has-bad-file-type
Severity: important
Certainty: certain
Ref: #690051, #690910
Info: The conffiles lists this path, which is not a file. This will
almost certainly not work.
.
Note that dpkg does not support symlinks being conffiles.
Tag: conffile-is-not-in-package
Severity: important
Certainty: certain
Info: The conffiles control file lists this path, but the path does
not appear to exist in the package. Lintian may also emit this tag
when the file exists, but the canonical name is used in the
"conffiles" control file (e.g. if a parent segment are symlinks).
.
Note that dpkg and Lintian strips all whitespace from the right hand
side of each line. Thus it is not possible for a file ending with
trailing whitespace to be marked as a conffile.
lintian-2.5.22ubuntu1/checks/binaries.pm 0000664 0000000 0000000 00000053132 12311317576 015060 0 ustar # binaries -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz and Richard Braakman
# Copyright (C) 2012 Kees Cook
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::binaries;
use strict;
use warnings;
use autodie;
use constant NUMPY_STRING => 'module compiled against ABI version %x'
. ' but this version of numpy is %x';
use Lintian::Check qw(check_spelling);
use Lintian::Data;
use Lintian::Relation qw(:constants);
use Lintian::Tags qw(tag);
use Lintian::Output qw(debug_msg);
use Lintian::Util qw(fail slurp_entire_file strip);
use File::Spec;
my $ARCH_REGEX = Lintian::Data->new('binaries/arch-regex', qr/\s*\~\~/o,
sub { return qr/$_[1]/ });
my $ARCH_64BIT_EQUIVS
= Lintian::Data->new('binaries/arch-64bit-equivs', qr/\s*\=\>\s*/);
sub _embedded_libs {
my ($key, $val, undef) = @_;
my $result = {'libname' => $key,};
my ($opts, $regex) = split m/\|\|/, $val, 2;
if (!$regex) {
$regex = $opts;
$opts = '';
} else {
strip($opts);
foreach my $optstr (split m/\s++/, $opts) {
my ($opt, $val) = split m/=/, $optstr, 2;
if ($opt eq 'source' or $opt eq 'libname') {
$result->{$opt} = $val;
} elsif ($opt eq 'source-regex') {
$result->{$opt} = qr/$val/;
} else {
fail( "Unknown option $opt used for $key"
. ' (in binaries/embedded-libs)');
}
}
}
if (defined $result->{'source'} and $result->{'source-regex'}) {
fail( "Both source and source-regex used for $key"
. ' (in binaries/embedded-libs)');
} else {
$result->{'source'} = $key unless defined $result->{'source'};
}
$result->{'match'} = qr/$regex/;
return $result;
}
our $EMBEDDED_LIBRARIES
= Lintian::Data->new('binaries/embedded-libs', qr/\s*+\|\|/,
\&_embedded_libs);
our $MULTIARCH_DIRS = Lintian::Data->new('common/multiarch-dirs', qr/\s++/,
sub { return { 'dir' => $_[1], 'match' => qr/\Q$_[1]\E/ } });
sub _split_hash {
my (undef, $val) = @_;
my $hash = {};
map { $hash->{$_} = 1 } split m/\s*,\s*/o, $val;
return $hash;
}
our $HARDENING= Lintian::Data->new('binaries/hardening-tags', qr/\s*\|\|\s*/o,
\&_split_hash);
our $LFS_SYMBOLS = Lintian::Data->new('binaries/lfs-symbols');
our $ARCH_32_REGEX;
sub run {
my ($pkg, $type, $info, $proc, $group) = @_;
my $madir;
my $gnu_triplet_re;
my $ruby_triplet_re;
my $dynsyms = 0;
my $needs_libc = '';
my $needs_libcxx = '';
my $needs_libc_file;
my $needs_libcxx_file;
my $needs_libc_count = 0;
my $needs_libcxx_count = 0;
my $needs_depends_line = 0;
my $has_perl_lib = 0;
my $has_php_ext = 0;
my $uses_numpy_c_abi = 0;
my %SONAME;
my $arch = $info->field('architecture', '');
my $multiarch = $info->field('multi-arch', 'no');
my $srcpkg = $proc->pkg_src;
foreach my $file (sort keys %{$info->objdump_info}) {
my $objdump = $info->objdump_info->{$file};
my $has_lfs = undef;
my $is_profiled = 0;
# Only 32bit ELF binaries can lack LFS.
$ARCH_32_REGEX = $ARCH_REGEX->value('32')
unless defined $ARCH_32_REGEX;
$has_lfs = 1 unless $info->file_info($file) =~ m/$ARCH_32_REGEX/o;
# We don't care if it is a debug file
$has_lfs = 1 if $file =~ m,^usr/lib/debug/,;
if (defined $objdump->{SONAME}) {
foreach my $soname (@{$objdump->{SONAME}}) {
$SONAME{$soname} ||= [];
push @{$SONAME{$soname}}, $file;
}
}
foreach my $symbol (@{$objdump->{SYMBOLS}}) {
my ($foo, $sec, $sym) = @{$symbol};
unless (defined $has_lfs) {
if ($LFS_SYMBOLS->known($sym)) {
# Using a 32bit only interface call, some parts of the
# binary are built without LFS.
$has_lfs = 0;
}
}
next if $is_profiled;
# According to the binutils documentation[1], the profiling symbol
# can be named "mcount", "_mcount" or even "__mcount".
# [1] http://sourceware.org/binutils/docs/gprof/Implementation.html
if ($sec =~ /^GLIBC_.*/ and $sym =~ m{\A _?+ _?+ mcount \Z}xsm){
$is_profiled = 1;
} elsif ($arch ne 'hppa') {
# This code was used to detect profiled code in Wheezy
# (and earlier)
if ( $foo eq '.text'
and $sec eq 'Base'
and$sym eq '__gmon_start__') {
$is_profiled = 1;
}
}
tag 'binary-compiled-with-profiling-enabled', $file
if $is_profiled;
}
tag 'binary-file-compressed-with-upx', $file if $objdump->{'UPX'};
tag 'apparently-corrupted-elf-binary', $file
if $objdump->{'ERRORS'};
tag 'binary-file-built-without-LFS-support', $file
if defined $has_lfs and not $has_lfs;
if ($objdump->{'BAD-DYNAMIC-TABLE'}) {
tag 'binary-with-bad-dynamic-table', $file
unless $file =~ m%^usr/lib/debug/%;
}
}
# For the package naming check, filter out SONAMEs where all the
# files are at paths other than /lib, /usr/lib, or /usr/X11R6/lib.
# This avoids false positives with plugins like Apache modules,
# which may have their own SONAMEs but which don't matter for the
# purposes of this check. Also filter out nsswitch modules
if (defined($MULTIARCH_DIRS->value($arch))) {
$madir = $MULTIARCH_DIRS->value($arch)->{'dir'};
} else {
# In the case that the architecture is "all" or unknown (or we do
# not know the multi-arch path for a known architecture) , we assume
# it the multi-arch path to be this (hopefully!) non-existent path to
# avoid warnings about uninitialized variables.
$madir = './!non-existant-path!/./';
}
$madir = './!non-existant-path!/./' unless defined $madir;
$gnu_triplet_re = quotemeta $madir;
$gnu_triplet_re =~ s,^i386,i[3-6]86,;
$ruby_triplet_re = $gnu_triplet_re;
$ruby_triplet_re =~ s,linux\\-gnu$,linux,;
$ruby_triplet_re =~ s,linux\\-gnu,linux\\-,;
sub lib_soname_path {
my ($dir, @paths) = @_;
foreach my $path (@paths) {
next
if $path
=~ m%^(?:usr/)?lib(?:32|64)?/libnss_[^.]+\.so(?:\.[0-9]+)$%;
return 1 if $path =~ m%^lib/[^/]+$%;
return 1 if $path =~ m%^usr/lib/[^/]+$%;
return 1 if defined $dir && $path =~ m%lib/$dir/[^/]++$%;
return 1 if defined $dir && $path =~ m%usr/lib/$dir/[^/]++$%;
}
return 0;
}
my @sonames
= sort grep { lib_soname_path($madir, @{$SONAME{$_}}) } keys %SONAME;
# try to identify transition strings
my $base_pkg = $pkg;
$base_pkg =~ s/c102\b//o;
$base_pkg =~ s/c2a?\b//o;
$base_pkg =~ s/\dg$//o;
$base_pkg =~ s/gf$//o;
$base_pkg =~ s/-udeb$//o;
$base_pkg =~ s/^lib64/lib/o;
my $match_found = 0;
foreach my $expected_name (@sonames) {
$expected_name =~ s/([0-9])\.so\./$1-/;
$expected_name =~ s/\.so(?:\.|\z)//;
$expected_name =~ s/_/-/g;
if ( (lc($expected_name) eq $pkg)
|| (lc($expected_name) eq $base_pkg)) {
$match_found = 1;
last;
}
}
tag 'package-name-doesnt-match-sonames', "@sonames"
if @sonames && !$match_found;
my %directories;
for my $file ($info->sorted_index) {
my $name = $file->name;
next unless $file->is_dir || $file->is_symlink;
$name =~ s,/\z,,;
$directories{"/$name"}++;
}
my $src = $group->get_source_processable();
my $built_with_golang;
if (defined($src)) {
$built_with_golang
= $src->info->relation('build-depends')->implies('golang-go');
}
# process all files in package
foreach my $file ($info->sorted_index) {
my $fileinfo = $info->file_info($file);
my $objdump = $info->objdump_info->{$file};
# binary or object file?
next
unless ($fileinfo =~ m/^[^,]*\bELF\b/)
or ($fileinfo =~ m/\bcurrent ar archive\b/);
# Warn about Architecture: all packages that contain shared libraries.
if ($arch eq 'all') {
tag 'arch-independent-package-contains-binary-or-object',$file;
}
if ($file =~ m,^etc/,) {
tag 'binary-in-etc', $file;
}
if ($file =~ m,^usr/share/,) {
tag 'arch-dependent-file-in-usr-share', $file;
}
if ($multiarch eq 'same') {
unless ($file
=~ m,\b$gnu_triplet_re\b|/(?:$ruby_triplet_re|java-\d+-openjdk-\Q$arch\E|\.build-id)/,
) {
tag 'arch-dependent-file-not-in-arch-specific-directory',$file;
}
}
# ELF?
next unless $fileinfo =~ m/^[^,]*\bELF\b/o;
if ($arch eq 'all' or not $ARCH_REGEX->known($arch)) {
# arch:all or unknown architecture - not much we can say here
1;
} else {
my $archre = $ARCH_REGEX->value($arch);
my $bad = 1;
if ($fileinfo =~ m/$archre/) {
# If it matches the architecture regex, it is good
$bad = 0;
} elsif ($file =~ m,(?:^|/)lib(x?\d{2})/,
or $file =~ m,^emul/ia(\d{2}),) {
my $bitre = $ARCH_REGEX->value($1);
# Special case - "old" multi-arch dirs
$bad = 0 if $bitre and $fileinfo =~ m/$bitre/;
} elsif ($ARCH_64BIT_EQUIVS->known($arch)
&& $file =~ m,^lib/modules/,) {
my $arch64re
= $ARCH_REGEX->value($ARCH_64BIT_EQUIVS->value($arch));
# Allow amd64 kernel modules to be installed on i386.
$bad = 0 if $fileinfo =~ m/$arch64re/;
} elsif ($arch eq 'amd64') {
my $arch32re = $ARCH_REGEX->value('i386');
# Ignore i386 binaries in amd64 packages for right now.
$bad = 0 if $fileinfo =~ m/$arch32re/;
}
tag 'binary-from-other-architecture', $file if $bad;
}
my $strings = slurp_entire_file($info->strings($file));
my $exceptions = {
%{ $group->info->spelling_exceptions },
'teH' => 1, # From #711207
};
check_spelling('spelling-error-in-binary',$strings, $file,$exceptions);
# stripped?
if ($fileinfo =~ m,not stripped\s*$,o) {
# Is it an object file (which generally can not be
# stripped), a kernel module, debugging symbols, or
# perhaps a debugging package?
unless ($file =~ m,\.k?o$,
or $pkg =~ m/-dbg$/
or $pkg =~ m/debug/
or $file =~ m,/lib/debug/,
or $file =~ m,\.gox$,o) {
if ( $fileinfo =~ m/executable/
and $strings =~ m/^Caml1999X0[0-9][0-9]$/m) {
# Check for OCaml custom executables (#498138)
tag 'ocaml-custom-executable', $file;
} else {
tag 'unstripped-binary-or-object', $file;
}
}
} else {
# stripped but a debug or profiling library?
if (($file =~ m,/lib/debug/,o) or ($file =~ m,/lib/profile/,o)){
tag 'library-in-debug-or-profile-should-not-be-stripped',$file;
} else {
# appropriately stripped, but is it stripped enough?
foreach my $sect ('.note', '.comment') {
if (exists $objdump->{'SH'}->{$sect}) {
tag 'binary-has-unneeded-section', "$file $sect";
}
}
}
}
# rpath is disallowed, except in private directories
if (exists $objdump->{RPATH}) {
foreach my $rpath (
map {File::Spec->canonpath($_)}
keys %{$objdump->{RPATH}}
) {
next
if $rpath
=~ m,^/usr/lib/(?:$madir/)?(?:games/)?(?:\Q$pkg\E|\Q$srcpkg\E)(?:/|\z),;
next if $rpath =~ m,^\$\{?ORIGIN\}?,;
next
if $directories{$rpath}
and $rpath !~ m,^(?:/usr)?/lib(?:/$madir)?/?\z,;
tag 'binary-or-shlib-defines-rpath', "$file $rpath";
}
}
foreach my $emlib ($EMBEDDED_LIBRARIES->all) {
my $ldata = $EMBEDDED_LIBRARIES->value($emlib);
if ($ldata->{'source-regex'}) {
next if $proc->pkg_src =~ m/^$ldata->{'source-regex'}$/;
} else {
next if $proc->pkg_src eq $ldata->{'source'};
}
if ($strings =~ $ldata->{'match'}) {
tag 'embedded-library', "$file: $ldata->{'libname'}";
}
}
# binary or shared object?
next
unless ($fileinfo =~ m/executable/)
or ($fileinfo =~ m/shared object/);
next if $type eq 'udeb';
# Perl library?
if ($file =~ m,^usr/lib/perl5/.*\.so$,) {
$has_perl_lib = 1;
}
# PHP extension?
if ($file =~ m,^usr/lib/php\d/.*\.so(?:\.\d+)*$,) {
$has_php_ext = 1;
}
# Python extension using Numpy C ABI?
if (
$file =~ m,usr/lib/(?:pyshared/)?python2\.\d+/.*(?{NEEDED} })) {
tag 'debug-file-should-use-detached-symbols', $file;
}
tag 'debug-file-with-no-debug-symbols', $file
unless (exists $objdump->{'SH'}->{'.debug_line'}
or exists $objdump->{'SH'}->{'.zdebug_line'});
}
# Detached debugging symbols directly in /usr/lib/debug.
if ($file =~ m,^usr/lib/debug/[^/]+$,) {
unless (scalar(@{ $objdump->{NEEDED} })
|| $fileinfo =~ m/statically linked/) {
tag 'debug-symbols-directly-in-usr-lib-debug', $file;
}
}
# statically linked?
if (!scalar(@{ $objdump->{NEEDED} })) {
if ($fileinfo =~ m/shared object/o) {
# Some exceptions: kernel modules, detached debugging
# information and the dynamic loader (which itself has
# no dependencies).
next if ($file =~ m%^lib/modules/%);
next if ($file =~ m%^usr/lib/debug/%);
next
if ($file =~ m%^lib(?:|32|64)/(?:[\w/]+/)?ld-[\d.]+\.so$%);
tag 'shared-lib-without-dependency-information', $file;
} else {
# Some exceptions: files in /boot, /usr/lib/debug/*,
# named *-static or *.static, or *-static as
# package-name.
next if ($file =~ m%^boot/%);
next if ($file =~ /[\.-]static$/);
next if ($pkg =~ /-static$/);
# Binaries built by the Go compiler are statically
# linked by default.
next if ($built_with_golang);
# klibc binaries appear to be static.
next
if (exists $objdump->{INTERP}
&& $objdump->{INTERP} =~ m,/lib/klibc-\S+\.so,);
# Location of debugging symbols.
next if ($file =~ m%^usr/lib/debug/%);
# ldconfig must be static.
next if ($file eq 'sbin/ldconfig');
tag 'statically-linked-binary', $file;
}
} else {
my $no_libc = 1;
my $is_shared = 0;
$needs_depends_line = 1;
$is_shared = 1 if index($fileinfo, 'shared object') != -1;
for my $lib (@{$objdump->{NEEDED}}) {
if ($lib =~ /^libc\.so\.(\d+.*)/) {
$needs_libc = "libc$1";
$needs_libc_file = $file->name unless $needs_libc_file;
$needs_libc_count++;
$no_libc = 0;
}
if ($lib =~ m{\A libstdc\+\+\.so\.(\d+) \Z}xsm) {
$needs_libcxx = "libstdc++$1";
$needs_libcxx_file = $file->name
unless $needs_libcxx_file;
$needs_libcxx_count++;
}
}
if ($no_libc and not $file =~ m,/libc\b,) {
# If there is no libc dependency, then it is most likely a
# bug. The major exception is that some C++ libraries,
# but these tend to link against libstdc++ instead. (see
# #719806)
if ($is_shared) {
tag 'library-not-linked-against-libc', $file
unless $needs_libcxx ne '';
} else {
tag 'program-not-linked-against-libc', $file;
}
}
# Check for missing hardening characteristics. This currently
# handles the following checks:
# no-relro no-fortify-functions no-stackprotector no-bindnow no-pie
if (exists($info->hardening_info->{$file})) {
my $flags = $HARDENING->value($arch);
if ($flags) {
foreach my $t (@{$info->hardening_info->{$file}}) {
my $tag = "hardening-$t";
tag $tag, $file if $flags->{$tag};
}
}
}
}
}
# Find the package dependencies, which is used by various checks.
my $depends = $info->relation('strong');
# Check for a libc dependency.
if ($needs_depends_line) {
if ($depends->empty) {
tag 'missing-depends-line';
} else {
if ($needs_libc && $pkg !~ /^libc[\d.]+(?:-|\z)/) {
# Match libcXX or libcXX-*, but not libc3p0.
my $re = qr/^\Q$needs_libc\E\b/;
if (!$depends->matches($re)) {
my $others = '';
$needs_libc_count--;
if ($needs_libc_count > 0) {
$others = " and $needs_libc_count others";
}
tag 'missing-dependency-on-libc',
"needed by $needs_libc_file$others";
}
}
if ($needs_libcxx ne '') {
# Match libstdc++XX or libcstdc++XX-*
my $re = qr/^\Q$needs_libcxx\E\b/;
if (!$depends->matches($re)) {
my $others = '';
$needs_libcxx_count--;
if ($needs_libcxx_count > 0) {
$others = " and $needs_libcxx_count others";
}
tag 'missing-dependency-on-libstdc++',
"needed by $needs_libcxx_file$others";
}
}
}
}
# Check for a Perl dependency.
if ($has_perl_lib) {
# It is a virtual package, so no version is allowed and
# alternatives probably does not make sense here either.
my $re = qr/^perlapi-[\d.]+(?:\s*\[[^\]]+\])?$/;
unless ($depends->matches($re, VISIT_OR_CLAUSE_FULL)) {
tag 'missing-dependency-on-perlapi';
}
}
# Check for a phpapi- dependency.
if ($has_php_ext) {
# It is a virtual package, so no version is allowed and
# alternatives probably does not make sense here either.
unless ($depends->matches(qr/^phpapi-[\d\w+]+$/, VISIT_OR_CLAUSE_FULL))
{
tag 'missing-dependency-on-phpapi';
}
}
# Check for dependency on python-numpy-abiN dependency (or strict versioned
# dependency on python-numpy)
if ($uses_numpy_c_abi and $pkg !~ m{\A python3?-numpy \Z}xsm) {
# We do not allow alternatives as it would mostly likely
# defeat the purpose of this relation. Also, we do not allow
# versions for -abi as it is a virtual package.
my $vflags = VISIT_OR_CLAUSE_FULL;
tag 'missing-dependency-on-numpy-abi'
unless $depends->matches(qr/^python3?-numpy-abi\d+$/, $vflags)
or ( $depends->matches(qr/^python-numpy \(>[>=][^\|]+$/, $vflags)
and $depends->matches(qr/^python-numpy \(<[<=][^\|]+$/, $vflags));
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/files.desc 0000664 0000000 0000000 00000163006 12314062063 014661 0 ustar Check-Script: files
Author: Christian Schwarz
Abbrev: fil
Type: binary, udeb
Needs-Info: unpacked, objdump-info, scripts, file-info, index
Info: This script checks if a binary package conforms to policy
WRT to files and directories.
Tag: package-contains-ancient-file
Severity: serious
Certainty: certain
Info: Your package contains a file that claims to have been generated
more than 20 years ago. This is most probably an error. Your package
will be rejected by the Debian archive scripts if it contains a file
with such a timestamp.
Tag: package-installs-file-to-usr-x11r6
Severity: important
Certainty: certain
Info: Packages using the X Window System should not be configured to install
files under the /usr/X11R6/ directory. Debian has switched to the modular
X tree which now uses regular FHS paths and all packages should follow.
.
Programs that use GNU autoconf and automake are usually easily configured
at compile time to use /usr/ instead of /usr/X11R6/. Packages that use
imake must build-depend on xutils-dev (>= 1:1.0.2-2) for the correct
paths.
Ref: policy 11.8.7
Tag: config-file-reserved
Severity: important
Certainty: certain
Info: This file is reserved by a specific package. Please email the
maintainer of the package in question if you have questions.
Tag: FSSTND-dir-in-usr
Severity: serious
Certainty: certain
Info: As of policy version 3.0.0.0, Debian no longer follows the FSSTND.
.
Instead, the Filesystem Hierarchy Standard (FHS), version 2.3, is
used. You can find it in /usr/share/doc/debian-policy/fhs/ .
Ref: policy 9.1.1
Tag: FSSTND-dir-in-var
Severity: serious
Certainty: certain
Info: As of policy version 3.0.0.0, Debian no longer follows the FSSTND.
.
Instead, the Filesystem Hierarchy Standard (FHS), version 2.3, is
used. You can find it in /usr/share/doc/debian-policy/fhs/ .
Ref: policy 9.1.1
Tag: package-installs-into-etc-gconf-schemas
Severity: normal
Certainty: certain
Info: The package installs files into the /etc/gconf/schemas
directory. No package should do this; this directory is reserved for
local overrides. Instead, schemas should be installed into
/usr/share/gconf/schemas.
Tag: package-installs-into-etc-rc.d
Severity: serious
Certainty: certain
Info: The package installs files into the /etc/rc.d or
/etc/rc?.d which is not allowed.
Ref: policy 9.3.3
Tag: package-installs-into-etc-rc.boot
Severity: serious
Certainty: certain
Info: The package installs files in the /etc/rc.boot directory,
which is obsolete.
Ref: policy 9.3.4
Tag: package-install-into-obsolete-dir
Severity: normal
Certainty: certain
Info: The package installs files to an obsolete directory.
Please use a newer path.
Tag: non-standard-file-permissions-for-etc-init.d-script
Severity: important
Certainty: certain
Info: Usually, scripts in the /etc/init.d directory should have
mode 0755.
Tag: file-directly-in-usr-share
Severity: serious
Certainty: certain
Info: Packages should not install files directly in /usr/share,
i.e., without a subdirectory.
.
You should either create a subdirectory /usr/share/... for your
package or place the file in /usr/share/misc.
Tag: file-in-usr-local
Severity: serious
Certainty: certain
Info: The package installs a file in /usr/local/... which is
not allowed.
Ref: policy 9.1.2
Tag: stray-directory-in-manpage-directory
Severity: important
Certainty: certain
Info: This package installs a directory under /usr/share/man or
/usr/X11R6/man that isn't a manual section directory or locale
directory.
Ref: fhs usrsharemanmanualpages
Tag: executable-manpage
Severity: important
Certainty: certain
Info: Manual pages are not meant to be executed.
Tag: dir-in-usr-local
Severity: serious
Certainty: certain
Info: The package installs a directory in /usr/local/... which is
not allowed.
.
If you want to provide an empty directory in /usr/local for
convenience of the local system administrator, please follow the rules
in the policy manual (section 9.1.2), i.e., create the directories in
the postinst script but don't fail if this isn't possible (e.g., if
/usr/local is mounted read-only).
Ref: policy 9.1.2
Tag: non-standard-dir-perm
Severity: normal
Certainty: possible
Info: The directory has a mode different from 0755, and it's not one of the
known exceptions.
Ref: policy 10.9
Tag: executable-is-not-world-readable
Severity: normal
Certainty: certain
Info: All executables should be readable by any user. Since anyone can
download the Debian package and obtain a copy of the executable, no
security is gained by making the executable unreadable even for setuid
binaries. If only members of a certain group may execute this file,
remove execute permission for world, but leave read permission.
Ref: policy 10.9
Tag: non-standard-executable-perm
Severity: normal
Certainty: certain
Info: Executables that are not setuid or setgid should always have a mode
of 0755. Since anyone can obtain the executable by downloading the
Debian package and extracting it, restricting access serves little
purpose.
Ref: policy 10.9
Tag: non-standard-game-executable-perm
Severity: normal
Certainty: certain
Info: The file is owned by the games group but is not mode 2755. If a
game does not have to be setgid games, it should be owned by the root
group like any other executable. This executable is either owned by the
wrong group or is not setgid when it should be.
Ref: policy 11.11
Tag: non-standard-setuid-executable-perm
Severity: normal
Certainty: certain
Info: The file is setuid or setgid and has a mode different from any of
2755, 4755, 4754, or 6755. Any other permissions on setuid executables
is probably a bug. In particular, removing root write privileges serves
no purpose, group-writable setuid or setgid executables are probably bad
ideas, and setgid executables that are not world-executable serve little
purpose.
Ref: policy 10.9
Tag: setuid-binary
Severity: normal
Certainty: possible
Info: The file is tagged SETUID. In some cases this is intentional, but in
other cases this is a bug. If this is intentional, please add a lintian
override to document this fact.
Tag: setgid-binary
Severity: normal
Certainty: possible
Info: The file is tagged SETGID. In some cases this is intentional, but in
other cases this is a bug. If this is intentional, please add a lintian
override to document this fact.
Tag: setuid-gid-binary
Severity: normal
Certainty: possible
Info: The file is tagged SETUID and SETGID. In some cases this is
intentional, but in other cases this is a bug. If this is intentional,
please add a lintian override to document this fact.
Tag: non-standard-file-perm
Severity: normal
Certainty: certain
Info: The file has a mode different from 0644. In some cases this is
intentional, but in other cases this is a bug.
Ref: policy 10.9
Tag: bad-perm-for-file-in-etc-sudoers.d
Severity: serious
Certainty: certain
Info: Files in /etc/sudoers.d/ must be 0440 or sudo will refuse to
parse them.
Ref: #588831, #576527
Tag: special-file
Severity: serious
Certainty: certain
Info: The package contains a special file (e.g., a device file).
This is forbidden by current policy. If your program needs this device,
you should create it by calling makedev from the postinst
script.
Ref: policy 10.6
Tag: compressed-symlink-with-wrong-ext
Severity: important
Certainty: certain
Info: The package installs a symbolic link pointing to a compressed file,
but the symbolic link does not use the same file extension than the
referenced file. In most cases, this can produce troubles when the
user or a program tries to access the file through the link.
Ref: policy 10.5
Tag: symlink-has-double-slash
Severity: minor
Certainty: certain
Info: This symlink contains two successive slashes (//). This is in violation
of policy, where it is stated that symlinks should be as short as possible
.
If you use debhelper, running dh_link after creating the package structure
will fix this problem for you.
Ref: policy 10.5
Tag: symlink-ends-with-slash
Severity: minor
Certainty: certain
Info: This symlink ends with a slash (/). This is in violation
of policy, where it is stated that symlinks should be as short as possible
.
If you use debhelper, running dh_link after creating the package structure
will fix this problem for you.
Ref: policy 10.5
Tag: symlink-should-be-relative
Severity: normal
Certainty: certain
Info: Symlinks to files which are in the same top-level directory should be
relative according to policy. (In other words, a link in /usr to another
file in /usr should be relative, while a link in /usr to a file in /etc
should be absolute.)
.
If you use debhelper, running dh_link after creating the package structure
will fix this problem for you.
Ref: policy 10.5
Tag: symlink-should-be-absolute
Severity: important
Certainty: certain
Info: Symbolic links between different top-level directories should be
absolute.
.
If you use debhelper, running dh_link after creating the package structure
will fix this problem for you.
Ref: policy 10.5
Tag: udeb-contains-documentation-file
Severity: important
Certainty: certain
Info: udeb packages should not contain any documentation.
Tag: executable-in-usr-share-doc
Severity: important
Certainty: certain
Info: Usually, documentation files in /usr/share/doc should have mode
0644. If the executable is an example, it should go in
/usr/share/doc/pkg/examples.
Tag: script-in-usr-share-doc
Severity: wishlist
Certainty: certain
Info: Scripts are usually not documentation files, unless they are
examples, in which case they should be in the
/usr/share/doc/pkg/examples directory.
Tag: symlink-has-too-many-up-segments
Severity: serious
Certainty: certain
Ref: policy 10.5
Info: The symlink references a directory beyond the root directory "/".
Tag: lengthy-symlink
Severity: important
Certainty: certain
Info: This link goes up, and then back down into the same subdirectory.
Making it shorter will improve its chances of finding the right file
if the user's system has lots of symlinked directories.
.
If you use debhelper, running dh_link after creating the package structure
will fix this problem for you.
Ref: policy 10.5
Tag: symlink-is-self-recursive
Severity: normal
Certainty: possible
Info: The symbolic link is recursive to a higher directory of the symlink
itself. This means, that you can infinitely chdir with this symlink. This is
usually not okay, but sometimes wanted behaviour.
Tag: symlink-contains-spurious-segments
Severity: important
Certainty: certain
Info: The symbolic link has needless segments like ".." and "." in the
middle. These are unneeded and make the link longer than it could be,
which is in violation of policy. They can also cause problems in the
presence of symlinked directories.
.
If you use debhelper, running dh_link after creating the package structure
will fix this problem for you.
Ref: policy 10.5
Tag: run-parts-cron-filename-contains-illegal-chars
Severity: normal
Certainty: certain
Info: The script in /etc/cron.<time-interval> will not be executed by
run-parts(8) because the filename contains a "." (full stop) or "+" (plus).
.
It is recommended to use "_" (underscores) instead of these symbols.
Ref: run-parts(8), policy 9.5.1
Tag: bad-permissions-for-etc-cron.d-script
Severity: important
Certainty: certain
Info: Files in /etc/cron.d are configuration files for cron and not
scripts. Thus, they should not be marked executable.
Tag: bad-permissions-for-etc-emacs-script
Severity: important
Certainty: certain
Info: Files in the /etc/emacs* directories should not be marked
executable.
Tag: image-file-in-usr-lib
Severity: normal
Certainty: certain
Info: This package installs a pixmap or a bitmap within /usr/lib.
According to the Filesystem Hierarchy Standard, architecture-independent
files need to be placed within /usr/share instead.
Tag: file-directly-in-usr-share-doc
Severity: serious
Certainty: certain
Info: Documentation files have to be installed in
/usr/share/doc/pkg.
Ref: policy 12.3
Tag: bad-owner-for-doc-file
Severity: important
Certainty: certain
Info: Documentation files should be owned by root/root.
Tag: dir-or-file-in-var-lock
Severity: serious
Certainty: possible
Info: /var/lock may be a temporary filesystem, so any directories
or files needed there must be created dynamically at boot time.
Ref: policy 9.3.2
Tag: dir-or-file-in-var-run
Severity: serious
Certainty: possible
Info: /var/run may be a temporary filesystem, so any directories
or files needed there must be created dynamically at boot time.
Ref: policy 9.3.2
Tag: dir-or-file-in-run
Severity: serious
Certainty: possible
Info: /run may be a temporary filesystem, so any directories
or files needed there must be created dynamically at boot time.
Ref: policy 9.3.2
Tag: dir-or-file-in-var-www
Severity: serious
Certainty: possible
Ref: fhs thevarhierarchy
Info: Debian packages should not install files under /var/www.
This is not one of the /var directories in the File Hierarchy
Standard and is under the control of the local administrator. Packages
should not assume that it is the document root for a web server; it is
very common for users to change the default document root and packages
should not assume that users will keep any particular setting.
.
Packages that want to make files available via an installed web server
should instead put instructions for the local administrator in a
README.Debian file and ideally include configuration fragments for common
web servers such as Apache.
.
As an exception, packages are permitted to create the /var/www
directory due to its past history as the default document root, but
should at most copy over a default file in postinst for a new install.
In this case, please add a Lintian override.
Tag: dir-or-file-in-tmp
Severity: serious
Certainty: certain
Info: Packages must not install files into /tmp or
/var/tmp. The File Hierarchy Standard specifies that such files
may be removed by the administrator and that programs may not depend on
any files in /tmp being preserved across invocations, which
combined mean that it makes no sense to ship files in these directories.
Ref: fhs tmptemporaryfiles, fhs vartmptemporaryfilespreservedbetwee
Tag: dir-or-file-in-mnt
Severity: serious
Certainty: certain
Info: Packages should not install into /mnt. The FHS states that
this directory is reserved for the local system administrator for
temporary mounts and that it must not be used by installation programs.
Ref: fhs mntmountpointforatemporarilymount
Tag: dir-or-file-in-opt
Severity: serious
Certainty: certain
Info: Debian packages should not install into /opt, because it
is reserved for add-on software.
Ref: fhs optaddonapplicationsoftwarepackages
Tag: dir-or-file-in-etc-opt
Severity: serious
Certainty: certain
Info: Debian packages should not install into /etc/opt, because it
is reserved for add-on software.
Ref: fhs optaddonapplicationsoftwarepackages
Tag: dir-or-file-in-srv
Severity: serious
Certainty: certain
Info: Debian packages should not install into /srv. The
specification of /srv states that its structure is at the
discretion of the local administrator and no package should rely on any
particular structure. Debian packages that install files directly into
/srv can't adjust for local policy about its structure and in
essence force a particular structure.
.
If a package wishes to put its data in /srv, it must do this in
a way that allows the local administrator to specify and preserve their
chosen directory structure (such as through post-install configuration,
setup scripts, debconf prompting, etc.).
Ref: fhs srvdataforservicesprovidedbysystem
Tag: third-party-package-in-python-dir
Severity: normal
Certainty: certain
Info: Third-party Python packages should install their files in
/usr/lib/pythonVERSION/site-packages for Python versions
before 2.6 and /usr/lib/pythonVERSION/dist-packages
for Python 2.6 and later. All other directories in
/usr/lib/pythonVERSION are for use by the core python
packages.
Ref: python-policy 1.5
Tag: perl-module-in-core-directory
Severity: important
Certainty: certain
Info: Packaged modules must not be installed into the core perl
directories as those directories change with each upstream perl
revision. The vendor directories are provided for this purpose.
Ref: perl-policy 3.1
Tag: backup-file-in-package
Severity: normal
Certainty: certain
Info: There is a file in the package whose name matches the format emacs
or vim uses for backup and autosave files. It may have been installed by
accident.
Tag: nfs-temporary-file-in-package
Severity: normal
Certainty: certain
Info: There is a file in the package whose name matches the format NFS
uses to temporarily save files that were deleted while another process
had them open. It may have been included in the package by accident
while building the package in an NFS filesystem.
Tag: windows-thumbnail-database-in-package
Severity: normal
Certainty: certain
Info: There is a file in the package named Thumbs.db or
Thumbs.db.gz, which is normally a Windows image thumbnail
database. Such databases are generally useless in Debian packages and
were usually accidentally included by copying complete directories from
the source tarball.
Tag: macos-ds-store-file-in-package
Severity: normal
Certainty: certain
Info: There is a file in the package named .DS_Store or
.DS_Store.gz, the file name used by Mac OS X to store folder
attributes. Such files are generally useless in Debian packages and were
usually accidentally included by copying complete directories from the
source tarball.
Tag: macos-resource-fork-file-in-package
Severity: normal
Certainty: certain
Info: There is a file in the package with a name starting with
._, the file name pattern used by Mac OS X to store resource
forks in non-native file systems. Such files are generally useless in
Debian packages and were usually accidentally included by copying
complete directories from the source tarball.
Tag: package-installs-perllocal-pod
Severity: normal
Certainty: certain
Info: This package installs a file perllocal.pod. Since that
file is intended for local documentation, it is not likely that it is
a good place for documentation supplied by a Debian package. In fact,
installing this package will wipe out whatever local documentation
existed there.
Tag: extra-license-file
Severity: normal
Certainty: possible
Ref: policy 12.5
Info: All license information should be collected in the
debian/copyright file. This usually makes it unnecessary
for the package to install this information in other places as well.
Tag: non-standard-toplevel-dir
Severity: important
Certainty: certain
Info: The Filesystem Hierarchy Standard forbids the installation of new
files or directories in the root directory.
Ref: fhs therootfilesystem
Tag: non-multi-arch-lib-dir
Severity: normal
Certainty: certain
Info: The following library use an old path (like /lib64 or /lib32)
instead of using multi-arch path (like for instance
/lib/x86_64-linux-gnu/ or /lib/i386-linux-gnu/).
Ref: https://wiki.debian.org/Multiarch
Tag: subdir-in-bin
Severity: serious
Certainty: certain
Info: The Filesystem Hierarchy Standard forbids the installation of new
directories in /bin.
Ref: fhs binessentialusercommandbinaries
Tag: subdir-in-usr-bin
Severity: serious
Certainty: certain
Info: The Filesystem Hierarchy Standard forbids the installation of new
directories in /usr/bin other than /usr/bin/mh.
Ref: fhs usrbinmostusercommands
Tag: non-standard-dir-in-usr
Severity: normal
Certainty: certain
Info: The FHS says "No large software packages should use a direct
subdirectory under the /usr hierarchy". This package contains
a directory in /usr that is not mentioned in the Filesystem
Hierarchy Standard.
Ref: fhs theusrhierarchy
Tag: non-standard-dir-in-var
Severity: important
Certainty: certain
Info: The FHS says "Applications should generally not add directories to
the top level of /var. Such directories should only be added
if they have some system-wide implication, and in consultation with the
FHS mailing list."
Ref: fhs thevarhierarchy
Tag: use-of-compat-symlink
Severity: important
Certainty: certain
Info: This package uses a directory that, according to the Filesystem
Hierarchy Standard, should exist only as a compatibility symlink.
Packages should not traverse such symlinks when installing files, they
should use the standard directories instead.
Tag: file-in-unusual-dir
Severity: normal
Certainty: certain
Info: This file or symbolic link is in a directory where files are not
normally installed by Debian packages.
Tag: package-installs-packlist
Severity: important
Certainty: certain
Info: Packages built using the perl MakeMaker package will have a file
named .packlist in them. Those files are useless, and (in some cases)
have the additional problem of creating an architecture-specific
directory name in an architecture-independent package.
.
They can be suppressed by adding the following to debian/rules:
.
find debian/pkg -type f -name .packlist -delete
.
or by telling MakeMaker to use vendor install dirs; consult a recent
version of Perl policy. Perl 5.6.0-12 or higher supports this.
Ref: perl-policy 4.1
Tag: zero-byte-file-in-doc-directory
Severity: normal
Certainty: possible
Info: The documentation directory for this package contains an empty
file. This is often due to installing an upstream NEWS or README file
without realizing it's empty and hence not useful.
.
Files in the examples subdirectory are excluded from this check, but
there are some cases where empty files are legitimate parts of the
documentation without being examples. In those cases, please add an
override.
Tag: override-file-in-wrong-location
Severity: important
Certainty: certain
Info: Lintian overrides should be put in a regular file named
/usr/share/lintian/overrides/package, not in a subdirectory
named for the package or in the obsolete location under /usr/share/doc.
See the Lintian documentation for more information on proper naming and
format.
Ref: lintian 2.4
Tag: package-contains-upstream-install-documentation
Severity: normal
Certainty: possible
Ref: policy 12.3
Info: Binary packages do not need to contain the instructions for building
and installing the package as this info is not needed by package users.
If the info contained is important for configuration perhaps it could be
summarized in README.Debian, otherwise an override may be added.
Tag: package-contains-hardlink
Severity: normal
Certainty: certain
Info: The package contains a hardlink in /etc or across different
directories. This might not work at all if directories are on different
filesystems (which can happen anytime as the system administrator sees fit),
certain filesystems such as AFS don't even support cross-directory hardlinks
at all.
.
For configuration files, certain editors might break hardlinks, and so
does dpkg in certain cases.
.
A better solution might be using symlinks here.
Ref: policy 10.7.3
Tag: package-contains-bts-control-dir
Severity: normal
Certainty: certain
Info: The package contains a control directory for a bug tracking system.
It was most likely installed by accident, since bug tracking directories
usually don't belong in packages.
Tag: package-contains-vcs-control-dir
Severity: normal
Certainty: certain
Info: The package contains a control directory for a version control system.
It was most likely installed by accident, since version control directories
usually don't belong in packages.
Tag: package-contains-xvpics-dir
Severity: important
Certainty: certain
Info: Package contains a .xvpics directory. It was most likely installed by
accident, since thumbnails usually don't belong in packages.
Tag: package-contains-vcs-control-file
Severity: normal
Certainty: certain
Info: The package contains a VCS control file such as .(cvs|git|hg)ignore.
Files such as these are used by revision control systems to, for example,
specify untracked files it should ignore or inventory files. This file
is generally useless in an installed package and was probably installed
by accident.
Tag: svn-commit-file-in-package
Severity: normal
Certainty: certain
Info: The package contains an svn-commit(.NNN).tmp file. This file is
almost certainly a left-over from a failed Subversion commit, and does
not belong in a Debian package.
Tag: svk-commit-file-in-package
Severity: normal
Certainty: certain
Info: The package contains an svk-commitNNN.tmp file. This file is almost
certainly a left-over from a failed Subversion commit, and does not
belong in a Debian package.
Tag: nested-examples-directory
Severity: important
Certainty: certain
Info: Package contains a usr/share/doc/something/examples/examples
directory. It was most likely installed by accident, since one examples/
directory should be enough for everybody(tm).
Tag: package-installs-nonbinary-perl-in-usr-lib-perl5
Severity: normal
Certainty: certain
Info: Architecture-independent Perl code should be placed in
/usr/share/perl5, not /usr/lib/perl5
unless there is at least one architecture-dependent file
in the module.
Ref: perl-policy 2.3
Tag: file-in-usr-lib-site-python
Severity: important
Certainty: certain
Ref: python-policy 1.5
Info: The directory /usr/lib/site-python has been deprecated as a
location for installing Python modules and may be dropped from Python's
module search path in a future version. Most likely this module is a
private module and should be packaged in a directory outside of Python's
default search path.
Tag: python-module-in-wrong-location
Severity: normal
Certainty: possible
Ref: python-policy 1.5, #576012
Info: The package installs a Python module or debug information for a Python
module in the wrong location for the given version of Python.
.
dh_python3 can be used to fix this for Python 3 modules.
Tag: python-debug-in-wrong-location
Severity: normal
Certainty: possible
Ref: #576014
Info: The package appears to be installing debug modules in
/usr/lib/debug/usr/lib/pyshared/pythonX.Y/. However, gdb(1)
will not look for it there, making it less useful. The file
should be installed in /usr/lib/debug/usr/lib/pymodules/pythonX.Y/
instead.
Tag: missing-dependency-on-python-support
Severity: important
Certainty: possible
Info: The package installs a file in usr/share/python-support/ but does
not declare the necessary dependency on python-support.
.
This can happen if ${python:Depends} was omitted from the Depends field
in debian/control.
Tag: package-installs-python-bytecode
Severity: serious
Certainty: certain
Ref: python-policy 2.6
Info: Compiled python source files must not be included in the package.
These files should be removed from the package and created at package
installation time in the postinst.
Tag: package-installs-python-egg
Severity: serious
Certainty: possible
Ref: python-policy 2.6
Info: Python eggs should not be installed, since the Debian package is
supposed to do the required steps for installing the Python code.
.
The egg may contain pre-compiled python bytecode or shared libraries.
Tag: package-installs-python-pycache-dir
Severity: serious
Certainty: certain
Ref: python-policy 2.6
Info: The package installs a __pycache__ directory, which is normally
only used to store compiled python source files. Compiled python
source files must not be included in the package, instead they
should be generated at installation time in the postinst.
.
Note this tag is issues even if the directory is empty.
Tag: bad-permissions-for-ali-file
Severity: normal
Certainty: certain
Ref: policy 8.4
Info: Ada Library Information (*.ali) files are required to be read-only
(mode 0444) by GNAT.
.
If at least one user can write the *.ali file, GNAT considers whether
or not to recompile the corresponding source file. Such recompilation
would fail because normal users don't have write permission on the
files. Moreover, such recompilation would defeat the purpose of
library packages, which provide *.a and *.so libraries to link against).
Tag: package-contains-readme-for-other-platform-or-distro
Severity: normal
Certainty: certain
Info: package contains a README.(platform) file that contains instructions
specific to a platform or distribution other than Debian and thus can
most likely be removed. If it contains information that pertains to
Debian, please consider renaming it, or including it in an already
existing README file.
Tag: desktop-file-in-wrong-dir
Severity: normal
Certainty: certain
Info: The package contains a .desktop file in an obsolete directory.
According to the menu-spec draft on freedesktop.org, those .desktop files
that are intended to create a menu should be placed in
/usr/share/applications, not /usr/share/gnome/apps.
Tag: script-with-language-extension
Severity: normal
Certainty: certain
Info: When scripts are installed into a directory in the system PATH, the
script name should not include an extension such as .sh or
.pl that denotes the scripting language currently used to
implement it. The implementation language may change; if it does,
leaving the name the same would be confusing and changing it would be
disruptive.
Ref: policy 10.4
Tag: file-in-usr-lib-sgml
Severity: normal
Certainty: certain
Ref: fhs theusrhierarchy
Info: This package installs a file in /usr/lib/sgml. This was
the old location for SGML catalogs and similar flies. All those files
should now go into /usr/share/sgml.
Tag: file-name-ends-in-whitespace
Severity: normal
Certainty: possible
Info: This package installs a file or directory whose name ends in
whitespace. This might be intentional but it's normally a mistake. If
it is intentional, add a lintian override.
.
One possible cause is using debhelper 5.0.57 or earlier to install a
doc-base file with a Document field that ends in whitespace.
Tag: package-contains-empty-directory
Severity: wishlist
Certainty: possible
Info: This package installs an empty directory. This might be intentional
but it's normally a mistake. If it is intentional, add a lintian override.
.
If a package ships with or installs empty directories, you can remove them
in debian/rules by calling:
.
$ find path/to/base/dir -type d -empty -delete
Tag: package-section-games-but-contains-no-game
Severity: important
Certainty: certain
Ref: policy 11.11
Info: This package is marked as part of the section games, but doesn't
contain files in /usr/games. Binaries of games must be installed
in /usr/games.
Tag: package-section-games-but-has-usr-bin
Severity: normal
Certainty: possible
Ref: policy 11.11
Info: This package is marked as part of the section games, but contains
executables in /bin or /usr/bin/. This can be intentional,
but is usually a mistake.
Tag: games-package-should-be-section-games
Severity: normal
Certainty: possible
Info: All the executables in this package are in /usr/games, but
the package is not in section games. This can be intentional but is
usually a mistake.
Tag: package-contains-devhelp-file-without-symlink
Severity: normal
Certainty: certain
Info: This package contains a *.devhelp or *.devhelp2 file which is not in
the devhelp search path (/usr/share/devhelp/books and
/usr/share/gtk-doc/html) and is apparently not in a directory
linked into the devhelp search path. This will prevent devhelp from
finding the documentation.
.
If the devhelp documentation is installed in a path outside the devhelp
search path (such as /usr/share/doc), create a symlink in
/usr/share/gtk-doc/html pointing to the documentation directory.
Tag: debug-package-should-be-named-dbg
Severity: normal
Certainty: certain
Info: This package provides at least one file in /usr/lib/debug,
which is intended for detached debugging symbols, but the package name
does not end in "-dbg". Detached debugging symbols should be put into a
separate package, Priority: extra, with a package name ending in "-dbg".
Ref: devref 6.7.9
Tag: package-contains-linda-override
Severity: normal
Certainty: certain
Info: This package contains a linda override file in
/usr/share/linda/overrides. Linda is obsolete and has been
removed from the archive as of 2008-03-04. Linda overrides should
probably be dropped from packages.
Tag: wrong-file-owner-uid-or-gid
Severity: serious
Certainty: certain
Info: The user or group ID of the owner of the file is invalid. The
owner user and group IDs must be in the set of globally allocated
IDs, because other IDs are dynamically allocated and might be used
for varying purposes on different systems, or are reserved. The set
of the allowed, globally allocated IDs consists of the ranges 0-99,
64000-64999 and 65534.
.
It's possible for a Policy-compliant package to trigger this tag if the
user is created in the preinst maintainer script, but this is a very rare
case and doesn't appear to be necessary. If you found yourself needing
to create a package that works this way, please file a bug against
Lintian to let the maintainers know.
Ref: policy 9.2
Tag: embedded-javascript-library
Severity: normal
Certainty: possible
Info: This package contains an embedded copy of JavaScript libraries
that are now available in their own packages (for example, JQuery,
Prototype, Mochikit or "Cropper"). Please depend on the appropriate
package and symlink the library into the appropriate location.
Ref: policy 4.13
Tag: privacy-breach-generic
Severity: important
Certainty: wild-guess
Experimental: yes
Info: This package creates a potential privacy breach by fetching data
from an external website at runtime. Please remove these scripts or
external HTML resources.
.
Please replace any scripts, images, or other remote resources with
non-remote resources. It is preferable to replace them with text and
links but local copies of the remote resources are also acceptable as
long as they don't also make calls to remote services. Please ensure
that the remote resources are suitable for Debian main before making
local copies of them.
Tag: privacy-breach-google-adsense
Severity: serious
Certainty: possible
Info: This package creates a privacy breach by using Google AdSense.
Google AdSense is a service run by Google that allows publishers
of websites to automatically serve advertisements. Unfortunately, it
requires tracking and breaching the privacy of web users.
.
This tag can also indicate the use of the related obsolete privacy
breaching software, Urchin WebAnalytics.
.
Note that using Google AdSense in a local copy of a page is a violation of
the Google AdSense terms of use. This violation renders this package not
distributable in Debian, and is thus a serious bug.
.
Please replace any scripts, images or other remote resources with
non-remote resources. It is preferrable to replace them with text and
links but local copies of the remote resources are also acceptable as
long as they don't also make calls to remote services. Please ensure
that the remote resources are suitable for Debian main before making
local copies of them.
Tag: privacy-breach-donation
Severity: serious
Certainty: possible
Ref: https://wiki.debian.org/UpstreamMetadata
Info: This package create a potential privacy breach by fetching data
from a donation website at runtime.
.
Please remove this privacy problem and add a note to the
debian/upstream/metadata file using the donation field.
.
Please replace any scripts, images, or other remote resources with
non-remote resources. It is preferable to replace them with text and
links but local copies of the remote resources are also acceptable as
long as they don't also make calls to remote services. Please ensure
that the remote resources are suitable for Debian main before making
local copies of them.
Tag: privacy-breach-logo
Severity: serious
Certainty: possible
Info: This package creates a potential privacy breach by fetching a
logo at runtime.
.
Before using a local copy you should check that the logo is suitable
for main. Ask debian-legal for advice.
.
Please replace any scripts, images, or other remote resources with
non-remote resources. It is preferable to replace them with text and
links but local copies of the remote resources are also acceptable as
long as they don't also make calls to remote services. Please ensure
that the remote resources are suitable for Debian main before making
local copies of them.
Tag: privacy-breach-facebook
Severity: serious
Certainty: possible
Info: This package creates a privacy breach by exchanging data with
Facebook at runtime via plugins such as "Share" or "Like" buttons.
.
Please replace any scripts, images, or other remote resources with
non-remote resources. It is preferable to replace them with text and
links but local copies of the remote resources are also acceptable as
long as they don't also make calls to remote services. Please ensure
that the remote resources are suitable for Debian main before making
local copies of them.
Tag: privacy-breach-google-plus
Severity: serious
Certainty: possible
Info: This package creates a potential privacy breach by
exchanging data with Google+ at runtime via plugins such
as "+1" buttons.
.
Please replace any scripts, images, or other remote resources with
non-remote resources. It is preferable to replace them with text and
links but local copies of the remote resources are also acceptable as
long as they don't also make calls to remote services. Please ensure
that the remote resources are suitable for Debian main before making
local copies of them.
Tag: privacy-breach-google-cse
Severity: serious
Certainty: possible
Info: This package creates a potential privacy breach by fetching
data from Google at runtime, and may feed private data to Google via
Custom Search Engine queries.
.
Please replace any scripts, images, or other remote resources with
non-remote resources. It is preferable to replace them with text and
links but local copies of the remote resources are also acceptable as
long as they don't also make calls to remote services. Please ensure
that the remote resources are suitable for Debian main before making
local copies of them.
Tag: privacy-breach-twitter
Severity: serious
Certainty: possible
Info: This package creates a potential privacy breach by
exchanging data with Twitter at runtime via plugins.
.
Please replace any scripts, images, or other remote resources with
non-remote resources. It is preferable to replace them with text and
links but local copies of the remote resources are also acceptable as
long as they don't also make calls to remote services. Please ensure
that the remote resources are suitable for Debian main before making
local copies of them.
Tag: privacy-breach-piwik
Severity: serious
Certainty: possible
Info: This package creates a privacy breach by using an online
Piwik module.
.
Piwik is a free and open source web analytics application, designed to
allow publishers of websites to track visitors.
.
Even though Piwik is free and respects the "Do Not Track" browser
option, it is nevertheless breaches the privacy of local users
by fetching data from internet.
.
Please replace any scripts, images, or other remote resources with
non-remote resources. It is preferable to replace them with text and
links but local copies of the remote resources are also acceptable as
long as they don't also make calls to remote services. Please ensure
that the remote resources are suitable for Debian main before making
local copies of them.
Tag: privacy-breach-statistics-website
Severity: serious
Certainty: possible
Info: This package creates a privacy breach by fetching data from
an external website in order to compile visitor statistics.
.
Please ask upstream to use the free software web analytics engine
Piwik, which respects the "Do Not Track" browser option.
.
This tag covers the following websites:
* cruel-carlota.pagodabox.com
* linkexchange.com (defunct)
* nedstatbasic.net
* onestat.com
* statcounter.com
* sitemeter.com
* webstats.motigo.com
.
Please replace any scripts, images, or other remote resources with
non-remote resources. It is preferable to replace them with text and
links but local copies of the remote resources are also acceptable as
long as they don't also make calls to remote services. Please ensure
that the remote resources are suitable for Debian main before making
local copies of them.
Tag: privacy-breach-w3c-valid-html
Severity: serious
Certainty: possible
Ref: http://validator.w3.org/docs/help.html#icon,
http://www.w3.org/Consortium/Legal/logo-usage-20000308
Info: This package creates a potential privacy breach by fetching W3C
validation icons.
.
These badges may be displayed to tell readers that care has been
taken to make a page compliant with W3C standards. Unfortunately,
downloading the image from www.w3.org might expose the reader's IP
address to potential tracking.
.
Note that these icons are non-free and must not be copied into the
package. You could safely delete this W3C validation badge.
Tag: embedded-feedparser-library
Severity: normal
Certainty: certain
Info: This package contains an embedded copy of Mark Pilgrim's Universal
Feed Parser. Please depend on the "python-feedparser" package and use
the normal Python import mechanism to load it.
Ref: policy 4.13
Tag: embedded-pear-module
Severity: normal
Certainty: possible
Experimental: yes
Info: This package appears to contain an embedded copy of a PEAR module.
Please depend on the respective PEAR package providing the module and
make sure the library can be found by the scripts via the include_path.
Ref: policy 4.13
Tag: embedded-php-library
Severity: normal
Certainty: possible
Info: This package appears to contain an embedded copy of a PHP library.
Please depend on the respective package providing the library and
make sure it can be found by the scripts via the include_path.
Ref: policy 4.13
Tag: windows-devel-file-in-package
Severity: normal
Certainty: possible
Info: This package appears to contain development files only meaningful to
Windows environments. Such files are generally useless in Debian packages and
were usually accidentally included by copying complete directories from the
source tarball.
Tag: font-in-non-font-package
Severity: wishlist
Certainty: possible
Info: This package contains a *.ttf, *.otf, or *.pfb file, file
extensions used by TrueType, OpenType, or Type 1 fonts, but the package
does not appear to be a dedicated font package. Dedicated font package
names should begin with fonts-. (Type 1 fonts are also allowed
in packages starting with xfonts-.) If the font is already
packaged, you should depend on that package instead. Otherwise, normally
the font should be packaged separately, since fonts are usually useful
outside of the package that embeds them.
Tag: license-problem-font-adobe-copyrighted-fragment
Severity: serious
Certainty: possible
Info: This type 1 font file includes some postscript fragment with a
non free license of Adobe. In order to check if this tag is genuine
please follow the procedure described in the reference.
.
Should this be a false-positive, please override the tag.
Ref: http://wiki.debian.org/qa.debian.org/type1nondfsg
Tag: license-problem-font-adobe-copyrighted-fragment-no-credit
Severity: serious
Certainty: possible
Info: This type 1 font file includes some postscript fragment with a
non free license of Adobe. In order to check if this tag is genuine
please follow the procedure described in the reference.
.
Moreover the fragment was likely verbatim copied from black
book without any credit to Adobe.
.
Should this be a false-positive, please override the tag.
Ref: http://wiki.debian.org/qa.debian.org/type1nondfsg
Tag: duplicate-font-file
Severity: normal
Certainty: possible
Info: This package appears to include a font file that is already provided
by another package in Debian. Ideally it should instead depend on the
relevant font package. If the application in this package loads the font
file by name, you may need to include a symlink pointing to the file name
of the font in its Debian package.
.
Sometimes the font package containing the font is huge and you only need
one font. In that case, you have a few options: modify the package (in
conjunction with upstream) to use libfontconfig to find the font that you
prefer but fall back on whatever installed font is available, ask that
the font package be split apart into packages of a more reasonable size,
or add an override and be aware of the duplication when new versions of
the font are released.
Tag: icon-size-and-directory-name-mismatch
Severity: normal
Certainty: certain
Info: The icon has a size that differs from the size specified by the name
of the directory under which it was installed. The icon was probably
mistakenly installed into the wrong directory.
Tag: raster-image-in-scalable-directory
Severity: normal
Certainty: certain
Info: The given raster image was installed into a "scalable" icon directory.
Only vector graphics (e.g. SVG) should be installed into those directories.
Tag: gz-file-not-gzip
Severity: normal
Certainty: possible
Info: The given file ends with .gz, which normally indicates it
is compressed with gzip. However, it doesn't seem to be a
gzip-compressed file. gzip will fail with an error on such files.
Normally this indicates a mistake in the installation process of the
package.
Tag: non-free-flash
Severity: serious
Certainty: possible
Info: The given Flash file has a filename which suggests that it may be
one of a number of known Flash files with non-free content.
Tag: non-conf-file-in-modprobe.d
Severity: important
Certainty: certain
Ref: http://lists.debian.org/debian-devel/2009/03/msg00119.html
Info: Files in /etc/modprobe.d should use filenames ending in
.conf. modprobe silently ignores all files which do not match
this convention.
.
If the file is an example containing only comments, consider installing
it in another location as files in /etc/modprobe.d are
read each time modprobe is run (which is often at boot time).
Tag: file-in-discouraged-x11-font-directory
Severity: minor
Certainty: certain
Ref: policy 11.8.5
Info: For historical reasons, use of PEX, CID,
Speedo, and cyrillic subdirectories of
/usr/share/fonts/X11 are permitted, but installation of files
into these directories is discouraged. Support for the first three font
types is deprecated or no longer available, and Cyrillic fonts should use
the normal font directories where possible.
Tag: file-in-unknown-x11-font-directory
Severity: serious
Certainty: certain
Ref: policy 11.8.5
Info: Subdirectories of /usr/share/fonts/X11 other than
100dpi, 75dpi, misc, Type1, and some
historic exceptions must be neither created nor used. (The directories
encodings and util, used by some X Window System
packages, are also permitted by Lintian.)
Tag: package-contains-multiple-dpi-fonts
Severity: normal
Certainty: certain
Ref: policy 11.8.5
Info: This package contains both 100dpi and 75dpi bitmapped fonts. Both
versions should not be included in a single package. If both resolutions
are available, they should be provided in separate binary packages with
-75dpi or -100dpi appended to the package name for the
corresponding fonts.
Tag: package-mixes-misc-and-dpi-fonts
Severity: normal
Certainty: certain
Ref: policy 11.8.5
Info: This package contains both bitmapped fonts for a specific DPI
(100dpi or 75dpi) and misc bitmapped fonts. These should not be combined
in the same package. Instead, the misc bitmapped fonts should be
provided in a separate package with -misc appended to its name.
Tag: package-contains-info-dir-file
Severity: serious
Certainty: certain
Info: This package contains a file named dir or dir.old,
possibly compressed, in /usr/share/info. This is the directory
(or backup) of info pages and is generated automatically by install-info
when a package containing info documentation is installed. Some upstream
build systems create it automatically, but it must not be included in a
package since it needs to be generated dynamically based on the installed
info files on the system.
Tag: package-contains-mime-cache-file
Severity: serious
Certainty: certain
Info: This package contains a cache file generated automatically by
update-mime-database when a package containing MIME-Info Database
files is installed. Some upstream build systems create them
automatically, but they must not be included in a package since they need
to be generated dynamically based on the installed MIME-Info Database
files on the system.
Tag: package-contains-mimeinfo.cache-file
Severity: serious
Certainty: certain
Info: This package contains a file named mimeinfo.cache,
possibly compressed, in /usr/share/applications. This file is
generated automatically by update-desktop-database when a package
containing .desktop files associated to MIME types is installed.
Some upstream build systems create it automatically, but it must not be
included in a package since it needs to be generated dynamically based on
the installed .desktop files on the system.
Tag: package-modifies-ld.so-search-path
Severity: important
Certainty: possible
Ref: policy 10.2
Info: This package installs a file in /etc/ld.so.conf.d,
presumably to modify the search path of the run-time linker, and does not
appear to be part of libc.
.
Packages containing shared libraries should either install them into
/usr/lib or should require binaries built against them to set
RPATH to find the library at run-time. Installing libraries in a
different directory and modifying the run-time linker path is equivalent
to installing them into /usr/lib except now conflicting library
packages may cause random segfaults and difficult-to-debug problems
instead of conflicts in the package manager.
Tag: global-data-in-games-directory
Severity: important
Certainty: certain
Info: This package contains files under /usr/share/games, such as
desktop files, icons, pixmaps, or MIME type entries, that are global
system data. The user's desktop environment will only check in the
directories directly under /usr/share and this information
should be put in the global directory even if it is for games.
.
The most common cause of this problem is using a
--datadir=/usr/share/games argument to configure or an
equivalent and using the upstream installation rules. These files need
to be moved into the corresponding directories directly under
/usr/share.
Tag: duplicated-compressed-file
Severity: minor
Certainty: possible
Info: The given, apparently compressed, file is shipped in the package
in addition to another file with the same name without the
compression-method extension. Normally this indicates a mistake in the
installation process of the package.
Tag: udev-rule-in-etc
Severity: important
Certainty: certain
Ref: #559208
Info: This package ships a udev rule and installs it under
/etc/udev/rules.d, which is reserved for user-installed files.
The correct directory for system rules is /lib/udev/rules.d.
Tag: obsolete-comments-style-in-php-ini
Severity: normal
Certainty: certain
Info: This package ships a .ini file used to configure php but
it has comments using the old-style comment separator #.
Instead, the ; separator should be used.
.
Since version 5.3, the PHP interpreter warns about the use of the
old style of comment separator.
Tag: triplet-dir-and-architecture-mismatch
Severity: serious
Certainty: possible
Ref: policy 9.1.1
Info: This package contains a directory under /lib or
/usr/lib which doesn't match the proper triplet for the
binary package's architecture. This is very likely to be a mistake
when indicating the underlying build system where the files should be
installed.
Tag: empty-binary-package
Severity: important
Certainty: wild-guess
Info: This binary package appears to be empty, and its description does
not say that it's a metapackage or a transitional package. This is
often due to problems with updating debhelper *.install files during
package renames or similar problems where installation rules don't put
files in the correct place.
.
If the package is deliberately empty, please mention in the package long
description one of the phrases "metapackage", "dummy", "dependency
package", or "empty package".
Tag: empty-udeb-package
Severity: minor
Certainty: wild-guess
Experimental: yes
Info: This udeb package appears to be empty, and its description does
not say that it's a metapackage or an package. This is often due to
problems with updating debhelper *.install files during package
renames or similar problems where installation rules don't put files
in the correct place.
.
If the package is deliberately empty, you can avoid this tag by
using one of the following phrases "metapackage", "dummy", "dependency
package", or "empty package" in the long description of the udeb.
Tag: star-file
Severity: important
Certainty: possible
Info: The given file is literally installed as * (star
symbol). Normally this indicates a mistake in the installation
process of the package either when creating symlinks or renaming files.
Tag: incorrect-locale-code
Severity: normal
Certainty: possible
Info: The package appears to ship locales for a language but uses an
incorrect locale code as a subdirectory of /usr/share/locale.
This usually results in users of the intended target language not
finding the locale. The language codes used in the locale directories
are those from the ISO 639-1 and ISO 639-2 standards, not those
usually used as TLDs (which are from the ISO 3166 standard).
.
Lintian only knows about some commonly-mistaken set of incorrect
locale codes.
Tag: unknown-locale-code
Severity: normal
Certainty: certain
Ref: http://www.loc.gov/standards/iso639-2/php/code_list.php
Info: The package appears to ship locales for a language but uses an
unknown locale code as a subdirectory of /usr/share/locale.
This usually results in users of the intended target language not
finding the locale. The language codes used in the locale directories
are those from the ISO 639-1 and ISO 639-2 standards, not those
usually used as TLDs (which are from the ISO 3166 standard).
.
It is possible that the language code was mistyped or incorrectly
guessed from the language's or country's name.
Tag: compressed-objects.inv
Severity: normal
Certainty: possible
Info: The package appears to ship a gzip compressed objects.inv file
in it's documentation. Unfortunately some tools do not cope with
this file being compressed.
.
This file should be excluded from compression during build time.
If using debhelper (<< 8.1.0), you may need to use the -X
option to dh_compress. Newer versions of debhelper handle this
correctly by default.
Tag: package-contains-no-arch-dependent-files
Severity: minor
Certainty: possible
Experimental: yes
Info: The package is not marked architecture all, but all the files it
ships are installed in /usr/share.
.
Most likely this package should be marked architecture all, but there
is a chance that the package is missing files.
Ref: policy 5.6.8
Tag: vim-addon-within-vim-runtime-path
Severity: normal
Certainty: certain
Info: Vim addons should not be installed directly under a directory contained
in the Vim runtime path. Users shall be given the freedom to choose which
addons they want to have enabled and which they don't.
Ref: vim-policy 3.1
Tag: perl-module-uses-perl4-libs-without-dep
Severity: normal
Certainty: possible
Info: This package includes perl modules using obsoleted perl 4-era
libraries. These libraries have been deprecated in perl in 5.14, and
are likely to be removed from the core in perl 5.16. Please either
remove references to these libraries, or add a dependency on
libperl4-corelibs-perl | perl (<< 5.12.3-7) to this package.
Tag: gzip-file-is-not-multi-arch-same-safe
Severity: important
Certainty: certain
Info: The gzip file contains a timestamp that will differ between
architectures. Multi-Arch: same implies all shared files must be
byte-for-byte identical.
.
This can usually be fixed by passing -n to gzip.
Tag: pkg-config-multi-arch-wrong-dir
Severity: important
Certainty: possible
Info: The arch all pkg-config file contains a reference to a multi-arch path.
.
This can be usually be fixed by moving this file to a multi-arch path.
.
Another likely cause is using debhelper 9 or newer (thus enabling
multi-arch paths by default) on a package without multi-arch support.
The usual cure in this case is to update it for multi-arch.
Tag: dir-or-file-in-home
Severity: serious
Certainty: certain
Info: Debian packages should not install into /home, because it
is reserved for users.
Tag: dir-or-file-in-build-tree
Severity: serious
Certainty: possible
Info: Your package install file in our build tree.
Tag: file-name-is-not-valid-UTF-8
Severity: serious
Certainty: certain
Ref: policy 10.10
Info: The file name does not appear to be valid UTF-8.
.
Note that Lintian may be unable to display the filename accurately.
Unprintable characters may have been replaced.
Tag: file-name-in-PATH-is-not-ASCII
Severity: serious
Certainty: certain
Ref: policy 10.10
Info: The given file is in PATH but consists of non-ASCII characters.
.
Note that Lintian may be unable to display the filename accurately.
Unprintable characters may have been replaced.
lintian-2.5.22ubuntu1/checks/manpages.pm 0000664 0000000 0000000 00000041702 12313507507 015054 0 ustar # manpages -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::manpages;
use strict;
use warnings;
use autodie;
use constant LINTIAN_COVERAGE => ($ENV{'LINTIAN_COVERAGE'}//0);
use File::Basename;
use List::MoreUtils qw(any none);
use Text::ParseWords ();
use Lintian::Check qw(check_spelling);
use Lintian::Tags qw(tag);
use Lintian::Util qw(clean_env drain_pipe fail open_gz);
sub run {
my ($pkg, undef, $info, $proc, $group) = @_;
my $ginfo = $group->info;
my (%binary, %link, %manpage);
# Read package contents...
foreach my $file ($info->sorted_index) {
my $file_info = $info->file_info($file);
my $link = $file->link || '';
my ($fname, $path, $suffix) = fileparse($file);
# Binary that wants a manual page?
#
# It's tempting to check the section of the man page depending on the
# location of the binary, but there are too many mismatches between
# bin/sbin and 1/8 that it's not clear it's the right thing to do.
if (
($file->is_symlink or $file->is_file)
and ( ($path eq 'bin/')
or ($path eq 'sbin/')
or ($path eq 'usr/bin/')
or ($path eq 'usr/bin/X11/')
or ($path eq 'usr/bin/mh/')
or ($path eq 'usr/sbin/')
or ($path eq 'usr/games/')
or ($path eq 'usr/X11R6/bin/'))
) {
my $bin = $fname;
$binary{$bin} = $file;
$link{$bin} = $link if $link;
next;
}
if (($path =~ m,usr/(share|X11R6)/man/$,) and ($fname ne '')) {
tag 'manpage-in-wrong-directory', $file;
next;
}
# manual page?
next
unless ($file->is_symlink or $file->is_file)
and (($path =~ m,^usr/man(/\S+),o)
or ($path =~ m,^usr/X11R6/man(/\S+),o)
or ($path =~ m,^usr/share/man(/\S+),o));
my $t = $1;
if ($file =~ m/_build_buildd/ or $file =~ /_tmp_buildd/) {
tag 'manpage-named-after-build-path', $file;
}
if (not $t =~ m,^.*man(\d)/$,o) {
tag 'manpage-in-wrong-directory', $file;
next;
}
my $section = $1;
my $lang = '';
$lang = $1 if $t =~ m,^/([^/]+)/man\d/$,o;
# The country should not be part of the man page locale
# directory unless it's one of the known cases where the
# language is significantly different between countries.
if ($lang =~ /_/ && $lang !~ /^(?:pt_BR|zh_[A-Z][A-Z])$/) {
tag 'manpage-locale-dir-country-specific', $file;
}
my @pieces = split(/\./, $fname);
my $ext = pop @pieces;
if ($ext ne 'gz') {
push @pieces, $ext;
tag 'manpage-not-compressed', $file;
} elsif ($file->is_file) { # so it's .gz... files first; links later
if ($file_info !~ m/gzip compressed data/o) {
tag 'manpage-not-compressed-with-gzip', $file;
} elsif ($file_info !~ m/max compression/o) {
tag 'manpage-not-compressed-with-max-compression', $file;
}
}
my $fn_section = pop @pieces;
my $section_num = $fn_section;
if (scalar @pieces && $section_num =~ s/^(\d).*$/$1/) {
my $bin = join('.', @pieces);
$manpage{$bin} = [] unless $manpage{$bin};
push @{$manpage{$bin}}, { file => $file, lang => $lang };
# number of directory and manpage extension equal?
if ($section_num != $section) {
tag 'manpage-in-wrong-directory', $file;
}
} else {
tag 'manpage-has-wrong-extension', $file;
}
# check symbolic links to other manual pages
if ($file->is_symlink) {
if ($link =~ m,(^|/)undocumented,o) {
if ($path =~ m,^usr/share/man,o) {
# undocumented link in /usr/share/man -- possibilities
# undocumented... (if in the appropriate section)
# ../man?/undocumented...
# ../../man/man?/undocumented...
# ../../../share/man/man?/undocumented...
# ../../../../usr/share/man/man?/undocumented...
if ((
#<<< no perl tidy for now
$link =~ m,^undocumented\.([237])\.gz,o
and $path =~ m,^usr/share/man/man$1,)
or $link =~ m,^\.\./man[237]/undocumented\.[237]\.gz$,o
or $link =~ m,^\.\./\.\./man/man[237]/undocumented\.[237]\.gz$,o
or $link =~ m,^\.\./\.\./\.\./share/man/man[237]/undocumented\.[237]\.gz$,o
or $link =~ m,^\.\./\.\./\.\./\.\./usr/share/man/man[237]/undocumented\.[237]\.gz$,o
#>>>
) {
tag 'link-to-undocumented-manpage', $file;
} else {
tag 'bad-link-to-undocumented-manpage', $file;
}
} else {
# undocumented link in /usr/X11R6/man -- possibilities:
# ../../../share/man/man?/undocumented...
# ../../../../usr/share/man/man?/undocumented...
if (
#<<< no perl tidy for now
$link =~ m,^\.\./\.\./\.\./share/man/man[237]/undocumented\.[237]\.gz$,o
or $link =~ m,^\.\./\.\./\.\./\.\./usr/share/man/man[237]/undocumented\.[237]\.gz$,o
#>>>
) {
tag 'link-to-undocumented-manpage', $file;
} else {
tag 'bad-link-to-undocumented-manpage', $file;
}
}
}
} else { # not a symlink
my $path = $info->unpacked($file);
my $fd;
if ($file_info =~ m/gzip compressed/) {
$fd = open_gz($path);
} else {
open($fd, '<', $path);
}
my @manfile = <$fd>;
close $fd;
# Is it a .so link?
if ($file->size < 256) {
my ($i, $first) = (0, '');
do {
$first = $manfile[$i++] || '';
} while ($first =~ /^\.\\"/ && $manfile[$i]); #");
unless ($first) {
tag 'empty-manual-page', $file;
next;
} elsif ($first =~ /^\.so\s+(.+)?$/) {
my $dest = $1;
if ($dest =~ m,^([^/]+)/(.+)$,) {
my ($manxorlang, $rest) = ($1, $2);
if ($manxorlang !~ /^man\d+$/) {
# then it's likely a language subdir, so let's run
# the other component through the same check
if ($rest =~ m,^([^/]+)/(.+)$,) {
my ($lang, $rest) = ($1, $2);
if ($rest !~ m,^[^/]+\.\d(?:\S+)?(?:\.gz)?$,) {
tag 'bad-so-link-within-manual-page',$file;
}
} else {
tag 'bad-so-link-within-manual-page', $file;
}
}
} else {
tag 'bad-so-link-within-manual-page', $file;
}
next;
}
}
# If it's not a .so link, use lexgrog to find out if the
# man page parses correctly and make sure the short
# description is reasonable.
#
# This check is currently not applied to pages in
# language-specific hierarchies, because those pages are
# not currently scanned by mandb (bug #29448), and because
# lexgrog can't handle pages in all languages at the
# moment, leading to huge numbers of false negatives. When
# man-db is fixed, this limitation should be removed.
if ($path =~ m,/man/man\d/,) {
my $pid = open(my $lexgrog_fd, '-|');
if ($pid == 0) {
clean_env;
open(STDERR, '>&', \*STDOUT);
exec 'lexgrog', $path
or fail "exec lexgrog failed: $!";
}
my $desc = <$lexgrog_fd>;
$desc =~ s/^[^:]+: \"(.*)\"$/$1/;
if ($desc =~ /(\S+)\s+-\s+manual page for \1/i) {
tag 'manpage-has-useless-whatis-entry', $file;
} elsif ($desc =~ /\S+\s+-\s+programs? to do something/i) {
tag 'manpage-is-dh_make-template', $file;
}
drain_pipe($lexgrog_fd);
eval {close($lexgrog_fd);};
if (my $err = $@) {
# Problem closing the pipe?
fail "close pipe: $err" if $err->errno;
# No, then lexgrog returned with a non-zero exit code.
tag 'manpage-has-bad-whatis-entry', $file;
}
}
# If it's not a .so link, run it through 'man' to check for errors.
# If it is in a directory with the standard man layout, cd to the
# parent directory before running man so that .so directives are
# processed properly. (Yes, there are man pages that include other
# pages with .so but aren't simple links; rbash, for instance.)
my @cmd = qw(man --warnings -E UTF-8 -l -Tutf8 -Z);
my $dir;
if ($path =~ m,^(.*)/(man\d/.*)$,) {
$dir = $1;
push @cmd, $2;
} else {
push @cmd, $path;
}
my ($read, $write);
pipe($read, $write);
my $pid = fork();
if ($pid == 0) {
clean_env;
close STDOUT;
close $read;
open(STDOUT, '>', '/dev/null');
open(STDERR, '>&', $write);
if ($dir) {
chdir($dir);
}
$ENV{MANROFFSEQ} = '';
$ENV{MANWIDTH} = 80;
exec { $cmd[0] } @cmd
or fail("cannot run man -E UTF-8 -l: $!");
} else {
# parent - close write end
close $write;
}
while (<$read>) {
# Devel::Cover causes some annoying deep recursion
# warnings and sometimes in our child process.
# Filter them out, but only during coverage.
next if LINTIAN_COVERAGE and m{
\A Deep [ ] recursion [ ] on [ ] subroutine [ ]
"[^"]+" [ ] at [ ] .*B/Deparse.pm [ ] line [ ]
\d+}xsm;
# ignore progress information from man
next if /^Reformatting/;
next if /^\s*$/;
# ignore errors from gzip, will be dealt with at other places
next if /^(?:man|gzip)/;
# ignore wrapping failures for Asian man pages (groff problem)
if ($lang =~ /^(?:ja|ko|zh)/) {
next if /warning \[.*\]: cannot adjust line/;
next if /warning \[.*\]: can\'t break line/;
}
# ignore wrapping failures if they contain URLs (.UE is an
# extension for marking the end of a URL).
next
if
/:(\d+): warning \[.*\]: (?:can\'t break|cannot adjust) line/
and ($manfile[$1 - 1] =~ m,(?:https?|ftp|file)://.+,i
or $manfile[$1 - 1] =~ m,^\s*\.\s*UE\b,);
# ignore common undefined macros from pod2man << Perl 5.10
next if /warning: (?:macro )?\`(?:Tr|IX)\' not defined/;
chomp;
s/^[^:]+://o;
tag 'manpage-has-errors-from-man', $file, $_;
last;
}
close $read;
# reap man process
waitpid $pid, 0;
# Now we search through the whole man page for some common errors
my $lc = 0;
my $hc = 0;
my $draft_mode = 0;
foreach my $line (@manfile) {
$lc++;
chomp $line;
next if $line =~ /^\.\\\"/o; # comments .\"
if ($line =~ /^\.TH\s/) { # header
my ($th_command, $th_title, $th_section, $th_date)
= Text::ParseWords::parse_line('\s+', 0, $line);
if ($th_section && (lc($fn_section) ne lc($th_section))) {
tag 'manpage-section-mismatch',
"$file:$lc $fn_section != $th_section";
}
}
# Catch hyphens used as minus signs by looking for
# ones at the beginning of a word, but don't generate
# false positives on \s-1 (small font), \*(-- (pod2man
# long dash), or things like \h'-1'. Ignoring hyphens
# contained in draft mode (.eo). Do catch hyphens
# after \f[C], a groff font change.
$draft_mode = 1 if $line =~ /^\.\s*eo/;
$draft_mode = 0 if $line =~ /^\.\s*ec/;
if (
not $draft_mode
and $line =~ /^(
([^\.].*)?
[\s\'\"\`\(\[\]]
(?spelling_exceptions)
if ($path =~ m,/man/man\d/,);
}
tag 'hyphen-used-as-minus-sign', $file, ($hc - 10),
'more occurrences not shown'
if ($hc > 10 && !$ENV{'LINTIAN_DEBUG'});
}
}
# Check our dependencies:
foreach my $depproc (@{ $ginfo->direct_dependencies($proc) }) {
# Find the manpages in our related dependencies
my $depinfo = $depproc->info();
foreach my $file ($depinfo->sorted_index){
my ($fname, $path, $suffix) = fileparse($file, qr,\..+$,o);
my $lang = '';
next
unless ($file->is_file or $file->is_symlink)
and (($path =~ m,^usr/man/\S+,o)
or ($path =~ m,^usr/X11R6/man/\S+,o)
or ($path =~ m,^usr/share/man/\S+,o));
next unless ($path =~ m,man\d/$,o);
$manpage{$fname} = [] unless exists $manpage{$fname};
$lang = $1 if $path =~ m,/([^/]+)/man\d/$,o;
$lang = '' if $lang eq 'man';
push @{$manpage{$fname}}, {file => $file, lang => $lang};
}
}
for my $f (sort keys %binary) {
if (exists $manpage{$f}) {
if (none { $_->{lang} eq '' } @{$manpage{$f}}) {
tag 'binary-without-english-manpage', "$binary{$f}";
}
} else {
tag 'binary-without-manpage', "$binary{$f}";
}
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/debian-source-dir.pm 0000664 0000000 0000000 00000006051 12311317603 016545 0 ustar # debian/source directory content -- lintian check script -*- perl -*-
# Copyright (C) 2010 by Raphaël Hertzog
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::debian_source_dir;
use strict;
use warnings;
use autodie;
use List::MoreUtils qw(any);
use Lintian::Data;
use Lintian::Tags qw(tag);
our %KNOWN_FORMATS = map { $_ => 1 }
('1.0', '2.0', '3.0 (quilt)', '3.0 (native)', '3.0 (git)', '3.0 (bzr)');
our $KNOWN_FILES = Lintian::Data->new('debian-source-dir/known-files');
sub run {
my (undef, undef, $info) = @_;
my $dsrc = $info->debfiles('source');
if (!-l "$dsrc/format" && -e "$dsrc/format") {
open(my $fd, '<', "$dsrc/format");
my $format = <$fd>;
chomp $format;
close($fd);
tag 'unknown-source-format', $format unless $KNOWN_FORMATS{$format};
} else {
tag 'missing-debian-source-format';
}
if (!-l "$dsrc/git-patches" && -s "$dsrc/git-patches") {
open(my $git_patches_fd, '<', "$dsrc/git-patches");
if (any { !/^\s*+#|^\s*+$/o} <$git_patches_fd>) {
my $dpseries = $info->debfiles('patches/series');
# gitpkg does not create series as a link, so this is most likely
# a traversal attempt.
if (!-l $dpseries) {
if (!-r $dpseries) {
tag 'git-patches-not-exported';
} else {
open(my $series_fd, '<', $dpseries);
my $comment_line = <$series_fd>;
my $count = grep { !/^\s*+\#|^\s*+$/o } <$series_fd>;
tag 'git-patches-not-exported'
unless (
$count
&& ($comment_line
=~ m/^\s*\#.*quilt-patches-deb-export-hook/o));
close($series_fd);
}
}
}
close($git_patches_fd);
}
if (!-l $dsrc && -d $dsrc) {
opendir(my $dirfd, $dsrc);
while (my $file = readdir($dirfd)) {
next if $file eq '.' or $file eq '..';
tag 'unknown-file-in-debian-source', $file
unless $KNOWN_FILES->known($file);
}
closedir($dirfd);
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/binaries.desc 0000664 0000000 0000000 00000037465 12310413144 015360 0 ustar Check-Script: binaries
Author: Christian Schwarz
Abbrev: bin
Type: binary, udeb
Needs-Info: hardening-info, objdump-info, file-info, strings, index
Info: This script checks binaries and object files for bugs.
Tag: arch-independent-package-contains-binary-or-object
Severity: serious
Certainty: possible
Info: The package contains a binary or object file but is tagged
Architecture: all.
.
If this package contains binaries or objects for cross-compiling or
binary blobs for other purposes independent of the host architecture
(such as BIOS updates or firmware), please add a Lintian override.
Tag: unstripped-binary-or-object
Severity: important
Certainty: certain
Ref: policy 10.1, policy 10.2
Info: The package installs an unstripped binary or object file.
.
Please note, that shared libraries have to be stripped with the
--strip-unneeded option.
Tag: library-in-debug-or-profile-should-not-be-stripped
Severity: serious
Certainty: certain
Info: Libraries in .../lib/debug or in
.../lib/profile must not be stripped; this defeats the whole
point of the separate library.
Tag: statically-linked-binary
Severity: important
Certainty: possible
Info: The package installs a statically linked binary or object file.
.
Usually this is a bug. Otherwise, please add an override if your package
is an exception. Binaries named *-static and *.static are automatically
excluded, as are any binaries in packages named *-static.
Tag: library-not-linked-against-libc
Severity: important
Certainty: possible
Ref: policy 10.2, #698720
Info: The package installs a library which is not dynamically linked
against libc.
.
It is theoretically possible to have a library which doesn't use any
symbols from libc, but it is far more likely that this is a violation
of the requirement that "shared libraries must be linked against all
libraries that they use symbols from in the same way that binaries
are".
Tag: program-not-linked-against-libc
Severity: important
Certainty: possible
Ref: #698720
Info: The package installs a binary which is not dynamically linked
against libc.
.
It is theoretically possible to have a program which doesn't use any
symbols from libc, but it is far more likely that this binary simply
isn't linked correctly.
Tag: binary-or-shlib-defines-rpath
Severity: serious
Certainty: possible
Ref: http://wiki.debian.org/RpathIssue
Info: The binary or shared library sets RPATH. This overrides the normal
library search path, possibly interfering with local policy and causing
problems for multilib, among other issues.
.
The only time a binary or shared library in a Debian package should set
RPATH is if it is linked to private shared libraries in the same package.
In that case, place those private shared libraries in
/usr/lib/package. Libraries used by binaries in other
packages should be placed in /lib or /usr/lib as
appropriate, with a proper SONAME, in which case RPATH is unnecessary.
.
To fix this problem, look for link lines like:
gcc test.o -o test -Wl,--rpath,/usr/local/lib
or
gcc test.o -o test -R/usr/local/lib
and remove the -Wl,--rpath or -R argument. You can also
use the chrpath utility to remove the RPATH.
Tag: binary-has-unneeded-section
Severity: wishlist
Certainty: certain
Info: The binary or shared library is stripped, but still contains a
section that is not useful. You should call strip with
--remove-section=.comment --remove-section=.note to remove the
.note and .comment sections.
.
dh_strip will do this automatically for you, but
install -s not because it calls strip without any arguments.
Tag: missing-depends-line
Severity: normal
Certainty: certain
Info: The package contains an ELF binary with dynamic dependencies,
but does not have a Depends line in its control file. This usually
means that a call to dpkg-shlibdeps is missing from the
package's debian/rules file.
Tag: shared-lib-without-dependency-information
Severity: normal
Certainty: certain
Info: The listed shared library doesn't include information about which
other libraries the library was linked against. (When running "ldd
foo.so" ldd should report about these other libraries. In your
case, ldd just reports "statically linked".)
.
To fix this, you should explicitly specify the libraries which are
used (e.g., "-lc") when building the shared library with "ld".
.
If you have questions about this, please contact &debdev;.
Tag: arch-dependent-file-in-usr-share
Severity: serious
Certainty: certain
Ref: fhs usrsharearchitectureindependentdata
Info: This package installs an ELF binary in the /usr/share
hierarchy, which is reserved for architecture-independent files.
Tag: arch-dependent-file-not-in-arch-specific-directory
Severity: serious
Certainty: possible
Ref: https://wiki.ubuntu.com/MultiarchSpec
Info: This package is Multi-Arch "same", but it installs an ELF binary in the
directory that is not architecture-specific.
Tag: binary-in-etc
Severity: serious
Certainty: certain
Ref: fhs etchostspecificsystemconfiguration
Info: This package installs an ELF binary in /etc. The
Filesystem Hierarchy Standard forbids this.
Tag: binary-compiled-with-profiling-enabled
Severity: normal
Certainty: certain
Info: While profiling is useful for testing and debugging purposes, enabling
it causes a program to leave gmon.out files whenever a user runs it.
Tag: binary-file-compressed-with-upx
Severity: serious
Certainty: certain
Info: Debian does not allow binaries to be compressed by UPX.
Tag: package-name-doesnt-match-sonames
Severity: normal
Certainty: possible
Info: The package name of a library package should usually reflect
the soname of the included library. The package name can determined
from the library file name with the following code snippet:
.
$ objdump -p /path/to/libfoo-bar.so.1.2.3 | sed -n -e's/^[[:space:]]*SONAME[[:space:]]*//p' | \
sed -r -e's/([0-9])\.so\./\1-/; s/\.so(\.|$)//; y/_/-/; s/(.*)/\L&/'
Tag: binary-with-bad-dynamic-table
Severity: serious
Certainty: possible
Info: This appears to be an ELF file. According to readelf, the
program headers suggests it should have a dynamic section, but
readelf cannot find it.
.
If it is meant to be external debugging symbols for another file,
it should be installed under /usr/lib/debug. Otherwise, this
could be a corrupt ELF file.
Tag: apparently-corrupted-elf-binary
Severity: normal
Certainty: possible
Info: This appears to be an ELF file but readelf cannot parse it.
.
This may be a mistake or a corrupted file, you may need to
install binutils-multiarch on the system running lintian so that
non-native binaries are handled correctly, or it may be a
misidentification of a file as ELF that actually isn't.
Tag: missing-dependency-on-libc
Severity: serious
Certainty: possible
Ref: policy 8.6.1
Info: The listed file appears to be linked against the C library, but the
package doesn't depend on the C library package. Normally this indicates
that ${shlibs:Depends} was omitted from the Depends line for this package
in debian/control.
.
All shared libraries and compiled binaries must be run through
dpkg-shlibdeps to find out any libraries they are linked against (often
via the dh_shlibdeps debhelper command). The package containing these
files must then depend on ${shlibs:Depends} in debian/control to
get the proper package dependencies for those libraries.
Tag: missing-dependency-on-libstdc++
Severity: serious
Certainty: possible
Experimental: yes
Ref: policy 8.6.1
Info: The listed file appears to be linked against the C++ library, but the
package doesn't depend on the C++ library package. Normally this indicates
that ${shlibs:Depends} was omitted from the Depends line for this package
in debian/control.
.
All shared libraries and compiled binaries must be run through
dpkg-shlibdeps to find out any libraries they are linked against (often
via the dh_shlibdeps debhelper command). The package containing these
files must then depend on ${shlibs:Depends} in debian/control to
get the proper package dependencies for those libraries.
Tag: missing-dependency-on-perlapi
Severity: serious
Certainty: certain
Ref: perl-policy 4.4.2
Info: This package includes a *.so file in /usr/lib/perl5,
normally indicating that it includes a binary Perl module. Binary Perl
modules must depend on perlapi-$Config{version} (from the Config module).
If the package is using debhelper, this problem is usually due to a
missing dh_perl call in debian/rules or a missing
${perl:Depends} substitution variable in the Depends line in
debian/control.
Tag: missing-dependency-on-phpapi
Severity: serious
Certainty: certain
Info: This package includes a *.so file in /usr/lib/phpN
(where N is a number representing the major PHP version), normally
indicating that it includes a PHP extension. PHP extensions must
depend on phpapi-$(php-configN --phpapi), without adding an
alternative package with the OR operator.
.
This can usually be achieved by, for example, adding the following
code to the binary-arch target of the rules file and adding
${php:Depends} to the Depends field of the binary
package shipping the extension:
.
echo "php:Depends=phpapi-$(php-config5 --phpapi)" > debian/substvars
Tag: missing-dependency-on-numpy-abi
Severity: serious
Certainty: possible
Info: This package includes a Python extension module, which uses Numpy via its
binary interface. Such packages must depend on python-numpy-abiN.
.
If the package is using debhelper, this problem is usually due to a
missing dh_numpy (or dh_numpy3) call in debian/rules.
Ref: /usr/share/doc/python-numpy/README.DebianMaints
Tag: debug-file-should-use-detached-symbols
Severity: normal
Certainty: certain
Ref: devref 6.7.9
Info: This file is in a location generally used for detached debugging
symbols, but it appears to contain a complete copy of the executable or
library instead of only the debugging symbols. Files in subdirectories
of /usr/lib/debug mirroring the main file system should contain
only debugging information generated by objcopy
--only-keep-debug. Binaries or shared objects built with extra
debugging should be installed directly in /usr/lib/debug or in
subdirectories corresponding to the package, not in the directories that
mirror the main file system.
.
If you are using dh_strip with the --dbg-package flag, don't also install
the library in /usr/lib/debug. dh_strip does all the work for
you.
Tag: binary-from-other-architecture
Severity: serious
Certainty: possible
Info: This ELF binary appears to have been built for an architecture other
than the one of the binary package being tested. This may occur when a
pre-built binary is shipped in the package or when an attempt to
cross-compile didn't work.
Tag: spelling-error-in-binary
Severity: minor
Certainty: wild-guess
Info: Lintian found a spelling error in the given binary. Lintian has a
list of common misspellings that it looks for. It does not have a
dictionary like a spelling checker does.
.
If the string containing the spelling error is translated with the help
of gettext or a similar tool, please fix the error in the translations as
well as the English text to avoid making the translations fuzzy. With
gettext, for example, this means you should also fix the spelling mistake
in the corresponding msgids in the *.po files.
.
You can often find the word in the source code by running:
.
grep -rw <word> <source-tree>
.
This tag may produce false positives for words that contain non-ASCII
characters due to limitations in strings.
Tag: embedded-library
Severity: serious
Certainty: possible
Ref: policy 4.13
Info: The given ELF object appears to have been statically linked to
a library. Doing this is strongly discouraged due to the extra work
needed by the security team to fix all the extra embedded copies or
trigger the package rebuilds, as appropriate.
.
If the package uses a modified version of the given library it is highly
recommended to coordinate with the library's maintainer to include the
changes on the system version of the library.
Tag: debug-symbols-directly-in-usr-lib-debug
Severity: important
Certainty: certain
Info: The given debugging symbols-only object is installed directly in
/usr/lib/debug, although it should be installed in a
subdirectory. For example, debug symbols of a binary in
/usr/bin should be placed in /usr/lib/debug/usr/bin.
gdb, when looking for debugging symbols, prepends /usr/lib/debug
to the path of the original binary.
Tag: ocaml-custom-executable
Severity: normal
Certainty: possible
Info: This package provides an OCaml bytecode executable linked with a
custom runtime. Such executables cannot be stripped and require
special care. Their usage is deprecated in favour of shared libraries
for C stubs (dll*.so).
Tag: hardening-no-stackprotector
Severity: normal
Certainty: wild-guess
Info: This package provides an ELF binary that lacks the stack protector
function __stack_chk_fail. Either there are no character arrays used
on the stack of any routines, or the package was not built with the
default Debian compiler flags defined by dpkg-buildflags. If built
using dpkg-buildflags directly, be sure to import CFLAGS
and/or CXXFLAGS.
Ref: http://wiki.debian.org/Hardening
Tag: hardening-no-fortify-functions
Severity: normal
Certainty: wild-guess
Info: This package provides an ELF binary that lacks the use of fortified
libc functions. Either there are no potentially unfortified functions
called by any routines, all unfortified calls have already been fully
validated at compile-time, or the package was not built with the default
Debian compiler flags defined by dpkg-buildflags. If built using
dpkg-buildflags directly, be sure to import CPPFLAGS.
.
NB: Due to false-positives, Lintian ignores some unprotected functions
(e.g. memcpy).
Ref: http://wiki.debian.org/Hardening, #673112
Tag: hardening-no-relro
Severity: normal
Certainty: certain
Info: This package provides an ELF binary that lacks the "read-only
relocation" link flag. This package was likely not built with the
default Debian compiler flags defined by dpkg-buildflags.
If built using dpkg-buildflags directly, be sure to import
LDFLAGS.
Ref: http://wiki.debian.org/Hardening
Tag: debug-file-with-no-debug-symbols
Severity: normal
Certainty: possible
Ref: #668437
Info: The binary is installed as a detached "debug symbols" ELF file,
but it does not appear to have debug information associated with it.
.
Implementation detail: Lintian currently checks for the ".debug_line"
section, which is a part of the DWARF standard.
Tag: binary-file-built-without-LFS-support
Severity: minor
Certainty: possible
Experimental: yes
Info: The listed ELF binary appears to be (partially) built without
"Large File Support" (LFS). If so, it may not be able to handle large
files correctly.
.
To support large files, code review might be needed to make sure that
those files are not slurped into memory or mmap(2)ed, and that correct
64-bit data types are used (ex: off_t instead of ssize_t), etc. Once
that has been done ensure _FILE_OFFSET_BITS is defined and
set to 64 before the relevant files are included. This can be done by
using the AC_SYS_LARGEFILE macro with autoconf.
.
Take into account that even if this tag is not emitted, that does not
mean the binary is LFS-safe (ie. no OOM conditions, file truncation
or overwrite will happen).
.
Also note that enabling LFS on a shared library is not always safe as
it might break ABI in case some of the exported types change size, in
those cases a SOVERSION bump might be required.
lintian-2.5.22ubuntu1/checks/po-debconf.pm 0000664 0000000 0000000 00000016367 12311317616 015304 0 ustar # po-debconf -- lintian check script -*- perl -*-
# Copyright (C) 2002-2004 by Denis Barbier
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::po_debconf;
use strict;
use warnings;
use autodie;
use Lintian::Tags qw(tag);
use Lintian::Util qw(is_ancestor_of system_env);
sub run {
my (undef, undef, $info) = @_;
my $full_translation = 0;
my $debfiles = $info->debfiles;
# First, check wether this package seems to use debconf but not
# po-debconf. Read the templates file and look at the template
# names it provides, since some shared templates aren't
# translated.
opendir(my $dirfd, $debfiles);
my $has_template = my $has_depends = my $has_config = 0;
my @lang_templates;
for my $file (readdir($dirfd)) {
next if -d "$debfiles/$file";
if ($file =~ m/^(.+\.)?templates(\..+)?$/) {
if ($file =~ m/templates\.\w\w(_\w\w)?$/) {
push(@lang_templates, $file);
open(my $fd, '<', "$debfiles/$file");
while (<$fd>) {
tag 'untranslatable-debconf-templates', "$file: $."
if (m/^Description: (.+)/i and $1 !~/for internal use/);
}
close($fd);
} else {
open(my $fd, '<', "$debfiles/$file");
my $in_template = 0;
my $saw_tl_note = 0;
while (<$fd>) {
tag 'translated-default-field', "$file: $."
if (m{^_Default(?:Choice)?: [^\[]*$}) && !$saw_tl_note;
tag 'untranslatable-debconf-templates', "$file: $."
if (m/^Description: (.+)/i and $1 !~/for internal use/);
if (/^#/) {
# Is this a comment for the translators?
$saw_tl_note = 1 if m/translators/i;
next;
}
# If it is not a continuous comment immediately before the
# _Default(Choice) field, we don't care about it.
$saw_tl_note = 0;
if (/^Template: (\S+)/i) {
my $template = $1;
next
if $template eq 'shared/packages-wordlist'
or $template eq 'shared/packages-ispell';
next if $template =~ m,/languages$,;
$in_template = 1;
} elsif ($in_template and /^_?Description: (.+)/i) {
my $description = $1;
next if $description =~ /for internal use/;
$has_template = 1;
} elsif ($in_template and /^$/) {
$in_template = 0;
}
}
close($fd);
}
}
}
closedir($dirfd);
#TODO: check whether all templates are named in TEMPLATES.pot
if ($has_template) {
if (-l "$debfiles/po"
and not is_ancestor_of($debfiles, "$debfiles/po")) {
# debian/po is an unsafe symlink - lets stop here.
return;
}
if (!-d "$debfiles/po") {
tag 'not-using-po-debconf';
return;
}
} else {
return;
}
# If we got here, we're using po-debconf, so there shouldn't be any stray
# language templates left over from debconf-mergetemplate.
for (@lang_templates) {
tag 'stray-translated-debconf-templates', $_ unless /templates\.in$/;
}
my $missing_files = 0;
if (-f "$debfiles/po/POTFILES.in" and not -l "$debfiles/po/POTFILES.in") {
open(my $fd, '<', "$debfiles/po/POTFILES.in");
while (<$fd>) {
chomp;
next if /^\s*\#/;
s/.*\]\s*//;
# Cannot check files which are not under debian/
next if m,^\.\./, or $_ eq '';
unless (-f "$debfiles/$_") {
tag 'missing-file-from-potfiles-in', $_;
$missing_files = 1;
}
}
close($fd);
} else {
tag 'missing-potfiles-in';
$missing_files = 1;
}
if (!-f "$debfiles/po/templates.pot" && !-l "$debfiles/po/templates.pot") {
tag 'missing-templates-pot';
$missing_files = 1;
}
if ($missing_files == 0) {
#<<< No tidy - though we should rewrite this to avoid writing during checks (#699022)
$ENV{'INTLTOOL_EXTRACT'} = '/usr/share/intltool-debian/intltool-extract';
system_env("cd \Q$debfiles/po\E && /usr/share/intltool-debian/intltool-update --gettext-package=test --pot");
system_env("/usr/bin/msgcmp --use-untranslated \Q$debfiles/po/test.pot\E \Q$debfiles/po/templates.pot\E >/dev/null 2>&1"
. "&& /usr/bin/msgcmp --use-untranslated \Q$debfiles/po/templates.pot\E \Q$debfiles/po/test.pot\E >/dev/null 2>&1"
) == 0 or tag 'newer-debconf-templates';
#>>>
}
opendir(my $po_dirfd, "$debfiles/po");
while (defined(my $file=readdir($po_dirfd))) {
next unless $file =~ m/\.po$/;
tag 'misnamed-po-file', "debian/po/$file"
unless ($file =~ /^[a-z]{2,3}(_[A-Z]{2})?(?:\@[^\.]+)?\.po$/o);
local ($/) = "\n\n";
$_ = '';
# skip suspicious "files"
next if -l "$debfiles/po/$file" || !-f "$debfiles/po/$file";
open(my $fd, '<', "$debfiles/po/$file");
while (<$fd>) {
if (/Language\-Team:.*debian-i18n\@lists\.debian\.org/i) {
tag 'debconf-translation-using-general-list', $file;
}
last if m/^msgstr/m;
}
close($fd);
unless ($_) {
tag 'invalid-po-file', "debian/po/$file";
next;
}
s/"\n"//g;
my $charset = '';
if (m/charset=(.*?)\\n/) {
$charset = ($1 eq 'CHARSET' ? '' : $1);
}
tag 'unknown-encoding-in-po-file', "debian/po/$file"
unless length($charset);
system_env(
'msgfmt -o /dev/null'. " \Q$debfiles/po/$file\E 2>/dev/null") == 0
or tag 'invalid-po-file', "debian/po/$file";
my $stats
= `LC_ALL=C msgfmt -o /dev/null --statistics \Q$debfiles/po/$file\E 2>&1`;
if (!$full_translation && $stats =~ m/^\w+ \w+ \w+\.$/) {
$full_translation = 1;
}
}
closedir($po_dirfd);
tag 'no-complete-debconf-translation' if !$full_translation;
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/debhelper.desc 0000664 0000000 0000000 00000027516 12310413206 015511 0 ustar Check-Script: debhelper
Author: Joey Hess
Abbrev: dh
Type: source
Info: This looks for common mistakes in debhelper source packages.
Needs-Info: debfiles
Tag: maintainer-script-lacks-debhelper-token
Severity: normal
Certainty: possible
Info: This package is built using debhelper commands that may modify
maintainer scripts, but the maintainer scripts do not contain
the "#DEBHELPER#" token debhelper uses to modify them.
.
Adding the token to the scripts is recommended.
Tag: package-uses-debhelper-but-lacks-build-depends
Severity: important
Certainty: possible
Info: If a package uses debhelper, it must declare a Build-Depends
on debhelper.
Tag: package-lacks-versioned-build-depends-on-debhelper
Severity: pedantic
Certainty: certain
Info: The package either doesn't declare a versioned build dependency on
debhelper or does not declare a versioned build dependency on a new
enough version of debhelper to satisfy the declared compatibility level.
.
Recommended practice is to always declare an explicit versioned
dependency on debhelper equal to or greater than the compatibility level
used by the package, even if the versioned dependency isn't strictly
necessary. Having a versioned dependency also helps with backports to
older releases and correct builds on partially updated systems.
Ref: debhelper(7)
Tag: package-needs-versioned-debhelper-build-depends
Severity: minor
Certainty: certain
Info: The package either doesn't declare a versioned build dependency on
debhelper or does not declare a versioned build dependency on a new
enough version of debhelper to satisfy the declared compatibility level.
.
The required version of debhelper is not guaranteed to be satisfied
in all supported releases of Debian and therefore this may lead to
a build failure.
.
Recommended practice is to always declare an explicit versioned
dependency on debhelper equal to or greater than the compatibility level
used by the package, even if the versioned dependency isn't strictly
necessary. Having a versioned dependency also helps with backports to
older releases and correct builds on partially updated systems.
.
Note if you are using a compat level, which is marked as experimental,
such as compat 9 in debhelper 8.1.3, then please override this tag.
Ref: debhelper(7)
Tag: dh-make-template-in-source
Severity: normal
Certainty: possible
Info: This package contains debian/*.ex and/or debian/ex.* files
installed by dh_make. These are intended to be filled in with the
package's details and renamed for use by various debhelper commands.
If they are not being used, they should be removed.
Tag: dh_suidregister-is-obsolete
Severity: normal
Certainty: certain
Ref: dh_suidregister(1)
Info: suidregister is obsoleted by dpkg-statoverride, so registration of
files in with dh_suidregister is unnecessary, and even harmful.
Tag: dh_undocumented-is-obsolete
Severity: normal
Certainty: certain
Ref: dh_undocumented(1)
Info: This package calls dh_undocumented in its debian/rules
file. The dh_undocumented command is obsolete and does nothing, since
it's former behavior of adding symlinks to the undocumented(7) man page
is now obsolete.
Tag: dh_pysupport-is-obsolete
Severity: normal
Certainty: certain
Info: This package calls dh_pysupport in its debian/rules file.
dh_pysupport is deprecated and has been replaced by dh_python2.
.
dh_python2 is available in Squeeze; if backporting the package to a
Lenny or older system, please ignore this warning.
Ref: http://wiki.debian.org/Python/TransitionToDHPython2
Tag: dh_installmanpages-is-obsolete
Severity: normal
Certainty: certain
Ref: dh_installmanpages(1)
Info: This package calls dh_installmanpages in its debian/rules file.
dh_installmanpages is deprecated in favour of dh_installman.
Tag: dh_desktop-is-deprecated
Severity: normal
Certainty: certain
Ref: dh_desktop(1)
Info: This package calls dh_desktop in its debian/rules file.
dh_desktop is deprecated and no longer does anything. The setup it used
to handle is now done with triggers.
Tag: dh_scrollkeeper-is-deprecated
Severity: normal
Certainty: certain
Ref: dh_scrollkeeper(1)
Info: This package calls dh_scrollkeeper in its debian/rules file.
dh_scrollkeeper is deprecated and no longer does anything. scrollkeeper
has been replaced by rarian, which does not require the functionality
dh_scrollkeeper used to provide.
Tag: dh-clean-k-is-deprecated
Severity: normal
Certainty: certain
Ref: dh_clean(1)
Info: This package calls dh_clean -k in its debian/rules file
and declares a debhelper compatibility version of at least 7.
.
debhelper 7 deprecated dh_clean -k in favour of dh_prep.
Tag: debhelper-compat-file-is-empty
Severity: important
Certainty: certain
Ref: debhelper(7)
Info: The source package has an empty debian/compat file. This is an error,
the compat level of debhelper should be in there. Note that only the first
line of the file is relevant.
Tag: declares-possibly-conflicting-debhelper-compat-versions
Severity: important
Certainty: certain
Ref: debhelper(7)
Info: The source package declares the debhelper compatibility version
both in the debian/compat file and in the debian/rules
file. If these ever get out of synchronisation, the package may not build
as expected.
Tag: package-uses-deprecated-debhelper-compat-version
Severity: normal
Certainty: certain
Ref: debhelper(7)
Info: The debhelper compatibility version used by this package is marked
as deprecated by the debhelper developer. You should really consider
using a newer compatibility version.
.
The compatibility version can be set in (preferred)
debian/compat or by setting and exporting DH_COMPAT in
debian/rules. If it is not set in either place, debhelper
defaults to the deprecated compatibility version 1.
Tag: debhelper-but-no-misc-depends
Severity: normal
Certainty: possible
Ref: debhelper(7)
Info: The source package uses debhelper, but it does not include
${misc:Depends} in the given binary package's debian/control entry. Any
debhelper command may add dependencies to ${misc:Depends} that are
required for the work that it does, so recommended best practice is to
always add ${misc:Depends} to the dependencies of each binary package if
debhelper is in use.
Tag: missing-build-dependency-for-dh_-command
Severity: important
Certainty: possible
Info: The source package appears to be using a dh_ command but doesn't build
depend on the package that actually provides it. If it uses it, it must
build depend on it.
Tag: missing-build-dependency-for-dh-addon
Severity: important
Certainty: possible
Info: The source package appears to be using a dh addon but doesn't build
depend on the package that actually provides it. If it uses it, it must
build depend on it.
Tag: brace-expansion-in-debhelper-config-file
Severity: normal
Certainty: possible
Info: This debhelper config file appears to use shell brace expansion
(such as {foo,bar}) to specify files. This happens to work due
to an accident of implementation but is not a supported feature. Only
?, *, and [...] are supported.
Ref: debhelper(1)
Tag: weak-dependency-on-misc-depends
Severity: normal
Certainty: possible
Ref: debhelper(7)
Info: The source package declares a weak dependency on ${misc:Depends} in
the given binary package's debian/control entry. A stronger dependency, that
is one that ensures the package's installation, is required so that the
additional commands are available to the maintainer scripts when they are run.
Tag: debhelper-compat-not-a-number
Severity: important
Certainty: certain
Ref: debhelper(7)
Info: The debhelper compatibility level specified in
debian/compat is not a number.
Tag: debhelper-compatibility-level-not-a-number
Severity: important
Certainty: possible
Info: The debhelper compatibility level specified in debian/rules
is not a number. If you're using make functions or other more complex
methods to generate the compatibility level, write the output into
debian/compat instead of setting DH_COMPAT. The latter should
be available for a user to override temporarily.
Tag: temporary-debhelper-file
Severity: important
Certainty: certain
Ref: dh_clean(1)
Info: The package contains temporary debhelper files, which are normally
removed by dh_clean. The most common cause for this is that a
binary package has been renamed or removed without cleaning the build
directory first.
Tag: unused-build-dependency-on-cdbs
Severity: normal
Certainty: possible
Info: The package build-depends on cdbs, but does not include any cdbs
files in debian/rules.
Tag: python-depends-but-no-python-helper
Severity: serious
Certainty: possible
Info: The source package declares a dependency on ${python:Depends} in the
given binary package's debian/control entry. However, debian/rules doesn't
call any helper that would generate this substitution variable.
.
When using debhelper compatibility level below 9, dh will call dh_pysupport by
default if it's installed, but the build dependency on python-support is still
necessary.
Tag: python3-depends-but-no-python3-helper
Severity: serious
Certainty: possible
Info: The source package declares a dependency on ${python3:Depends} in the
given binary package's debian/control entry. However, debian/rules doesn't
call any helper that would generate this substitution variable.
Tag: package-file-is-executable
Severity: normal
Certainty: certain
Info: The packaging file is marked executable. For control, changelog and
copyright there is no reason for them to be executable.
.
This tag is also emitted if a debhelper file is marked executable without
using compat level 9, since debhelper does not execute them at lower
compat levels.
Tag: executable-debhelper-file-without-being-executable
Severity: important
Certainty: possible
Info: The packaging file is marked executable, but it does not appear to be
executable (e.g. it has no #! line).
.
If debhelper file is not supposed to be executable, please remove the
executable bit from it.
Tag: dh-exec-private-helper
Severity: important
Certainty: certain
Info: The packaging file uses dh-exec, but it does not use /usr/bin/dh-exec.
.
If running dh-exec with the default set of helpers is not desired,
use its --with or --without options instead of directly using the
desired helper.
Tag: package-uses-dh-exec-but-lacks-build-depends
Severity: important
Certainty: possible
Info: If a package uses dh-exec, it must declare a Build-Depends
on it.
Tag: dh-exec-script-without-dh-exec-features
Severity: normal
Certainty: possible
Info: The package uses dh-exec in at least one of its files, but does
not use any of the features provided by dh-exec.
.
If the features provided by dh-exec is not needed, please remove the
executable bit, and the dh-exec usage.
Tag: dh-exec-install-not-allowed-here
Severity: important
Certainty: possible
Info: The package uses a dh-exec-install construct in a non-.install
file.
.
The dh-exec-install constructs are only allowed in dh_install's
.install files, and nowhere else.
Tag: dh-exec-subst-unknown-variable
Severity: minor
Certainty: wild-guess
Info: The package uses a variable in one of its debhelper config
files, but the variable is not one known to dpkg-architecture.
.
It is recommended to use a known subset of variables. If the package
needs more than that, and makes sure the variable is exported through
the build one way or the other, then this tag can be safely ignored
or overridden.
Tag: debhelper-compat-file-is-missing
Severity: normal
Certainty: certain
Info: The package uses debhelper but does not ship a compat file.
This is deprecated and eventually cause the package to FTBFS.
.
Please refer to the debhelper documentation on how to create the
compat file and the differences between each compat level.
Ref: http://packages.qa.debian.org/d/debhelper/news/20120115T191738Z.html,
debhelper(7)
lintian-2.5.22ubuntu1/checks/lintian.desc 0000664 0000000 0000000 00000002326 12310413144 015206 0 ustar Check-Script: lintian
Info: This description file is a special case. It contains the tag info
for the tags produced by the lintian frontend itself.
.
The tags in this check are enabled in all profiles by default, but can
be disabled.
Tag: unused-override
Severity: wishlist
Certainty: certain
Ref: lintian 2.4.3
Info: Lintian discovered an unused override entry in its database.
Most likely it was used for a false-positive that has been fixed.
However, some tags are only triggered in packages built on certain
architectures. In this case, the override may need an architecture
qualifier.
.
If the override is unused, please remove it from the overrides file.
Tag: malformed-override
Severity: important
Certainty: certain
Ref: lintian 2.4.1
Info: Lintian discovered an override entry with an invalid format. An
override entry should have the format:
.
[[<package>][ <archlist>][ <type>]:] <tag>[ <extra> ...]
.
where <package> is the package name, <archlist> is an
architecture list, <type> specifies the package type (binary is the
default), <tag> is the tag to override, and <extra> is any
specific information for the particular tag to override.
lintian-2.5.22ubuntu1/checks/rules.desc 0000664 0000000 0000000 00000022651 12310413206 014704 0 ustar Check-Script: rules
Author: Russ Allbery
Type: source
Needs-Info: debfiles
Info: Check targets and actions in debian/rules.
Abbrev: rul
Tag: debian-rules-is-symlink
Severity: normal
Certainty: certain
Info: The file debian/rules is a symlink instead of a regular
file. This is unnecessary and makes package checking and manipulation
more difficult. If the rules file should be available in the source
package under multiple names, make debian/rules the real
file and the other names symlinks to it.
.
This problem may have prevented lintian from performing other checks,
leading to undetected changelog errors.
Tag: debian-rules-not-a-makefile
Severity: serious
Certainty: certain
Ref: policy 4.9
Info: The debian/rules file for this package does not appear to
be a makefile or does not start with the required line.
debian/rules must be a valid makefile and must have
"#!/usr/bin/make -f" as its first line.
Tag: debian-rules-missing-required-target
Severity: serious
Certainty: certain
Ref: policy 4.9
Info: The debian/rules file for this package does not provide one
of the required targets. All of build, binary, binary-arch,
binary-indep, and clean must be provided, even if they don't do anything
for this package.
Tag: debian-rules-missing-recommended-target
Severity: normal
Certainty: certain
Ref: policy 4.9
Info: The debian/rules file for this package does not provide
one of the recommended targets. All of build-arch and build-indep
should be provided, even if they don't do anything for this package.
If this package does not currently split building of architecture
dependent and independent packages, the following rules may be added
to fall back to the build target:
.
build-arch: build
build-indep: build
.
Note that the following form is recommended however:
.
build: build-arch build-indep
build-arch: build-stamp
build-indep: build-stamp
build-stamp:
build here
.
These targets will be required by policy in the future, so should be
added to prevent future breakage.
Tag: debian-rules-missing-good-practice-target-dfsg
Severity: wishlist
Certainty: certain
Ref: policy 4.9, devref 6.7.8.2
Info: The debian/rules file for this package does not provide
one of the good practice targets.
.
If your packaged is repacked from non dfsg source, you should add a
get-orig-source target.
Tag: debian-rules-uses-deprecated-makefile
Severity: normal
Certainty: certain
Info: The debian/rules file for this package appears to
include a Makefile that has been deprecated. Please refer to the
documentation of the providing package for a replacement (if any).
Tag: debian-rules-should-not-use-pwd
Severity: normal
Certainty: certain
Info: The debian/rules file for this package appears to use the
variable $(PWD) to refer to the current directory. This variable is not
set by GNU make and therefore will have whatever value it has in the
environment, which may not be the actual current directory. Some ways of
building Debian packages (such as through sudo) will clear the PWD
environment variable.
.
Instead of $(PWD), use $(CURDIR), which is set by GNU make, ignores the
environment, and is guaranteed to always be set.
Tag: debian-rules-ignores-make-clean-error
Severity: normal
Certainty: certain
Info: A rule in the debian/rules file for this package calls the
package's clean or distclean target with a line like:
.
-$(MAKE) distclean
or
$(MAKE) -i distclean
.
The leading "-" or the option -i tells make to ignore all errors.
Normally this is done for packages using Autoconf since Makefile may not
exist. However, this line ignores all other error messages, not just
the missing Makefile error. It's better to use:
.
[ ! -f Makefile ] || $(MAKE) distclean
.
so that other error messages from the clean or distclean rule will still
be caught (or just remove the "-" if the package uses a static makefile).
Tag: debian-rules-should-not-use-DEB_BUILD_OPTS
Severity: normal
Certainty: certain
Info: The standard environment variable for build options is
DEB_BUILD_OPTIONS. Usually, referring to DEB_BUILD_OPTS is a mistake and
DEB_BUILD_OPTIONS was intended instead.
Tag: debian-rules-should-not-automatically-update-control
Severity: serious
Certainty: possible
Info: DEB_AUTO_UPDATE_DEBIAN_CONTROL appears to be set to yes in
the debian/rules file. This activates a feature of CDBS which
may not be used in packages uploaded to the Debian archive.
Ref: http://ftp-master.debian.org/REJECT-FAQ.html
Tag: debian-rules-sets-DH_COMPAT
Severity: normal
Certainty: certain
Ref: debhelper(7)
Info: As of debhelper version 4, the DH_COMPAT environment variable is
only to be used for temporarily overriding debian/compat. Any
line in debian/rules that sets it globally should be deleted and
a separate debian/compat file created if needed.
Tag: binary-arch-rules-but-pkg-is-arch-indep
Severity: normal
Certainty: certain
Info: It looks like you try to run code in the binary-arch target of
debian/rules, even though your package is architecture-
independent.
Tag: debian-rules-calls-debhelper-in-odd-order
Severity: normal
Certainty: certain
Info: One of the targets in the debian/rules file for this
package calls debhelper programs in an odd order. Normally,
dh_makeshlibs should be run before dh_shlibdeps or dh_installdeb, and
dh_shlibdeps should be run before dh_gencontrol. dh_builddeb should be
the last debhelper action when building the package, after any of the
other programs mentioned. Calling these programs in the wrong order may
cause incorrect or missing package files and metadata.
Tag: missing-build-dependency
Severity: serious
Certainty: possible
Ref: policy 4.2
Info: The package doesn't specify a build dependency on a package that is
used in debian/rules.
.
lintian intentionally does not take into account transitive dependencies.
Even if the package build-depends on some package that in turn
depends on the needed package, an explicit build dependency should
be added. Otherwise, a latent bug is created that will appear without
warning if the other package is ever updated to change its dependencies.
Even if this seems unlikely, please always add explicit build
dependencies on every non-essential, non-build-essential package that is
used directly during the build.
Tag: missing-python-build-dependency
Severity: important
Certainty: certain
Ref: policy 4.2
Info: The package appears to use Python as part of its build process in
debian/rules but doesn't depend on Python.
.
Normally, packages that use Python as part of the build process should
build-depend on one of python, python-all, python-dev, or python-all-dev
depending on whether they support multiple versions of Python and whether
they're building modules or only using Python as part of the package
build process. Packages that depend on a specific version of Python may
build-depend on the appropriate pythonX.Y or pythonX.Y-dev package
instead.
Tag: clean-should-be-satisfied-by-build-depends
Severity: important
Certainty: certain
Ref: policy 7.7
Info: The specified package is required to run the clean target of
debian/rules and therefore must be listed in Build-Depends, not
Build-Depends-Indep, even if no architecture-dependent packages are
built.
Tag: debian-rules-makemaker-prefix-is-deprecated
Severity: normal
Certainty: possible
Ref: perl-policy 4.3
Info: The package appears to use an ExtUtils::MakeMaker
(Makefile.PL) build system and sets the temporary installation path by
overriding PREFIX when calling make install. This only
works because of a Debian-specific change to ExtUtils::MakeMaker
that the maintainers of the Debian perl package intend to remove.
.
The correct way to set the installation directory is with DESTDIR.
Setting PREFIX should not be necessary at all.
.
For example, the line
make install PREFIX=$(TMP)/usr # WRONG
should be replaced with
make install DESTDIR=$(TMP) # RIGHT
Tag: debian-rules-should-not-use-or-modify-user-only-variable
Severity: normal
Certainty: possible
Ref: #631786
Info: The rules files appear to be reading or modifying a variable not
intended for use by package maintainers. The special variables
.
DEB_*FLAGS_{SET,APPEND}
.
can be used by users, who wants to re-compile debian packages with
special (or non-standard) build flags.
Tag: debian-rules-should-not-use-underscore-variable
Severity: normal
Certainty: possible
Ref: policy 4.9
Info: The rules file use the make variable $(_).
.
According to Policy 4.9, 'invoking either of make -f debian/rules
<...> or ./debian/rules
<args...>' must result in identical behavior'.
One way to inadvertently violate this policy is to use the $_ variable.
.
If the rules file uses $(dir $(_)) to discover the directory containing
the source package (presumably in order to implement the get-orig-source
target), please replace it by $(dir $(firstword $(MAKEFILE_LIST))).
Tag: package-would-benefit-from-build-arch-targets
Severity: normal
Certainty: certain
Ref: #629385, https://wiki.debian.org/ReleaseGoals/BuildArchTarget
Info: The source package does not have both a build-arch and a build-indep
target. Furthermore it is part of the selected set of packages to
be fixed for Wheezy.
.
Please consider adding both the build-arch and build-indep targets.
lintian-2.5.22ubuntu1/checks/cruft.pm 0000664 0000000 0000000 00000116772 12313553042 014411 0 ustar # cruft -- lintian check script -*- perl -*-
#
# based on debhelper check,
# Copyright (C) 1999 Joey Hess
# Copyright (C) 2000 Sean 'Shaleh' Perry
# Copyright (C) 2002 Josip Rodin
# Copyright (C) 2007 Russ Allbery
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::cruft;
use strict;
use warnings;
use autodie;
use v5.10;
use Carp qw(croak confess);
use Cwd();
use File::Find;
# Half of the size used in the "sliding window" for detecting bad
# licenses like GFDL with invariant sections.
# NB: Keep in sync cruft-gfdl-fp-sliding-win/pre_build.
use constant BLOCKSIZE => 4096;
use Lintian::Data;
use Lintian::Relation ();
use Lintian::Tags qw(tag);
use Lintian::Util qw(fail is_ancestor_of normalize_pkg_path strip);
use Lintian::SlidingWindow;
# All the packages that may provide config.{sub,guess} during the build, used
# to suppress warnings about outdated autotools helper files. I'm not
# thrilled with having the automake exception as well, but people do depend on
# autoconf and automake and then use autoreconf to update config.guess and
# config.sub, and automake depends on autotools-dev.
our $AUTOTOOLS = Lintian::Relation->new(
join(' | ', Lintian::Data->new('cruft/autotools')->all));
our $LIBTOOL = Lintian::Relation->new('libtool | dh-autoreconf');
# load data for md5sums based check
sub _md5sum_based_lintian_data {
my ($filename) = @_;
return Lintian::Data->new(
$filename,
qr/\s*\~\~\s*/,
sub {
my @sliptline = split(/\s*\~\~\s*/, $_[1], 5);
if (scalar(@sliptline) != 5) {
fail "Syntax error in $filename", $.;
}
my ($sha1, $sha256, $name, $reason, $link) = @sliptline;
return {
'sha1' => $sha1,
'sha256' => $sha256,
'name' => $name,
'reason' => $reason,
'link' => $link,
};
});
}
# forbidden files
my $NON_DISTRIBUTABLE_FILES
= _md5sum_based_lintian_data('cruft/non-distributable-files');
# non free files
my $NON_FREE_FILES = _md5sum_based_lintian_data('cruft/non-free-files');
# prebuilt-file or forbidden file type
my $WARN_FILE_TYPE = Lintian::Data->new(
'cruft/warn-file-type',
qr/\s*\~\~\s*/,
sub {
my @sliptline = split(/\s*\~\~\s*/, $_[1], 4);
if (scalar(@sliptline) < 1 or scalar(@sliptline) > 4) {
fail 'Syntax error in cruft/warn-file-type', $.;
}
my ($regtype, $regname, $transformlist) = @sliptline;
# allow empty regname
$regname = defined($regname) ? strip($regname) : '';
if (length($regname) == 0) {
$regname = '.*';
}
# build transform pair
$transformlist //= '';
$transformlist = strip($transformlist);
my $syntaxerror = 'Syntax error in cruft/warn-file-type';
my @transformpairs = ();
unless($transformlist eq '') {
my @transforms = split(/\s*\&\&\s*/, $transformlist);
if(scalar(@transforms) > 0) {
foreach my $transform (@transforms) {
# regex transform
if($transform =~ m'^s/') {
$transform =~ m'^s/([^/]*?)/([^/]*?)/$';
unless(defined($1) and defined($2)) {
fail $syntaxerror, 'in transform regex',$.
}
push(@transformpairs,[$1,$2]);
} elsif ($transform =~ m'^map\s*{') {
$transform
=~ m#^map \s* { \s* 's/([^/]*?)/\'.\$_.'/' \s* } \s* qw\(([^\)]*)\)#x;
unless(defined($1) and defined($2)) {
fail $syntaxerror,'in map transform regex',$.;
}
my $words = $2;
my $match = $1;
my @wordarray = split(/\s+/,$words);
if(scalar(@wordarray) == 0) {
fail $syntaxerror,
'in map transform regex : no qw arg',$.;
}
foreach my $word (@wordarray) {
push(@transformpairs,[$match, $word]);
}
} else {
fail $syntaxerror,'in last field',$.;
}
}
}
}
return {
'regtype' => qr/$regtype/x,
'regname' => qr/$regname/x,
'checkmissing' => (not not scalar(@transformpairs)),
'transform' => \@transformpairs,
};
});
my $MISSING_DIR_SEARCH_PATH
= Lintian::Data->new('cruft/missing-dir-search-path');
# get javascript name
sub _minified_javascript_name_regexp {
my $jsv
= $WARN_FILE_TYPE->value('source-contains-prebuilt-javascript-object');
return defined($jsv)
? $jsv->{'regname'}
: qr/(?i)[\.-](?:min|pack(?:ed)?)\.js$/;
}
sub _get_license_check_file {
my ($filename) = @_;
my $data = Lintian::Data->new(
$filename,
qr/\s*\~\~\s*/,
sub {
my @splitline = split(/\s*\~\~\s*/, $_[1], 5);
my $syntaxerror = 'Syntax error in '.$filename;
if(scalar(@splitline) > 5 or scalar(@splitline) <2) {
fail $syntaxerror, $.;
}
my ($keywords, $sentence, $regex, $firstregex, $callsub)
= @splitline;
$keywords = defined($keywords) ? strip($keywords) : '';
$sentence = defined($sentence) ? strip($sentence) : '';
$regex = defined($regex) ? strip($regex) : '';
$firstregex = defined($firstregex) ? strip($firstregex) : '';
$callsub = defined($callsub) ? strip($callsub) : '';
my @keywordlist = split(/\s*\&\&\s*/, $keywords);
if(scalar(@keywordlist) < 1) {
fail $syntaxerror, 'No keywords line', $.;
}
if($regex eq '') {
$regex = '.*';
}
if($firstregex eq '') {
$firstregex = $regex;
}
my %ret = (
'keywords' => \@keywordlist,
'sentence' => $sentence,
'regex' => qr/$regex/xsm,
'firstregex' => qr/$firstregex/xsm,
);
unless($callsub eq '') {
if($callsub eq '_check_gfdl_license_problem') {
$ret{'callsub'} = \&_check_gfdl_license_problem;
}else {
fail $syntaxerror, 'Unknown sub', $.;
}
}
return \%ret;
});
return $data;
}
# get usual non distribuable license
my $NON_DISTRIBUTABLE_LICENSES
= _get_license_check_file('cruft/non-distributable-license');
# get non free license
# get usual non distribuable license
my $NON_FREE_LICENSES = _get_license_check_file('cruft/non-free-license');
# get usual datas about admissible/not admissible GFDL invariant part of license
my $GFDL_FRAGMENTS = Lintian::Data->new(
'cruft/gfdl-license-fragments-checks',
qr/\s*\~\~\s*/,
sub {
my ($gfdlsectionsregex,$secondpart) = @_;
# allow empty parameters
$gfdlsectionsregex
= defined($gfdlsectionsregex) ? strip($gfdlsectionsregex) : '';
$secondpart //= '';
my ($acceptonlyinfile,$applytag)= split(/\s*\~\~\s*/, $secondpart, 2);
$acceptonlyinfile
= defined($acceptonlyinfile) ? strip($acceptonlyinfile) : '';
$applytag =defined($applytag) ? strip($applytag) : '';
# empty first field is everything
if (length($gfdlsectionsregex) == 0) {
$gfdlsectionsregex = '.*';
}
# empty regname is none
if (length($acceptonlyinfile) == 0) {
$acceptonlyinfile = '.*';
}
my %ret = (
'gfdlsectionsregex' => qr/$gfdlsectionsregex/xis,
'acceptonlyinfile' => qr/$acceptonlyinfile/xs,
);
unless ($applytag eq '') {
$ret{'tag'} = $applytag;
}
return \%ret;
});
# The files that contain error messages from tar, which we'll check and issue
# tags for if they contain something unexpected, and their corresponding tags.
our %ERRORS = (
'index-errors' => 'tar-errors-from-source',
'unpacked-errors' => 'tar-errors-from-source'
);
# Directory checks. These regexes match a directory that shouldn't be in the
# source package and associate it with a tag (minus the leading
# source-contains or diff-contains). Note that only one of these regexes
# should trigger for any single directory.
my @directory_checks = (
[qr,^(.+/)?CVS$, => 'cvs-control-dir'],
[qr,^(.+/)?\.svn$, => 'svn-control-dir'],
[qr,^(.+/)?\.bzr$, => 'bzr-control-dir'],
[qr,^(.+/)?\{arch\}$, => 'arch-control-dir'],
[qr,^(.+/)?\.arch-ids$, => 'arch-control-dir'],
[qr!^(.+/)?,,.+$! => 'arch-control-dir'],
[qr,^(.+/)?\.git$, => 'git-control-dir'],
[qr,^(.+/)?\.hg$, => 'hg-control-dir'],
[qr,^(.+/)?\.be$, => 'bts-control-dir'],
[qr,^(.+/)?\.ditrack$, => 'bts-control-dir'],
# Special case (can only be triggered for diffs)
[qr,^(.+/)?\.pc$, => 'quilt-control-dir'],
);
# File checks. These regexes match files that shouldn't be in the source
# package and associate them with a tag (minus the leading source-contains or
# diff-contains). Note that only one of these regexes should trigger for any
# given file. If the third column is a true value, don't issue this tag
# unless the file is included in the diff; it's too common in source packages
# and not important enough to worry about.
my @file_checks = (
[qr,^(.+/)?svn-commit\.(.+\.)?tmp$, => 'svn-commit-file'],
[qr,^(.+/)?svk-commit.+\.tmp$, => 'svk-commit-file'],
[qr,^(.+/)?\.arch-inventory$, => 'arch-inventory-file'],
[qr,^(.+/)?\.hgtags$, => 'hg-tags-file'],
[qr,^(.+/)?\.\#(.+?)\.\d+(\.\d+)*$, => 'cvs-conflict-copy'],
[qr,^(.+/)?(.+?)\.(r\d+)$, => 'svn-conflict-file'],
[qr,\.(orig|rej)$, => 'patch-failure-file', 1],
[qr,((^|/)\.[^/]+\.swp|~)$, => 'editor-backup-file', 1],
);
# List of files to check for a LF-only end of line terminator, relative
# to the debian/ source directory
our @EOL_TERMINATORS_FILES = qw(control changelog);
sub run {
my (undef, undef, $info) = @_;
my $droot = $info->debfiles;
if (-e "$droot/files" and not -z "$droot/files") {
tag 'debian-files-list-in-source';
}
# This doens't really belong here, but there isn't a better place at the
# moment to put this check.
my $version = $info->field('version');
# If the version field is missing, assume it to be a native,
# maintainer upload as it is probably the most likely case.
$version = '0-1' unless defined $version;
if ($info->native) {
if ($version =~ /-/ and $version !~ /-0\.[^-]+$/) {
tag 'native-package-with-dash-version';
}
}else {
if ($version !~ /-/) {
tag 'non-native-package-with-native-version';
}
}
# Check if the package build-depends on autotools-dev, automake,
# or libtool.
my $atdinbd= $info->relation('build-depends-all')->implies($AUTOTOOLS);
my $ltinbd = $info->relation('build-depends-all')->implies($LIBTOOL);
# Create a closure so that we can pass our lexical variables into
# the find wanted function. We don't want to make them global
# because we'll then leak that data across packages in a large
# Lintian run.
my %warned;
my $format = $info->field('format');
# Assume the package to be non-native if the field is not present.
# - while 1.0 is more likely in this case, Lintian will probably get
# better results by checking debfiles/ rather than looking for a diffstat
# that may not be present.
$format = '3.0 (quilt)' unless defined $format;
if ($format =~ /^\s*2\.0\s*\z/ or $format =~ /^\s*3\.0\s*\(quilt\)/) {
my $wanted= sub { check_debfiles($info, qr/\Q$droot\E/, \%warned) };
find($wanted, $droot);
}elsif (not $info->native) {
check_diffstat($info->diffstat, \%warned);
}
find_cruft($info, \%warned, $atdinbd, $ltinbd);
for my $file (@EOL_TERMINATORS_FILES) {
my $path = $info->debfiles($file);
next if not -f $path or not is_ancestor_of($droot, $path);
open(my $fd, '<', $path);
while (my $line = <$fd>) {
if ($line =~ m{ \r \n \Z}xsm) {
tag 'control-file-with-CRLF-EOLs', "debian/$file";
last;
}
}
close($fd);
}
# Report any error messages from tar while unpacking the source
# package if it isn't just tar cruft.
for my $file (keys %ERRORS) {
my $tag = $ERRORS{$file};
my $path = $info->lab_data_path($file);
if (-s $path) {
open(my $fd, '<', $path);
local $_;
while (<$fd>) {
chomp;
s,^(?:[/\w]+/)?tar: ,,;
# Record size errors are harmless. Skipping to next
# header apparently comes from star files. Ignore all
# GnuPG noise from not having a valid GnuPG
# configuration directory. Also ignore the tar
# "exiting with failure status" message, since it
# comes after some other error.
next if /^Record size =/;
next if /^Skipping to next header/;
next if /^gpgv?: /;
next if /^secmem usage: /;
next
if /^Exiting with failure status due to previous errors/;
tag $tag, $_;
}
close($fd);
}
}
return;
} #
# -----------------------------------
# Check the diff for problems. Record any files we warn about in $warned so
# that we don't warn again when checking the full unpacked source. Takes the
# name of a file containing diffstat output.
sub check_diffstat {
my ($diffstat, $warned) = @_;
my $saw_file;
open(my $fd, '<', $diffstat);
local $_;
while (<$fd>) {
my ($file) = (m,^\s+(.*?)\s+\|,)
or fail("syntax error in diffstat file: $_");
$saw_file = 1;
# Check for CMake cache files. These embed the source path and hence
# will cause FTBFS on buildds, so they should never be touched in the
# diff.
if ( $file =~ m,(?:^|/)CMakeCache.txt\z,
and $file !~ m,(?:^|/)debian/,){
tag 'diff-contains-cmake-cache-file', $file;
}
# For everything else, we only care about diffs that add files. If
# the file is being modified, that's not a problem with the diff and
# we'll catch it later when we check the source. This regex doesn't
# catch only file adds, just any diff that doesn't remove lines from a
# file, but it's a good guess.
next unless m,\|\s+\d+\s+\++$,;
# diffstat output contains only files, but we consider the directory
# checks to trigger if the diff adds any files in those directories.
my ($directory) = ($file =~ m,^(.*)/[^/]+$,);
if ($directory and not $warned->{$directory}) {
for my $rule (@directory_checks) {
if ($directory =~ /$rule->[0]/) {
tag "diff-contains-$rule->[1]", $directory;
$warned->{$directory} = 1;
}
}
}
# Now the simpler file checks.
for my $rule (@file_checks) {
if ($file =~ /$rule->[0]/) {
tag "diff-contains-$rule->[1]", $file;
$warned->{$file} = 1;
}
}
# Additional special checks only for the diff, not the full source.
if ($file =~ m@^debian/(?:.+\.)?substvars$@) {
tag 'diff-contains-substvars', $file;
}
}
close($fd);
# If there was nothing in the diffstat output, there was nothing in the
# diff, which is probably a mistake.
tag 'empty-debian-diff' unless $saw_file;
return;
}
# Check the debian directory for problems. This is used for Format: 2.0 and
# 3.0 (quilt) packages where there is no Debian diff and hence no diffstat
# output. Record any files we warn about in $warned so that we don't warn
# again when checking the full unpacked source.
sub check_debfiles {
my ($info, $droot, $warned) = @_;
(my $name = $File::Find::name) =~ s,^$droot/,,;
# Check for unwanted directories and files. This really duplicates the
# find_cruft function and we should find a way to combine them.
if (-d) {
for my $rule (@directory_checks) {
if ($name =~ /$rule->[0]/) {
tag "diff-contains-$rule->[1]", "debian/$name";
$warned->{"debian/$name"} = 1;
}
}
}
-f or return;
for my $rule (@file_checks) {
if ($name =~ /$rule->[0]/) {
tag "diff-contains-$rule->[1]", "debian/$name";
$warned->{"debian/$name"} = 1;
}
}
# Additional special checks only for the diff, not the full source.
if ($name =~ m@^(?:.+\.)?substvars$@o) {
tag 'diff-contains-substvars', "debian/$name";
}
return;
}
# Check each file in the source package for problems. By the time we get to
# this point, we've already checked the diff and warned about anything added
# there, so we only warn about things that weren't in the diff here.
#
# Report problems with native packages using the "diff-contains" rather than
# "source-contains" tag. The tag isn't entirely accurate, but it's better
# than creating yet a third set of tags, and this gets the severity right.
sub find_cruft {
my ($info, $warned, $atdinbd, $ltinbd) = @_;
my $prefix = ($info->native ? 'diff-contains' : 'source-contains');
my @worklist;
# start with the top-level dirs
push(@worklist, $info->index('')->children);
ENTRY:
while (my $entry = shift(@worklist)) {
my $name = $entry->name;
my $basename = $entry->basename;
my $path;
my $file_info;
if ($entry->is_dir) {
# Remove the trailing slash (historically we never
# included the slash for these tags and there is no
# particular reason to change that now).
$name = substr($name, 0, -1);
$basename = substr($basename, 0, -1);
# Ignore the .pc directory and its contents, created as
# part of the unpacking of a 3.0 (quilt) source package.
# NB: this catches all .pc dirs (regardless of depth). If you
# change that, please check we have a
# "source-contains-quilt-control-dir" tag.
next if $basename eq '.pc';
# Ignore files in test suites. They may be part of the test.
next
if $basename=~ m{ \A t (?: est (?: s (?: et)?+ )?+ )?+ \Z}xsm;
if (not $warned->{$name}) {
for my $rule (@directory_checks) {
if ($basename =~ /$rule->[0]/) {
tag "${prefix}-$rule->[1]", $name;
# At most one rule will match
last;
}
}
}
push(@worklist, $entry->children);
next ENTRY;
}
if ($entry->is_symlink) {
# An absolute link always escapes the root (of a source
# package). For relative links, it escapes the root if we
# cannot normalize it.
if ($entry->link =~ m{\A / }xsm
or not defined($entry->link_normalized)){
tag 'source-contains-unsafe-symlink', $name;
}
next ENTRY;
}
# we just need normal files for the rest
next ENTRY unless $entry->is_file;
# check non free file
my $md5sum = $info->md5sums->{$name};
if(
_md5sum_based_check(
$name, $md5sum, $NON_DISTRIBUTABLE_FILES,
'license-problem-md5sum-non-distributable-file'
)
) {
next ENTRY;
}
unless ($info->is_non_free) {
_md5sum_based_check($name, $md5sum, $NON_FREE_FILES,
'license-problem-md5sum-non-free-file');
}
$file_info = $info->file_info($name);
# warn by file type
foreach my $tag_filetype ($WARN_FILE_TYPE->all) {
my $warn_data = $WARN_FILE_TYPE->value($tag_filetype);
my $regtype = $warn_data->{'regtype'};
if($file_info =~ m{$regtype}) {
my $regname = $warn_data->{'regname'};
if($name =~ m{$regname}) {
tag $tag_filetype, $name;
if($warn_data->{'checkmissing'}) {
check_missing_source($entry,$info,
$warn_data->{'transform'});
}
}
}
}
# waf is not allowed
if ($basename =~ /\bwaf$/) {
my $path = $info->unpacked($entry);
my $marker = 0;
open(my $fd, '<', $path);
while (my $line = <$fd>) {
next unless $line =~ m/^#/o;
if ($marker && $line =~ m/^#BZ[h0][0-9]/o) {
tag 'source-contains-waf-binary', $name;
last;
}
$marker = 1 if $line =~ m/^#==>/o;
# We could probably stop here, but just in case
$marker = 0 if $line =~ m/^#<==/o;
}
close($fd);
}
unless ($warned->{$name}) {
for my $rule (@file_checks) {
next if ($rule->[2] and not $info->native);
if ($basename =~ /$rule->[0]/) {
tag "${prefix}-$rule->[1]", $name;
}
}
}
# Tests of autotools files are a special case. Ignore
# debian/config.cache as anyone doing that probably knows what
# they're doing and is using it as part of the build.
if ($basename =~ m{\A config.(?:cache|log|status) \Z}xsm) {
if ($entry->dirname ne 'debian') {
tag 'configure-generated-file-in-source', $name;
}
}elsif ($basename =~ m{\A config.(?:guess|sub) \Z}xsm
and not $atdinbd){
open(my $fd, '<', $info->unpacked($entry));
while (<$fd>) {
last
if $.> 10; # it's on the 6th line, but be a bit more lenient
if (/^(?:timestamp|version)='((\d+)-(\d+).*)'$/) {
my ($date, $year, $month) = ($1, $2, $3);
if ($year < 2004) {
tag 'ancient-autotools-helper-file', $name, $date;
}elsif (($year < 2012)
or ($year == 2012 and $month < 4)){
# config.sub >= 2012-04-18 (was 2012-02-10)
# config.guess >= 2012-06-10 (was 2012-02-10)
# Flagging anything earlier than 2012-04 as
# outdated works, due to the "bumped from"
# dates.
tag 'outdated-autotools-helper-file', $name, $date;
}
}
}
close($fd);
}elsif ($basename eq 'ltconfig' and not $ltinbd) {
tag 'ancient-libtool', $name;
}elsif ($basename eq 'ltmain.sh', and not $ltinbd) {
open(my $fd, '<', $info->unpacked($entry));
while (<$fd>) {
if (/^VERSION=[\"\']?(1\.(\d)\.(\d+)(?:-(\d))?)/) {
my ($version, $major, $minor, $debian)=($1, $2, $3, $4);
if ($major < 5 or ($major == 5 and $minor < 2)) {
tag 'ancient-libtool', $name, $version;
}elsif ($minor == 2 and (!$debian || $debian < 2)) {
tag 'ancient-libtool', $name, $version;
}
last;
}
}
close($fd);
}
full_text_check($entry, $info, $name, $info->unpacked($entry));
}
return;
}
# try to check if source is missing
sub check_missing_source {
my ($file, $info, $replacementspairref) = @_;
# do not check missing source for non free
if($info->is_non_free) {
return;
}
my @replacementspair;
if(defined($replacementspairref)) {
@replacementspair = @{$replacementspairref};
}
unless ($file->is_regular_file) {
return;
}
my $basename = $file->basename;
my $dirname = $file->dirname;
my $name = $file->name;
# try to find for each replacement
REPLACEMENT:
foreach my $pair (@replacementspair) {
my $newbasename = $basename;
my ($match, $replace) = @{$pair};
if($match eq '') {
$newbasename = $basename;
} else {
$newbasename =~ s/$match/$replace/g;
}
# next but we may be return an error
if($newbasename eq '') {
next REPLACEMENT;
}
# now try for each path
PATH:
foreach my $path ($MISSING_DIR_SEARCH_PATH->all) {
my $newpath;
# first replace dir name
$path =~ s/\$dirname/$dirname/g;
# absolute path
if(substr($path,0,1) eq '/') {
$path =~ s,^/+,,g;
$newpath = normalize_pkg_path($path.'/'.$newbasename);
}
# relative path
else {
$newpath = normalize_pkg_path($dirname.'/'.$newbasename);
}
# ok we get same name => next
if($newpath eq $name) {
next PATH;
}
# do not check empty
if($newpath eq '') {
next PATH;
}
# found source return
if($info->index($newpath)) {
return;
}
}
}
tag 'source-is-missing', $name;
return;
}
# do basic license check against well known offender
# note that it does not replace licensecheck(1)
# and is only used for autoreject by ftp-master
sub full_text_check {
my ($entry, $info, $name, $path) = @_;
# license string in debian/changelog are probably just change
# Ignore these strings in d/README.{Debian,source}. If they
# appear there it is probably just "file XXX got removed
# because of license Y".
if ( $name eq 'debian/changelog'
or $name eq 'debian/README.Debian'
or $name eq 'debian/README.source') {
return;
}
my $isjsfile = ($name =~ m/\.js/) ? 1 : 0;
if($isjsfile) {
my $minjsregexp = _minified_javascript_name_regexp();
$isjsfile = ($name =~ m{$minjsregexp}) ? 0 : 1;
}
open(my $fd, '<:raw', $path);
# allow to check only text file
unless (-T $fd) {
close($fd);
return;
}
# some js file comments are really really long
my $sfd
= Lintian::SlidingWindow->new($fd, \&lc_block,$isjsfile ? 8092 : 4096);
my %licenseproblemhash;
# we try to read this file in block and use a sliding window
# for efficiency. We store two blocks in @queue and the whole
# string to match in $block. Please emit license tags only once
# per file
BLOCK:
while (my $block = $sfd->readwindow()) {
my ($cleanedblock, %matchedkeyword);
my $blocknumber = $sfd->blocknumber();
if(
_license_check(
$name, $NON_DISTRIBUTABLE_LICENSES,
$block, $blocknumber,
\$cleanedblock, \%matchedkeyword,
\%licenseproblemhash
)
){
return;
}
# some license issues do not apply to non-free
# because these file are distribuable
if ($info->is_non_free) {
next BLOCK;
}
_license_check($name, $NON_FREE_LICENSES,
$block, $blocknumber,\$cleanedblock, \%matchedkeyword,
\%licenseproblemhash);
# check javascript problem
if($isjsfile) {
if($blocknumber == 0) {
my $strip = $block;
# from perl faq strip comments
$strip
=~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//([^\\]|[^\n][\n]?)*?\n|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $3 ? $3 : ""#gse;
# strip empty line
$strip =~ s/^\s*\n//mg;
# remove last \n
$strip =~ s/\n\Z//m;
# compute now means line length
my $total = length($strip);
if($total > 0) {
my $linelength = $total/($strip =~ tr/\n// + 1);
if($linelength > 255) {
tag 'source-contains-prebuilt-javascript-object',
$name, 'means line length is about', $linelength,
'characters';
# Check for missing source. It will check
# for the source file in well known directories
check_missing_source($entry,$info,[['','']]);
}
}
}
}
}
close($fd);
return;
}
sub _tag_gfdl {
my ($applytag, $name, $gfdlsections) = @_;
tag $applytag, $name, 'invariant part is:', $gfdlsections;
return;
}
# return True in case of license problem
sub _check_gfdl_license_problem {
my ($name,$block,$blocknumber,$cleanedblock,$matchedkeyword,
$licenseproblemhash,%matchedhash)
= @_;
my $rawgfdlsections = $matchedhash{rawgfdlsections} || '';
my $rawcontextbefore = $matchedhash{rawcontextbefore} || '';
# strip puntuation
my $gfdlsections = _strip_punct($rawgfdlsections);
my $contextbefore = _strip_punct($rawcontextbefore);
# remove classical and without meaning part of
# matched string
$gfdlsections =~ s{
\A version [ ] \d+(?:\.\d+)? [ ]
(?:or [ ] any [ ] later [ ] version [ ])?
published [ ] by [ ] the [ ] free [ ] software [ ] foundation
[ ]?[,\.;]?[ ]?}{}xismo;
$contextbefore =~ s{
[ ]? (:?[,\.;]? [ ]?)?
permission [ ] is [ ] granted [ ] to [ ] copy [ ]?[,\.;]?[ ]?
distribute [ ]?[,\.;]?[ ]? and[ ]?/?[ ]?or [ ] modify [ ]
this [ ] document [ ] under [ ] the [ ] terms [ ] of [ ] the\Z}
{}xismo;
# Treat ambiguous empty text
unless(
defined(
$licenseproblemhash->{'license-problem-gfdl-invariants-empty'})
) {
if ($gfdlsections eq '') {
# lie in order to check more part
tag 'license-problem-gfdl-invariants-empty', $name;
$licenseproblemhash->{'license-problem-gfdl-invariants-empty'}= 1;
return 0;
}
}
# official wording
if(
$gfdlsections =~ m/\A
with [ ] no [ ] invariant [ ] sections[ ]?,
[ ]? no [ ] front(?:[ ]?-[ ]?|[ ])cover [ ] texts[ ]?,?
[ ]? and [ ] no [ ] back(?:[ ]?-?[ ]?|[ ])cover [ ] texts
\Z/xso
) {
return 0;
}
# example are ok
if (
$contextbefore =~ m/following [ ] is [ ] an [ ] example
(:?[ ] of [ ] the [ ] license [ ] notice [ ] to [ ] use
(?:[ ] after [ ] the [ ] copyright [ ] (?:line(?:\(s\)|s)?)?
(?:[ ] using [ ] all [ ] the [ ] features? [ ] of [ ] the [ ] gfdl)?
)?
)? [ ]? [,:]? \Z/xso
){
return 0;
}
# GFDL license, assume it is bad unless it
# explicitly states it has no "bad sections".
foreach my $gfdl_fragment ($GFDL_FRAGMENTS->all) {
my $gfdl_data = $GFDL_FRAGMENTS->value($gfdl_fragment);
my $gfdlsectionsregex = $gfdl_data->{'gfdlsectionsregex'};
if ($gfdlsections =~ m{$gfdlsectionsregex}) {
my $acceptonlyinfile = $gfdl_data->{'acceptonlyinfile'};
if ($name =~ m{$acceptonlyinfile}) {
my $applytag = $gfdl_data->{'tag'};
if(defined($applytag)) {
unless(defined($licenseproblemhash->{$applytag})) {
# lie will allow to check more block
_tag_gfdl($applytag, $name, $gfdlsections);
$licenseproblemhash->{$applytag} = 1;
return 0;
}
}
return 0;
}else {
_tag_gfdl('license-problem-gfdl-invariants',
$name, $gfdlsections);
return 1;
}
}
}
# catch all clause
_tag_gfdl('license-problem-gfdl-invariants', $name, $gfdlsections);
return 1;
}
sub _clean_block {
my ($text) = @_;
# be paranoiac replace gnu with texinfo by gnu
$text =~ s{
(?:@[[:alpha:]]*?\{)?\s*gnu\s*\} # Tex info cmd
}{ gnu }gxms;
# pod2man formating
$text =~ s{ \\ \* \( [LR] \" }{\"}gxsm;
$text =~ s{ \\ -}{-}gxsm;
# replace some common comment-marker/markup with space
$text =~ s{(?:
^\.\\\" | # man comments
\@c(?:omment)?\s+ | # Tex info comment
\@(?:b|i|r|t)\{ | # Tex info bold, italic, roman, fixed width
\@(?:sansserif|slanted)\{ | # Tex info sans serif/slanted
\@var\{ | # Tex info emphasis
\@(?:small)?example\s+ | # Tex info example
\@end\h+(?:small)example\s+ | # Tex info end small example tag
\@group\s+ | # Tex info group
\@end\h+group\s+ | # Tex info end group
\} | # Tex info end tag (could be more clever but brute force is fast)
\"\s*, | # String array (e.g. "line1",\n"line2")
,\s*\" | # String array (e.g. "line1"\n ,"line2"), seen in findutils
| # (X)HTML line breaks
| # end XML comment
?link[^>]*?> | # xml link
?a[^>]*?> | # a link
?citetitle[^>]*?> | # citation title in docbook
?div[^>]*?> | # html style
?p[^>]*?> | # html paragraph
?span[^>]*?> | # span tag
?var[^>]*?> | # var tag used by html from texinfo
^[-\+!<>] | # diff/patch lines (should be after html tag)
\(\*note.*?::\) | # info file note
\\n | # Verbatim \n in string array
\\& | # pod2man formating
\\s(?:0|-1) | # pod2man formating
(?:``|'') | # quote like
[%\*\"\|\\\#] # String, C-style comment/javadoc indent,
# quotes for strings, pipe and antislash in some txt
# shell or po file comments
)}{ }gxms;
# delete double spacing now and normalize spacing
# to space character
$text =~ s{\s++}{ }gsm;
strip($text);
return $text;
}
# do not use space arround punctuation
sub _strip_punct() {
my ($text) = @_;
# replace final punctuation
$text =~ s{(?:
\s*[,\.;]\s*\Z | # final punctuation
\A\s*[,\.;]\s* # punctuation at the beginning
)}{ }gxms;
# delete double spacing now and normalize spacing
# to space character
$text =~ s{\s++}{ }gsm;
strip($text);
return $text;
}
sub lc_block {
return $_ = lc($_);
}
# check based on md5sums
sub _md5sum_based_check {
my ($name, $md5sum, $data, $tag) = @_;
if (my $datavalue = $data->value($md5sum)) {
my $usualname= $datavalue->{'name'};
my $reason= $datavalue->{'reason'};
my $link= $datavalue->{'link'};
tag $tag, $name,
'usual name is', "$usualname.", "$reason", "See also $link.";
# should be stripped so pass other test
return 1;
}
return 0;
}
# check bad license
sub _license_check {
my ($name, $licensesdatas, $block, $blocknumber, $cleanedblock,
$matchedkeyword, $licenseproblemhash)
= @_;
my $ret = 0;
LICENSE:
foreach my $licenseproblem ($licensesdatas->all) {
my $licenseproblemdata = $licensesdatas->value($licenseproblem);
if(defined($licenseproblemhash->{$licenseproblem})) {
next LICENSE;
}
# do fast keyword search
my @keywordslist = @{$licenseproblemdata->{'keywords'}};
foreach my $keyword (@keywordslist) {
my $thiskeyword = $matchedkeyword->{$keyword};
if(not defined($thiskeyword)) {
if(index($block, $keyword) > -1) {
$matchedkeyword->{$keyword} = 1;
}else {
$matchedkeyword->{$keyword} = 0;
next LICENSE;
}
} elsif ($thiskeyword == 0) {
next LICENSE;
}
}
# clean block now in order to normalise space and check a sentence
unless(defined($$cleanedblock)) {
$$cleanedblock = _clean_block($block);
}
unless(index($$cleanedblock,$licenseproblemdata->{'sentence'}) > -1){
next LICENSE;
}
my $regex
= $blocknumber
? $licenseproblemdata->{'regex'}
: $licenseproblemdata->{'firstregex'};
unless($$cleanedblock =~ $regex) {
next LICENSE;
}
if(defined($licenseproblemdata->{'callsub'})) {
my $subresult= $licenseproblemdata->{'callsub'}->(
$name, $block,$blocknumber,$cleanedblock,$matchedkeyword,
$licenseproblemhash,%+
);
if($subresult) {
$licenseproblemhash->{$licenseproblem} = 1;
$ret = 1;
next LICENSE;
}
}else {
tag $licenseproblem, $name;
$licenseproblemhash->{$licenseproblem} = 1;
$ret = 1;
next LICENSE;
}
}
return $ret;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/debhelper.pm 0000664 0000000 0000000 00000045542 12311317603 015213 0 ustar # debhelper format -- lintian check script -*- perl -*-
# Copyright (C) 1999 by Joey Hess
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::debhelper;
use strict;
use warnings;
use autodie;
use Lintian::Data;
use Lintian::Relation;
use Lintian::Tags qw(tag);
use Lintian::Util qw(is_ancestor_of slurp_entire_file strip);
# If compat is less than or equal to this, then a missing version
# for this level is only a pedantic issue.
use constant PEDANTIC_COMPAT => 8;
# If there is no debian/compat file present but cdbs is being used, cdbs will
# create one automatically. Currently it always uses compatibility level 5.
# It may be better to look at what version of cdbs the package depends on and
# from that derive the compatibility level....
my $cdbscompat = 5;
my $maint_commands = Lintian::Data->new('debhelper/maint_commands');
my $dh_commands_depends = Lintian::Data->new('debhelper/dh_commands', '=');
my $filename_configs = Lintian::Data->new('debhelper/filename-config-files');
my $dh_ver_deps= Lintian::Data->new('debhelper/dh_commands-manual', qr/\|\|/o);
my $dh_addons = Lintian::Data->new('debhelper/dh_addons', '=');
my $dh_addons_manual
= Lintian::Data->new('debhelper/dh_addons-manual', qr/\|\|/o);
my $MISC_DEPENDS = Lintian::Relation->new('${misc:Depends}');
sub run {
my (undef, undef, $info) = @_;
my $droot = $info->debfiles;
my $seencommand = '';
my $needbuilddepends = '';
my $needdhexecbuilddepends = '';
my $needtomodifyscripts = '';
my $level;
my $seenversiondepends = '0';
my $compat = 0;
my $usescdbs = '';
my $seendhcleank = '';
my %missingbdeps;
my %missingbdeps_addons;
my $maybe_skipping;
my $dhcompatvalue;
my $inclcdbs = 0;
my $bdepends_noarch;
my $bdepends;
my $seen_dh = 0;
my $seen_python_helper = 0;
my $seen_python3_helper = 0;
if (!-f "$droot/rules" || !is_ancestor_of($droot, "$droot/rules")) {
# unsafe symlink
return;
}
open(my $rules_fd, '<', "$droot/rules");
while (<$rules_fd>) {
while (s,\\$,, and defined(my $cont = <$rules_fd>)) {
$_ .= $cont;
}
if (/^ifn?(?:eq|def)\s/) {
$maybe_skipping++;
} elsif (/^endif\s/) {
$maybe_skipping--;
}
if (m/^\s+-?(dh_\S+)/) {
my $dhcommand = $1;
if ($dhcommand eq 'dh_suidregister') {
tag 'dh_suidregister-is-obsolete', "line $.";
}
if ($dhcommand eq 'dh_undocumented') {
tag 'dh_undocumented-is-obsolete', "line $.";
}
if ($dhcommand eq 'dh_pysupport') {
tag 'dh_pysupport-is-obsolete', "line $.";
$seen_python_helper = 1;
}
if ($dhcommand eq 'dh_installmanpages') {
tag 'dh_installmanpages-is-obsolete', "line $.";
}
if ($dhcommand eq 'dh_python3') {
$seen_python3_helper = 1;
}
if ($dhcommand =~ m,^dh_(?:pysupport$|python(?:2$|\$.*)),) {
$seen_python_helper = 1;
}
# Don't warn about recently deprecated commands in code that may be
# optional. It may be there only for backports.
unless ($maybe_skipping) {
if ($dhcommand eq 'dh_desktop') {
tag 'dh_desktop-is-deprecated', "line $.";
}
if ($dhcommand eq 'dh_scrollkeeper') {
tag 'dh_scrollkeeper-is-deprecated', "line $.";
}
if ($dhcommand eq 'dh_clean' and m/\s+\-k(?:\s+.*)?$/s) {
$seendhcleank = 1;
}
}
# if command is passed -n, it does not modify the scripts
if ($maint_commands->known($dhcommand) and not m/\s+\-n\s+/) {
$needtomodifyscripts = 1;
}
# If debhelper commands are wrapped in make conditionals, assume the
# maintainer knows what they're doing and don't check build
# dependencies.
unless ($maybe_skipping) {
if ($dh_ver_deps->known($dhcommand)) {
my $dep = $dh_ver_deps->value($dhcommand);
$missingbdeps{$dep} = $dhcommand;
} elsif ($dh_commands_depends->known($dhcommand)) {
my $dep = $dh_commands_depends->value($dhcommand);
$missingbdeps{$dep} = $dhcommand;
}
}
$seencommand = 1;
$needbuilddepends = 1;
} elsif (m,^\s+dh\s+,) {
$seen_dh = 1;
$seencommand = 1;
$needbuilddepends = 1;
$needtomodifyscripts = 1;
while (m/\s--with(?:=|\s+)(\S+)/go) {
my $addon_list = $1;
for my $addon (split(m/,/o, $addon_list)) {
$addon =~ y,-,_,;
my $depends =$dh_addons_manual->value($addon)
|| $dh_addons->value($addon);
if (defined $depends) {
$missingbdeps_addons{$depends} = $addon;
}
if ($addon =~ m,python(?:2|_central|_support)$,) {
$seen_python_helper = 1;
} elsif ($addon eq 'python3') {
$seen_python3_helper = 1;
}
}
}
if (m,\$[({]\w,) {
# the variable could contain any add-ons
$seen_python_helper = 1;
$seen_python3_helper = 1;
}
if ($seen_python_helper == 0) {
$seen_python_helper = -1; # maybe; we'll check that later
}
} elsif (m,^include\s+/usr/share/cdbs/1/rules/debhelper.mk,) {
$seencommand = 1;
$needbuilddepends = 1;
$needtomodifyscripts = 1;
$inclcdbs = 1;
# CDBS sets DH_COMPAT but doesn't export it. It does, however, create
# a debian/compat file if none was found; that logic is handled later.
$dhcompatvalue = $cdbscompat;
$usescdbs = 1;
} elsif (/^\s*export\s+DH_COMPAT\s*:?=\s*([^\s]+)/) {
$level = $1;
} elsif (/^\s*export\s+DH_COMPAT/) {
$level = $dhcompatvalue if $dhcompatvalue;
} elsif (/^\s*DH_COMPAT\s*:?=\s*([^\s]+)/) {
$dhcompatvalue = $1;
# one can export and then set the value:
$level = $1 if ($level);
} elsif (/^override_dh_/) {
$needbuilddepends = 1;
} elsif (m,^include\s+/usr/share/cdbs/,
or m,^include\s+/usr/share/R/debian/r-cran.mk,o) {
$inclcdbs = 1;
}
}
close($rules_fd);
unless ($inclcdbs){
my $bdepends = $info->relation('build-depends-all');
# Okay - d/rules does not include any file in /usr/share/cdbs/
tag 'unused-build-dependency-on-cdbs' if ($bdepends->implies('cdbs'));
}
return unless $seencommand;
my @pkgs = $info->binaries;
my $single_pkg = '';
$single_pkg = $info->binary_package_type($pkgs[0])
if scalar @pkgs == 1;
for my $binpkg (@pkgs) {
next if $info->binary_package_type($binpkg) ne 'deb';
my $strong = $info->binary_relation($binpkg, 'strong');
my $all = $info->binary_relation($binpkg, 'all');
if (!$all->implies($MISC_DEPENDS)) {
tag 'debhelper-but-no-misc-depends', $binpkg;
} else {
tag 'weak-dependency-on-misc-depends', $binpkg
unless $strong->implies($MISC_DEPENDS);
}
}
my $compatnan = 0;
# Check the compat file. Do this separately from looping over all
# of the other files since we use the compat value when checking
# for brace expansion.
if (-f "$droot/compat") {
my $compat_file = slurp_entire_file("$droot/compat");
($compat) = split(/\n/, $compat_file);
strip($compat);
if ($compat ne '') {
if ($compat !~ m/^\d+$/) {
tag 'debhelper-compat-not-a-number', $compat;
$compat =~ s/[^\d]//g;
$compatnan = 1;
}
if ($level) {
tag 'declares-possibly-conflicting-debhelper-compat-versions',
"rules=$level compat=$compat";
} else {
# this is not just to fill in the gap, but because debhelper
# prefers DH_COMPAT over debian/compat
$level = $compat;
}
} else {
tag 'debhelper-compat-file-is-empty';
}
} else {
tag 'debhelper-compat-file-is-missing';
}
if (defined($level) and $level !~ m/^\d+$/ and not $compatnan) {
tag 'debhelper-compatibility-level-not-a-number', $level;
$level =~ s/[^\d]//g;
$compatnan = 1;
}
if ($usescdbs and not defined($level)) {
$level = $cdbscompat;
}
$level ||= 1;
if ($level < 5) {
tag 'package-uses-deprecated-debhelper-compat-version', $level;
}
if ($seendhcleank and $level >= 7) {
tag 'dh-clean-k-is-deprecated';
}
# Check the files in the debian directory for various debhelper-related
# things.
my @indebfiles = ();
opendir(my $dirfd, $droot);
for my $file (sort(readdir($dirfd))) {
next if $file eq 'rules' or not -f "$droot/$file";
if ($file =~ m/^(?:(.*)\.)?(?:post|pre)(?:inst|rm)$/) {
next unless $needtomodifyscripts;
next unless is_ancestor_of($droot, "$droot/$file");
# They need to have #DEBHELPER# in their scripts. Search
# for scripts that look like maintainer scripts and make
# sure the token is there.
my $binpkg = $1 || '';
my $seentag = '';
open(my $fd, '<', "$droot/$file");
while (<$fd>) {
if (m/\#DEBHELPER\#/) {
$seentag = 1;
last;
}
}
close($fd);
if (!$seentag) {
my $binpkg_type = $info->binary_package_type($binpkg) // 'deb';
my $is_udeb = 0;
$is_udeb = 1 if $binpkg and $binpkg_type eq 'udeb';
$is_udeb = 1 if not $binpkg and $single_pkg eq 'udeb';
if (not $is_udeb) {
tag 'maintainer-script-lacks-debhelper-token',
"debian/$file";
}
}
} elsif ($file eq 'control'
or $file =~ m/^(?:.*\.)?(?:copyright|changelog|NEWS)$/o) {
# Handle "control", [.]copyright, [.]changelog
# and [.]NEWS
_tag_if_executable($file, "$droot/$file");
} elsif ($file =~ m/^ex\.|\.ex$/i) {
tag 'dh-make-template-in-source', "debian/$file";
} elsif ($file =~ m/^(?:.+\.)?debhelper(?:\.log)?$/){
# The regex matches "debhelper", but debhelper/Dh_Lib does not
# make those, so skip it.
if ($file ne 'debhelper') {
push(@indebfiles, $file);
}
} else {
my $base = $file;
$base =~ s/^.+\.//;
# Check whether this is a debhelper config file that takes
# a list of filenames.
if ($filename_configs->known($base)) {
next unless is_ancestor_of($droot, "$droot/$file");
if ($level < 9) {
# debhelper only use executable files in compat 9
_tag_if_executable($file, "$droot/$file");
} else {
if (-x "$droot/$file") {
my $cmd= _shebang_cmd("debian/$file", "$droot/$file");
unless ($cmd) {
#<<< perltidy doesn't handle this too well
tag 'executable-debhelper-file-without-being-executable',
"debian/$file";
#>>>
}
# Do not make assumptions about the contents of an
# executable debhelper file, unless it's a dh-exec
# script.
if ($cmd =~ /dh-exec/) {
$needdhexecbuilddepends = 1;
_check_dh_exec($cmd, $base, "debian/$file",
"$droot/$file");
}
next;
}
}
# Skip brace expansion check for compat < 3 as those files
# do not allow any form for wildcards.
next if $level < 3;
open(my $fd, '<', "$droot/$file");
local $_;
while (<$fd>) {
next if /^\s*$/;
next if (/^\#/ and $level >= 5);
if (m/(?relation_noarch('build-depends-all');
$bdepends = $info->relation('build-depends-all');
if ($needbuilddepends && !$bdepends->implies('debhelper')) {
tag 'package-uses-debhelper-but-lacks-build-depends';
}
if ($needdhexecbuilddepends && !$bdepends->implies('dh-exec')) {
tag 'package-uses-dh-exec-but-lacks-build-depends';
}
while (my ($dep, $command) = each %missingbdeps) {
next if $dep eq 'debhelper'; #handled above
tag 'missing-build-dependency-for-dh_-command', "$command => $dep"
unless ($bdepends_noarch->implies($dep));
}
while (my ($dep, $addon) = each %missingbdeps_addons) {
tag 'missing-build-dependency-for-dh-addon', "$addon => $dep"
unless ($bdepends_noarch->implies($dep));
}
unless ($bdepends->implies("debhelper (>= $level~)")){
my $tagname = 'package-needs-versioned-debhelper-build-depends';
$tagname = 'package-lacks-versioned-build-depends-on-debhelper'
if ($level <= PEDANTIC_COMPAT);
tag $tagname, $level;
}
if (scalar(@indebfiles)){
my $f = pop(@indebfiles);
my $others = scalar(@indebfiles);
my $otext = '';
if ($others > 1){
$otext = " and $others others";
} elsif($others == 1){
$otext = ' and 1 other';
}
tag 'temporary-debhelper-file', "$f$otext";
}
if ($seen_python_helper == -1 and $level >= 9) {
$seen_python_helper = 0;
}
if ($seen_dh and $seen_python_helper != 1) {
my %python_depends = ();
for my $binpkg (@pkgs) {
if ($info->binary_relation($binpkg, 'all')
->implies('${python:Depends}')) {
$python_depends{$binpkg} = 1;
}
}
if (%python_depends) {
if ($seen_python_helper == -1) {
$seen_python_helper
= $bdepends_noarch->implies('python-support');
}
if (not $seen_python_helper) {
tag 'python-depends-but-no-python-helper',
sort(keys %python_depends);
}
}
}
if ($seen_dh and $seen_python3_helper != 1) {
my %python3_depends = ();
for my $binpkg (@pkgs) {
if ($info->binary_relation($binpkg, 'all')
->implies('${python3:Depends}')) {
$python3_depends{$binpkg} = 1;
}
}
if (%python3_depends and not $seen_python3_helper) {
tag 'python3-depends-but-no-python3-helper',
sort(keys %python3_depends);
}
}
return;
}
sub _tag_if_executable {
my ($file, $path) = @_;
tag 'package-file-is-executable', "debian/$file" if -f $path && -x _;
return;
}
# Perform various checks on a dh-exec file.
sub _check_dh_exec {
my ($cmd, $base, $pkgpath, $fspath) = @_;
# Only /usr/bin/dh-exec is allowed, even if
# /usr/lib/dh-exec/dh-exec-subst works too.
if ($cmd =~ m,/usr/lib/dh-exec/,) {
tag 'dh-exec-private-helper', $pkgpath;
}
my ($dhe_subst, $dhe_install) = (0, 0);
open(my $fd, '<', $fspath);
while (<$fd>) {
if (/\$\{([^\}]+)\}/) {
my $sv = $1;
$dhe_subst = 1;
if (
$sv !~ m{ \A
DEB_(?:BUILD|HOST)_(?:
ARCH (?: _OS|_CPU|_BITS|_ENDIAN )?
|GNU_ (?:CPU|SYSTEM|TYPE)|MULTIARCH
) \Z}xsm
) {
tag 'dh-exec-subst-unknown-variable', $pkgpath, $sv;
}
}
$dhe_install = 1 if / => /;
}
close($fd);
if (!($dhe_subst || $dhe_install)) {
tag 'dh-exec-script-without-dh-exec-features', $pkgpath;
}
if ($dhe_install && $base ne 'install') {
tag 'dh-exec-install-not-allowed-here', $pkgpath;
}
return;
}
# Return the command after the #! in the file (if any).
# - if there is no command or no #! line, the empty string is returned.
sub _shebang_cmd {
my ($pkgpath, $fspath) = @_;
my $magic;
my $cmd = '';
open(my $fd, '<', $fspath);
if (read($fd, $magic, 2)) {
if ($magic eq '#!') {
$cmd = <$fd>;
# It is beyond me why anyone would place a lincity data
# file here... but if they do, we will handle it
# correctly.
$cmd = '' if $cmd =~ m/^#!/o;
strip($cmd);
}
}
close($fd);
# We are not checking if it is an ELF executable. While debhelper
# allows this (i.e. it also checks for ..), it is
# no cross-compilation safe. This is because debhelper uses
# "HOST" (and not "BUILD") arch, despite its documentation and
# code (incorrectly) suggests it is using "build".
#
# Oh yeah, it is also a terrible waste to keep pre-compiled
# binaries for all architectures in the source as well. :)
return $cmd;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/duplicate-files.desc 0000664 0000000 0000000 00000001323 12310413144 016616 0 ustar Check-Script: duplicate-files
Author: Niels Thykier
Abbrev: dupf
Type: binary
Needs-Info: md5sums, index
Info: This script checks for duplicate files using checksums
Tag: duplicate-files
Severity: pedantic
Certainty: possible
Experimental: yes
Info: The package ships the two (or more) files with the exact same
contents.
.
Note: empty files are exempt from this check.
Tag: duplicate-changelog-files
Severity: normal
Certainty: possible
Info: The package appears to be shipping two copies of the changelog.
.
If the second copy is really needed, consider making it a symlink to
the canonical place for the relevant changelog.
.
Both upstream and debian changelogs are checked with this tag.
lintian-2.5.22ubuntu1/checks/debconf.desc 0000664 0000000 0000000 00000031731 12310413206 015151 0 ustar Check-Script: debconf
Author: Colin Watson
Abbrev: dc
Type: binary, udeb, source
Info: This looks for common mistakes in packages using debconf.
Needs-Info: bin-pkg-control, debfiles, unpacked, scripts
Tag: missing-debconf-dependency
Severity: normal
Certainty: possible
Info: Packages using debconf should depend on it, since debconf is not an
essential package.
Tag: missing-debconf-dependency-for-preinst
Severity: normal
Certainty: possible
Info: Packages using debconf in their preinst script must pre-depend
on debconf, with appropriate discussion on &debdev;. Since debconf is
almost always already installed, this is normally better than depending
on it and falling back to a different configuration system.
Tag: unknown-field-in-templates
Severity: important
Certainty: certain
Info: Valid fields are currently "Template:", "Type:", "Choices:", "Default:",
and "Description:".
Ref: debconf-spec aen45, debconf-devel(7)
Tag: no-template-name
Severity: important
Certainty: certain
Info: The templates file contains a template without a "Template:" field.
Tag: malformed-template-name
Severity: important
Certainty: certain
Info: The "Template:" field should contain more than one component, each
separated by a slash ("/"). Each component may only consist of the
alphanumeric characters, "+", "-", and ".".
Tag: no-template-type
Severity: important
Certainty: certain
Info: The templates file contains a template without a "Type:" field.
Tag: unknown-template-type
Severity: important
Certainty: certain
Info: A "Type:" field in a templates file provided by this package uses an
unknown data type. Valid types are currently "string", "boolean", "select",
"multiselect", "note", "text", and "password".
Tag: empty-translated-choices
Severity: important
Certainty: possible
Info: When the translation of a Choices: field is empty, the whole question
is skipped (and nothing is selected). Please verify that the translation
you're using is valid.
Tag: mismatch-translated-choices
Severity: important
Certainty: certain
Info: A "Choices:" field is a comma separated list, and translated
"Choices:" fields must have the exact same number of elements. One
of the translations does not follow this rule, you should contact the
translator and request for a new translation where elements of "Choices:"
fields have no embedded commas.
.
Cdebconf understands escaped commas in such fields, but packages
outside the scope of debian-installer must not have them until they are
also supported by debconf.
Tag: select-without-choices
Severity: important
Certainty: certain
Info: Templates using the "select" or "multiselect" data types must provide
a "Choices:" field listing the possible values of the template.
Ref: debconf-spec aen45, debconf-devel(7)
Tag: boolean-template-has-bogus-default
Severity: important
Certainty: certain
Info: The "boolean" type in a debconf template, can have only two values: true
and false. The default has been set to something different.
Ref: debconf-spec aen45, debconf-devel(7)
Tag: no-template-description
Severity: important
Certainty: certain
Info: The templates file contains a template without a "Description:" field.
Ref: debconf-spec aen45, debconf-devel(7)
Tag: duplicate-long-description-in-template
Severity: minor
Certainty: certain
Info: The long description of one of the templates provided by this package
is a duplicate of the short description. If you cannot provide a good
extended description, it is better to leave it blank.
Tag: config-does-not-load-confmodule
Severity: normal
Certainty: certain
Info: The config script must load one of the debconf libraries.
Tag: postinst-uses-db-input
Severity: normal
Certainty: possible
Info: It is generally not a good idea for postinst scripts to use debconf
commands like db_input. Typically, they should restrict themselves
to db_get to request previously acquired information, and have the
config script do the actual prompting.
Tag: postinst-does-not-load-confmodule
Severity: normal
Certainty: certain
Info: Even if your postinst does not involve debconf, you currently need to
make sure it loads one of the debconf libraries. This will be changed in
the future.
Tag: loads-obsolete-confmodule
Severity: normal
Certainty: certain
Info: The maintainer script uses an obsolete name for a debconf confmodule.
Shell scripts should source /usr/share/debconf/confmodule, while
Perl scripts should use Debconf::Client::ConfModule.
Ref: debconf-devel(7)
Tag: postrm-does-not-purge-debconf
Severity: normal
Certainty: certain
Info: Packages using debconf should call db_purge or its equivalent
in their postrm. If the package uses debhelper, dh_installdebconf(1) should
take care of this.
Tag: isdefault-flag-is-deprecated
Severity: normal
Certainty: possible
Info: The "isdefault" flag on debconf questions is deprecated as of debconf
0.5.00, and has been replaced by "seen" with the inverse meaning. From
debconf 0.5 onwards there should be very few reasons to use isdefault/seen
anyway, as backing up works much better now. See
/usr/share/doc/debconf-doc/changelog.gz for more information.
.
The misuse of isdefault often leads to questions being asked twice in one
installation run, or, worse, on every upgrade. Please test your package
carefully to make sure this does not happen.
Tag: debconf-config-not-executable
Severity: important
Certainty: certain
Info: The debconf "config" script in the package control area must be
executable.
Tag: no-debconf-config
Severity: important
Certainty: possible
Info: The package contains a "templates" file in its control area but has no
corresponding "config" script. This is occasionally OK, but is usually an
error.
Tag: no-debconf-templates
Severity: normal
Certainty: possible
Info: The package contains a "config" script in its control area but has no
corresponding "templates" file. This is occasionally OK, but is usually an
error.
Tag: debconf-is-not-a-registry
Severity: important
Certainty: wild-guess
Info: In the Unix tradition, Debian packages should have human-readable and
human-editable configuration files. This package uses debconf commands
outside its maintainer scripts, which often indicates that it is taking
configuration information directly from the debconf database. Typically,
packages should use debconf-supplied information to generate
configuration files, and -- to avoid losing configuration information on
upgrades -- should parse these configuration files in the config
script if it is necessary to ask the user for changes.
.
Some standalone programs may legitimately use debconf to prompt the user
for questions. If you maintain a package containing such a program,
please install an override. Other exceptions to this check include
configuration scripts called from the package's post-installation script.
Ref: devref 6.5.1, debconf-devel(7)
Tag: malformed-prompt-in-templates
Severity: normal
Certainty: certain
Info: The short description of a select, multiselect, string and password
debconf template is a prompt and not a title. Avoid question style
prompts ("IP Address?") in favour of "opened" prompts ("IP address:").
The use of colons is recommended.
.
If this template is only used internally by the package and not displayed
to the user, put "for internal use" in the short description.
Ref: devref 6.5.4.2
Tag: malformed-title-in-templates
Severity: normal
Certainty: certain
Info: The short description of a note debconf template should be written
as a title and therefore should not end with a period, question mark,
colon, or semicolon.
Ref: devref 6.5.4.2.4
Tag: malformed-question-in-templates
Severity: normal
Certainty: certain
Info: The short description of a boolean debconf template should be
phrased in the form of a question which should be kept short and should
generally end with a question mark. Terse writing style is permitted and
even encouraged if the question is rather long.
.
If this template is only used internally by the package and not displayed
to the user, put "for internal use" in the short description.
Ref: devref 6.5.4.2.2
Tag: using-question-in-extended-description-in-templates
Severity: normal
Certainty: certain
Info: The extended description of a debconf template should never include
a question.
.
If this template is only used internally by the package and not displayed
to the user, put "for internal use" in the short description.
Ref: devref 6.5.3.2
Tag: using-imperative-form-in-templates
Severity: normal
Certainty: certain
Info: Do not use useless imperative constructions such as "Please choose...",
"Enter...". The interface will make it obvious that the user needs to
choose or enter something.
Ref: devref 6.5.4.2
Tag: using-first-person-in-templates
Severity: normal
Certainty: possible
Info: You should avoid the use of first person ("I will do this..." or
"We recommend..."). The computer is not a person and the Debconf
templates do not speak for the Debian developers. You should use neutral
construction and often the passive form.
.
If this template is only used internally by the package and not displayed
to the user, put "for internal use" in the short description.
Ref: devref 6.5.2.5
Tag: making-assumptions-about-interfaces-in-templates
Severity: normal
Certainty: possible
Info: Template text should not make reference to widgets belonging to
some debconf interfaces. Sentences like "If you answer Yes..." have no
meaning for users of graphical interfaces which use checkboxes for
boolean questions.
Ref: devref 6.5.2.4
Tag: too-long-short-description-in-templates
Severity: normal
Certainty: certain
Info: The short description should be kept short (50 characters or so) so
that it may be accommodated by most debconf interfaces. Keeping it short
also helps translators, as usually translations tend to end up being
longer than the original.
Ref: devref 6.5.3.2
Tag: too-long-extended-description-in-templates
Severity: normal
Certainty: certain
Info: Some debconf interfaces cannot deal very well with descriptions of
more than about 20 lines, so try to keep the extended description below
this limit.
Ref: devref 6.5.3.2
Tag: unknown-debconf-priority
Severity: important
Certainty: certain
Info: The given maintainer script calls db_input or or db_text with a
first argument that doesn't match one of the known priorities. The
supported priorities are low, medium, high, and critical.
Ref: debconf-devel(7)
Tag: possible-debconf-note-abuse
Severity: normal
Certainty: possible
Info: Debconf notes should be used only for important notes that the
user really should see, since debconf will go to great pains to make
sure the user sees it.
.
Displaying a note with a low priority is conflicting with this statement,
since using a low or medium priority shows that the note is not
important.
.
The right fix is NOT to increase the priority of the note, but to move
it somewhere else in the inline documentation, for example in a
README.Debian file for notes about package usability or NEWS.Debian for
changes in the package behavior, or to simply drop it if it is not
needed (e.g. "welcome" notes). Changing the templates type to "error"
can also be appropriate, such as for input validation errors.
Ref: policy 3.9.1
Tag: select-with-boolean-choices
Severity: normal
Certainty: possible
Info: Select templates with only yes and no choices should use the boolean
type instead.
Ref: debconf-devel(7)
Tag: template-uses-unsplit-choices
Severity: normal
Certainty: possible
Info: The use of _Choices in templates is deprecated.
An _Choices field must be translated as a single string.
.
Using __Choices allows each choice to be translated separately, easing
translation and is therefore recommended.
.
Instead of simply replacing all occurrences of "_Choices" by "__Choices",
apply the method described in po-debconf(7) under "SPLITTING CHOICES
LIST", to avoid breaking existing translations.
.
If in doubt, please ask for help on the debian-i18n mailing list.
Ref: po-debconf(7)
Tag: unused-debconf-template
Severity: minor
Certainty: possible
Info: Templates which are not used by the package should be removed from
the templates file.
.
This will reduce the size of the templates database and prevent
translators from unnecessarily translating the template's text.
.
In some cases, the template is used but Lintian is unable to determine
this. Common causes are:
.
- the maintainer scripts embed a variable in the template name in
order to allow a template to be selected from a range of similar
templates (e.g. db_input low start_$service_at_boot)
.
- the template is not used by the maintainer scripts but is used by
a program in the package
.
- the maintainer scripts are written in perl. lintian currently only
understands the shell script debconf functions.
.
If any of the above apply, please install an override.
Tag: syntax-error-in-debconf-template
Severity: important
Certainty: possible
Info: The template file contains a syntax error.
.
This issue may hide other issues as Lintian skips some checks on the
file in this case.
lintian-2.5.22ubuntu1/checks/menu-format.desc 0000664 0000000 0000000 00000036660 12310413206 016011 0 ustar Check-Script: menu-format
Author: Joey Hess
Abbrev: mnf
Needs-Info: unpacked, menu-files, index
Type: binary
Info: This script validates the format of menu files.
Tag: old-format-menu-file
Severity: important
Certainty: certain
Info: The package contains a menu file that is in the old menu file format.
This format is deprecated. Convert the menu file to the new menu format.
Note that lintian will not test this file for any other problems.
Tag: whitespace-after-continuation-character
Severity: important
Certainty: certain
Info: The menu item is split up over 2 or more lines using '\' at the end of
the line to join them together. However, there is some whitespace after
the '\' character, which is not guaranteed to be handled correctly.
The '\' should be at the end of the line.
Tag: bad-test-in-menu-item
Severity: important
Certainty: certain
Info: The menu file contains an item that does not start with the text
"?package(somepackage):". All menu file lines must test for the existence
of a package in this way.
Ref: menu 3.2
Tag: unparsable-menu-item
Severity: important
Certainty: certain
Info: An item of the menu file cannot be parsed as a series of tag=value
pairs. This could be because you didn't close a set of double quotes.
Ref: menu 3.2
Tag: pkg-not-in-package-test
Severity: normal
Certainty: possible
Info: This menu item doesn't test to see if the package containing it is
installed. The start of any menu item is a conditional testing whether
the required packages are installed. Normally this conditional should
always check at least the package containing it, since menu items should
be included in the package that provides the application the menu refers
to.
.
This error usually indicates a misspelling of the package name in the
menu entry or a copied menu entry from another package that doesn't apply
to this one.
Ref: menu 3.2
Tag: duplicated-tag-in-menu-item
Severity: normal
Certainty: certain
Info: The menu item contains two instances of the same tag. This is just a
waste of space, as menu will only use one of them.
Ref: menu 3.2
Tag: menu-item-missing-required-tag
Severity: important
Certainty: certain
Info: The menu item has a line that is missing a required tag. It's likely
that the line will have no effect without this tag. install-menu may
report this as an error during package installation.
Tag: menu-item-contains-unknown-tag
Severity: minor
Certainty: certain
Info: The menu item has a line that has a tag in it that is not one
of the standard tags (needs=, section=, title=, longtitle=, command=, etc).
While other tags can be used for specialized purposes, this is rare and
it's more likely the tag's name is misspelled.
Tag: menu-item-uses-icon-none
Severity: minor
Certainty: certain
Info: The menu item has a line that uses icon=none. This is redundant and
deprecated -- if there is no icon, just leave off the icon tag.
Tag: menu-item-needs-tag-has-unknown-value
Severity: minor
Certainty: certain
Info: The menu item has a line that has a needs= field with a strange value.
This may be intentional, but it's probably a typo that will make menu
ignore the line.
Tag: menu-item-uses-apps-games-section
Severity: normal
Certainty: certain
Info: The menu item has a line that specifies a section under "Apps/Games".
This section has been moved to just "Games".
Ref: menu-policy 2.1
Tag: menu-item-uses-apps-section
Severity: normal
Certainty: certain
Info: The menu item has a line that specifies a section under "Apps".
This section has been moved to "Applications".
Ref: menu-policy 2.1
Tag: menu-item-uses-windowmanagers-section
Severity: normal
Certainty: certain
Info: The menu item has a line that specifies a section under
"WindowManagers". This section has been moved to "Window Managers".
Ref: menu-policy 2.1
Tag: menu-item-creates-new-section
Severity: normal
Certainty: certain
Info: The menu item has a line that specifies an unknown section or uses a
section that is intended only as a menu root, not as a section that
applications should use directly. Check the spelling of the section and
check the section against the list in the menu policy. (The menu
sections changed as of June of 2007.)
Ref: menu-policy 2.1
Tag: menu-item-creates-new-root-section
Severity: important
Certainty: certain
Info: The menu item has a line that specifies a new section to put a menu
entry in, and this section appears right in the root menu. This is
almost certainly an error. No new sections should be added to the root
menu without discussion with the author of menu.
Tag: menu-icon-not-in-xpm-format
Severity: important
Certainty: certain
Info: Icons in the Debian menu system should be in XPM format.
.
While other image types (e.g. png images) appears to "just work",
window managers are not "required to support them". Accordingly
using non-XPM icons could break interoperability.
Ref: menu 3.7, #591812
Tag: menu-icon-uses-relative-path
Severity: normal
Certainty: certain
Info: This package contains a menu file which references an icon by a relative
path. However, icons should be referenced by an absolute path in menu files.
Ref: menu 3.2, #693477
Tag: menu-icon-missing
Severity: normal
Certainty: possible
Info: This icon file couldn't be found. If the path to the icon in the
menu file is an absolute path, make sure that icon exists at that path in
the package. If the path is relative or a simple filename, make sure the
icon is installed in /usr/share/pixmaps, the default location.
.
If the icon is provided by another package on which this package
depends, lintian may not be able to determine that icon pages are
available. In this case, after confirming that all icons are
available after this package and its dependencies are installed,
please add a lintian override.
Ref: menu 3.7
Tag: menu-icon-too-big
Severity: important
Certainty: certain
Info: Icons in the Debian menu system should be at most 32x32 pixels
(icon16x16 icons should of course be at most 16x16 pixels)
Ref: menu 3.7
Tag: menu-icon-cannot-be-parsed
Severity: normal
Certainty: certain
Info: The icon file could not be parsed. Perhaps this means a bad XPM file,
or perhaps it means the lintian parsing needs to be improved. If the
window managers and standard tools accept the file then probably it's the
latter; please file a bug on lintian then.
Tag: su-wrapper-without--c
Severity: important
Certainty: certain
Info: The menu item command or desktop file uses an su wrapper such as
su-to-root without the -c flag. This is a syntax error.
Ref: su-to-root(1)
Tag: su-to-root-with-usr-sbin
Severity: normal
Certainty: certain
Info: The menu item or desktop file command uses su-to-root as
/usr/sbin/su-to-root. Since sarge su-to-root is located in /usr/bin and
/usr/sbin/su-to-root is only a compatibility symlink that may get dropped
in the future.
.
Since su-to-root is now located in /usr/bin you can use it without
absolute path now.
Tag: su-wrapper-not-su-to-root
Severity: normal
Certainty: certain
Info: The menu item or desktop file command uses an su wrapper other than
su-to-root. On Debian systems, please use su-to-root -X, which
will pick the correct wrapper based on what's installed on the system and
the current desktop environment. Using su-to-root is also important for
Live CD systems which need to use sudo rather than su. su-to-root
permits global configuration to use sudo.
Tag: menu-item-needs-dwww
Severity: normal
Certainty: certain
Info: The menu item has needs=dwww. This is deprecated. Instead, you should
register your documentation with doc-base, and dwww entries will be
automatically generated.
Tag: non-wm-in-windowmanager-menu-section
Severity: important
Certainty: certain
Info: The menu item is in the Window Manager section but does not needs=wm.
Either it is a window manager and it should needs=wm, either it isn't and
then it must be moved in another section.
Tag: non-wm-module-in-wm-modules-menu-section
Severity: important
Certainty: certain
Info: The menu item is in the FVWM Modules or Window Maker section but
does not declare that it needs a specific window manager (using the needs
key in the menu file). Modules for Fvwm should have needs="fvwmmodule".
Modules for WindowMaker should have needs="wmmaker".
Tag: unquoted-string-in-menu-item
Severity: normal
Certainty: certain
Info: The menu item includes a tag with an unquoted string like section=Games
instead of section="Games". This is deprecated. Use a quoted string instead.
Ref: menu 3.2
Tag: menu-command-not-in-package
Severity: normal
Certainty: possible
Info: The menu item specifies a command which is not available in the package.
In most cases this is a typo or after you moved a binary around, but forgot
to update the menu file.
Tag: executable-desktop-file
Severity: important
Certainty: certain
Info: The desktop entry file is marked executable. Desktop entries are
regular files and should be installed mode 0644.
Tag: desktop-entry-file-has-crs
Severity: normal
Certainty: certain
Info: The desktop entry file has lines ending in CRLF instead of just LF.
The Desktop Entry Specification is explicit that lines should end with
only LF. The CR may be taken by some software as part of the field.
.
Running the following command against the given file removes any
CR character in the file:
.
sed -i 's/\r//g' path/to/file
Ref: http://standards.freedesktop.org/desktop-entry-spec/1.0/ar01s02.html
Tag: duplicated-key-in-desktop-entry
Severity: normal
Certainty: certain
Info: The desktop entry contains two instances of the same key. The
behavior of such desktop entries is not well-defined by the standard.
.
The desktop-file-validate tool in the desktop-file-utils package is
useful for checking the syntax of desktop entries.
Tag: desktop-entry-missing-required-key
Severity: important
Certainty: certain
Info: Desktop entries must contain, at a minimum, the keys Type and Name.
.
The desktop-file-validate tool in the desktop-file-utils package is
useful for checking the syntax of desktop entries.
Ref: http://standards.freedesktop.org/desktop-entry-spec/1.0/ar01s05.html
Tag: desktop-entry-contains-unknown-key
Severity: minor
Certainty: certain
Info: The key on this line of the desktop entry is not one of the standard
keys defined in the FreeDesktop specification, not one of the legacy KDE
keywords, and one that does not begin with X-. It's most likely
that the key was misspelled.
.
The desktop-file-validate tool in the desktop-file-utils package is
useful for checking the syntax of desktop entries.
Ref: http://standards.freedesktop.org/desktop-entry-spec/1.0/ar01s05.html
Tag: desktop-entry-contains-deprecated-key
Severity: normal
Certainty: certain
Info: The key on this line of the desktop entry has been deprecated in the
FreeDesktop specification.
.
The desktop-file-validate tool in the desktop-file-utils package is
useful for checking the syntax of desktop entries.
Ref: http://standards.freedesktop.org/desktop-entry-spec/1.0/apc.html
Tag: desktop-entry-contains-encoding-key
Severity: wishlist
Certainty: certain
Info: The Encoding key is now deprecated by the FreeDesktop standard and
all strings are required to be encoded in UTF-8. This desktop entry
explicitly specifies an Encoding of UTF-8, which is harmless but no
longer necessary.
.
The desktop-file-validate tool in the desktop-file-utils package is
useful for checking the syntax of desktop entries.
Ref: http://standards.freedesktop.org/desktop-entry-spec/1.0/apc.html
Tag: desktop-entry-lacks-main-category
Severity: normal
Certainty: certain
Info: The categories for this desktop entry do not contain any Main
Categories, only Additional Categories. Additional Categories should
only be used on conjunction with one or more Main Categories.
.
The desktop-file-validate tool in the desktop-file-utils package is
useful for checking the syntax of desktop entries.
Ref: http://standards.freedesktop.org/menu-spec/1.0/apa.html
Tag: desktop-entry-lacks-keywords-entry
Severity: wishlist
Certainty: certain
Info: This .desktop file does either not contain a "Keywords" entry or it does
not contain any keywords not already present in the "Name" or
"GenericName" entries.
.
.desktop files are organized in key/value pairs (similar to .ini files).
"Keywords" is the name of the entry/key in the .desktop file containing
keywords relevant for this .desktop file.
.
The desktop-file-validate tool in the desktop-file-utils package is
useful for checking the syntax of desktop entries.
Ref: http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s05.html,
#693918, https://wiki.gnome.org/Initiatives/GnomeGoals/DesktopFileKeywords
Tag: desktop-entry-uses-reserved-category
Severity: normal
Certainty: certain
Info: This desktop entry includes a Reserved Category, one which has a
desktop-specific meaning that has not yet been standardized, but does not
include an OnlyShowIn key. Desktop entries using a Reserved Category
must include an OnlyShowIn key limiting the entry to those environments
that support the category.
.
The desktop-file-validate tool in the desktop-file-utils package is
useful for checking the syntax of desktop entries.
Ref: http://standards.freedesktop.org/menu-spec/1.0/apa.html
Tag: desktop-entry-invalid-category
Severity: normal
Certainty: certain
Info: This desktop entry lists a category that is not one of the
registered Main or Additional Categories in the FreeDesktop
specification. Note that case is significant and whitespace is only
allowed immediately before and after the equal sign in the Category key,
not elsewhere in the field.
.
The desktop-file-validate tool in the desktop-file-utils package is
useful for checking the syntax of desktop entries.
Ref: http://standards.freedesktop.org/menu-spec/1.0/apa.html
Tag: desktop-command-not-in-package
Severity: normal
Certainty: possible
Info: The desktop entry specifies a command that is not available in the
package. In most cases, this is a typo or a forgotten update of the
desktop file after the install location of the binary was changed. A
desktop file for a command should be included in the same package as that
command.
Tag: desktop-contains-deprecated-header
Severity: normal
Certainty: certain
Info: The header on this line of the desktop entry has been deprecated in the
FreeDesktop specification. If the header is "KDE Desktop Entry", the right
fix is normally changing it to "Desktop Entry".
.
The desktop-file-validate tool in the desktop-file-utils package is
useful for checking the syntax of desktop entries.
Ref: http://standards.freedesktop.org/desktop-entry-spec/1.0/apc.html
Tag: deprecated-kdelnk-file
Severity: important
Certainty: certain
Info: kdelnk files were used by KDE 1 and since KDE 2 desktop files are used
instead. Renaming the file and removing the deprecated header and keys
is often all that needs to be done.
Ref: http://standards.freedesktop.org/desktop-entry-spec/1.0/apc.html
Tag: desktop-entry-limited-to-environments
Severity: normal
Certainty: wild-guess
Info: This desktop entry uses OnlyShowIn to limit the environments in
which it's displayed but lists multiple environments. This is often a
sign of a desktop file written assuming that only GNOME, KDE, and Xfce
are in use and the desktop file intended to exclude one of them. This
unintentionally hides the application from desktop environments such as
LXDE where it would work fine. If this application supports any desktop
environment except some specific ones, it should list the unsupported
environments in the NotShowIn key instead.
lintian-2.5.22ubuntu1/checks/init.d.pm 0000664 0000000 0000000 00000043464 12311317611 014446 0 ustar # init.d -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::init_d;
use strict;
use warnings;
use autodie;
use File::Basename qw(dirname);
use List::MoreUtils qw(any none);
use Lintian::Data;
use Lintian::Tags qw(tag);
use Lintian::Util qw(is_ancestor_of);
# A list of valid LSB keywords. The value is 0 if optional and 1 if required.
my %lsb_keywords = (
provides => 1,
'required-start' => 1,
'required-stop' => 1,
'should-start' => 0,
'should-stop' => 0,
'default-start' => 1,
'default-stop' => 1,
# These two are actually optional, but we mark
# them as required and give them a weaker tag if
# they are missing.
'short-description' => 1,
'description' => 1
);
# These init script names should probably not be used in dependencies.
# Instead, the corresponding virtual facility should be used.
#
# checkroot is not included here since cryptsetup needs the root file system
# mounted but not any other local file systems and therefore correctly depends
# on checkroot. There may be other similar situations.
my %implied_dependencies = (
'mountall' => '$local_fs',
'mountnfs' => '$remote_fs',
'hwclock' => '$time',
'portmap' => '$portmap',
'named' => '$named',
'bind9' => '$named',
'networking' => '$network',
'syslog' => '$syslog',
'rsyslog' => '$syslog',
'sysklogd' => '$syslog'
);
our $VIRTUAL_FACILITIES = Lintian::Data->new('init.d/virtual_facilities');
# Regex to match names of init.d scripts; it is a bit more lax than
# package names (e.g. allows "_"). We do not allow it to start with a
# "dash" to avoid confusing it with a command-line option (also,
# update-rc.d does not allow this).
our $INITD_NAME_REGEX = qr/[\w\.\+][\w\-\.\+]*/;
my $OPTS_R = qr/-\S+\s*/;
my $ACTION_R = qr/\w+/;
my $EXCLUDE_R = qr/if\s+\[\s+-x\s+\S*update-rc\.d/;
sub run {
my (undef, undef, $info) = @_;
my $initd_dir = $info->lab_data_path('init.d');
my $postinst = $info->control('postinst');
my $preinst = $info->control('preinst');
my $postrm = $info->control('postrm');
my $prerm = $info->control('prerm');
my (%initd_postinst, %initd_postrm);
# read postinst control file
if (-f $postinst and not -l $postinst) {
open(my $fd, '<', $postinst);
while (<$fd>) {
next if /$EXCLUDE_R/o;
s/\#.*$//o;
next unless /^(?:.+;|^\s*system[\s\(\']+)?\s*update-rc\.d\s+
(?:$OPTS_R)*($INITD_NAME_REGEX)\s+($ACTION_R)/xo;
my ($name,$opt) = ($1,$2);
next if $opt eq 'remove';
if ($initd_postinst{$name}++ == 1) {
tag 'duplicate-updaterc.d-calls-in-postinst', $name;
next;
}
unless (m,>\s*/dev/null,o) {
tag 'output-of-updaterc.d-not-redirected-to-dev-null',
"$name postinst";
}
}
close($fd);
}
# read preinst control file
if (-f $preinst and not -l $preinst) {
open(my $fd, '<', $preinst);
while (<$fd>) {
next if /$EXCLUDE_R/o;
s/\#.*$//o;
next unless m/update-rc\.d \s+
(?:$OPTS_R)*($INITD_NAME_REGEX) \s+
($ACTION_R)/ox;
my ($name,$opt) = ($1,$2);
next if $opt eq 'remove';
tag 'preinst-calls-updaterc.d', $name;
}
close($fd);
}
# read postrm control file
if (-f $postrm and not -l $postrm) {
open(my $fd, '<', $postrm);
while (<$fd>) {
next if /$EXCLUDE_R/o;
s/\#.*$//o;
next unless m/update-rc\.d\s+($OPTS_R)*($INITD_NAME_REGEX)/o;
if ($initd_postrm{$2}++ == 1) {
tag 'duplicate-updaterc.d-calls-in-postrm', $2;
next;
}
unless (m,>\s*/dev/null,o) {
tag 'output-of-updaterc.d-not-redirected-to-dev-null',
"$2 postrm";
}
}
close($fd);
}
# read prerm control file
if (-f $prerm and not -l $prerm) {
open(my $fd, '<', $prerm);
while (<$fd>) {
next if /$EXCLUDE_R/o;
s/\#.*$//o;
next unless m/update-rc\.d\s+($OPTS_R)*($INITD_NAME_REGEX)/o;
tag 'prerm-calls-updaterc.d', $2;
}
close($fd);
}
# init.d scripts have to be removed in postrm
for (keys %initd_postinst) {
if ($initd_postrm{$_}) {
delete $initd_postrm{$_};
} else {
tag 'postrm-does-not-call-updaterc.d-for-init.d-script',
"etc/init.d/$_";
}
}
for (keys %initd_postrm) {
tag 'postrm-contains-additional-updaterc.d-calls', "etc/init.d/$_";
}
foreach my $initd_file (keys %initd_postinst) {
next unless $initd_file;
my $initd_path = "$initd_dir/$initd_file";
# init.d scripts have to be marked as conffiles unless they're
# symlinks.
unless ($info->is_conffile("etc/init.d/$initd_file")
or -l $initd_path) {
tag 'init.d-script-not-marked-as-conffile',
"etc/init.d/$initd_file";
}
# Check if file exists in package and check the script for
# other issues if it was included in the package.
if (-f $initd_path) {
check_init($initd_file, $initd_path);
} elsif (not -l $initd_path) {
tag 'init.d-script-not-included-in-package',
"etc/init.d/$initd_file";
}
}
return unless -d $initd_dir;
# files actually installed in /etc/init.d should match our list :-)
opendir(my $dirfd, $initd_dir);
for my $script (readdir($dirfd)) {
my $tagname = 'script-in-etc-init.d-not-registered-via-update-rc.d';
next if any {$script eq $_} qw(. .. README skeleton rc rcS);
my $script_path = "$initd_dir/$script";
# In an upstart system, such as Ubuntu, init scripts are symlinks to
# upstart-job which are not registered with update-rc.d.
if (-l $script_path) {
my $target = readlink($script_path);
if ($target =~ m,(?:\A|/)lib/init/upstart-job\z,) {
$tagname
= 'upstart-job-in-etc-init.d-not-registered-via-update-rc.d';
}
}
# If $initd_postinst is true for this script, we already
# checked the syntax in the above loop. Check the syntax of
# unregistered scripts so that we get more complete Lintian
# coverage in the first pass.
unless ($initd_postinst{$script}) {
tag $tagname, "etc/init.d/$script";
check_init($script, $script_path) if -f $script_path;
}
}
closedir($dirfd);
return;
}
sub check_init {
my ($initd_file, $initd_path) = @_;
# In an upstart system, such as Ubuntu, init scripts are symlinks to
# upstart-job. It doesn't make sense to check the syntax of upstart-job,
# so skip the checks of the init script itself in that case.
if (-l $initd_path) {
my $target = readlink($initd_path);
if ($target =~ m,(?:\A|/)lib/init/upstart-job\z,) {
return;
}
if (!is_ancestor_of(dirname($initd_path), $initd_path)) {
# unsafe symlink, skip. NB: dirname($initd_path) is safe
# because coll/init.d does sanity checking for us.
return;
}
}
my (%tag, %lsb);
my $in_file_test = 0;
my %needs_fs = ('remote' => 0, 'local' => 0);
open(my $fd, '<', $initd_path);
while (defined(my $l = <$fd>)) {
if ($. == 1 && $l =~ m,^\#!\s*(/usr/[^\s]+),) {
tag 'init.d-script-uses-usr-interpreter',
"etc/init.d/$initd_file $1";
}
if ($l =~ m/^\#\#\# BEGIN INIT INFO/) {
if ($lsb{BEGIN}) {
tag 'init.d-script-has-duplicate-lsb-section',
"etc/init.d/$initd_file";
next;
}
$lsb{BEGIN} = 1;
my $last;
# We have an LSB keyword section. Parse it and save the data
# in %lsb for analysis.
while (defined(my $l = <$fd>)) {
if ($l =~ /^\#\#\# END INIT INFO/) {
$lsb{END} = 1;
last;
} elsif ($l !~ /^\#/) {
tag 'init.d-script-has-unterminated-lsb-section',
"etc/init.d/${initd_file}:$.";
last;
} elsif ($l =~ /^\# ([a-zA-Z-]+):\s*(.*?)\s*$/) {
my $keyword = lc $1;
my $value = $2;
tag 'init.d-script-has-duplicate-lsb-keyword',
"etc/init.d/${initd_file}:$. $keyword"
if (defined $lsb{$keyword});
tag 'init.d-script-has-unknown-lsb-keyword',
"etc/init.d/${initd_file}:$. $keyword"
unless (defined($lsb_keywords{$keyword})
|| $keyword =~ /^x-/);
$lsb{$keyword} = defined($value) ? $value : '';
$last = $keyword;
} elsif ($l =~ /^\#(\t| )/ && $last eq 'description') {
my $value = $l;
$value =~ s/^\#\s*//;
$lsb{description} .= ' ' . $value;
} else {
tag 'init.d-script-has-bad-lsb-line',
"etc/init.d/${initd_file}:$.";
}
}
}
# Pretty dummy way to handle conditionals, but should be enough
# for simple init scripts
$in_file_test = 1
if ($l =~ m/\bif\s+.*?(?:test|\[)(?:\s+\!)?\s+-[efr]\s+/);
$in_file_test = 0 if ($l =~ m/\bfi\b/);
if (!$in_file_test && $l =~ m,^\s*\.\s+["'"]?(/etc/default/[\$\w/-]+),)
{
tag 'init.d-script-sourcing-without-test',
"etc/init.d/${initd_file}:$. $1";
}
# This should be more sophisticated: ignore heredocs, ignore quoted
# text and the arguments to echo, etc.
$needs_fs{'remote'} = 1 if ($l =~ m,^[^\#]*/usr/,);
$needs_fs{'local'} = 1 if ($l =~ m,^[^\#]*/var/,);
while ($l =~ s/^[^\#]*?(start|stop|restart|force-reload|status)//o) {
$tag{$1} = 1;
}
}
close($fd);
# Make sure all of the required keywords are present.
if (not $lsb{BEGIN}) {
tag 'init.d-script-missing-lsb-section', "etc/init.d/${initd_file}";
} else {
for my $keyword (keys %lsb_keywords) {
if ($lsb_keywords{$keyword} && !defined $lsb{$keyword}) {
if ($keyword eq 'short-description') {
tag 'init.d-script-missing-lsb-short-description',
"etc/init.d/${initd_file}";
} elsif ($keyword eq 'description') {
tag 'init.d-script-missing-lsb-description',
"etc/init.d/${initd_file}";
} else {
tag 'init.d-script-missing-lsb-keyword',
"etc/init.d/${initd_file} $keyword";
}
}
}
}
# Check the runlevels.
my %start;
if (defined $lsb{'default-start'}) {
for my $runlevel (split(/\s+/, $lsb{'default-start'})) {
if ($runlevel =~ /^[sS0-6]$/) {
$start{lc $runlevel} = 1;
if ($runlevel eq '0' or $runlevel eq '6') {
tag 'init.d-script-starts-in-stop-runlevel',
"etc/init.d/${initd_file}", $runlevel;
}
} else {
tag 'init.d-script-has-bad-start-runlevel',
"etc/init.d/${initd_file}",
$runlevel;
}
}
# No script should start at one of the 2-5 runlevels but not at
# all of them
my $start = join(' ', sort grep {$_ =~ /^[2-5]$/} keys %start);
if (length($start) > 0 and $start ne '2 3 4 5') {
my $base = $initd_file;
$base =~ s,.*/,,;
my @missing = grep { !defined $start{$_} } qw(2 3 4 5);
tag 'init.d-script-missing-start', "etc/init.d/${initd_file}",
@missing;
}
}
if (defined $lsb{'default-stop'}) {
my %stop;
for my $runlevel (split(/\s+/, $lsb{'default-stop'})) {
if ($runlevel =~ /^[sS0-6]$/) {
$stop{$runlevel} = 1 unless $runlevel =~ /[sS2-5]/;
if ($start{$runlevel}) {
tag 'init.d-script-has-conflicting-start-stop',
"etc/init.d/${initd_file} $runlevel";
}
if ($runlevel =~ /[sS]/) {
tag 'init-d-script-stops-in-s-runlevel',
"etc/init.d/${initd_file}";
}
} else {
tag 'init.d-script-has-bad-stop-runlevel',
"etc/init.d/${initd_file} $runlevel";
}
}
# Scripts that stop in any of 0, 1, or 6 probably should stop in all
# of them, with some special exceptions.
my $stop = join(' ', sort keys %stop);
if (length($stop) > 0 and $stop ne '0 1 6') {
my $base = $initd_file;
$base =~ s,.*/,,;
if (none { $base eq $_ } qw(killprocs sendsigs halt reboot)) {
my @missing = grep { !defined $stop{$_} } qw(0 1 6);
tag 'init.d-script-possible-missing-stop',
"etc/init.d/${initd_file}",
@missing;
}
}
}
if ($lsb{'provides'}) {
my $provides_self;
for my $facility (split(/\s+/, $lsb{'provides'})) {
if ($facility =~ /^\$/) {
tag 'init.d-script-provides-virtual-facility',
"etc/init.d/${initd_file}", $facility;
}
if ($initd_file =~/^\Q$facility\E(?:.sh)?$/) {
$provides_self = 1;
}
}
tag 'init.d-script-does-not-provide-itself', "etc/init.d/${initd_file}"
unless $provides_self;
}
# If $remote_fs is needed $local_fs is not, since it's implied.
$needs_fs{'local'} = 0 if $needs_fs{'remote'};
# Separately check Required-Start and Required-Stop, since while they're
# similar, they're not quite identical. This could use some further
# restructuring by pulling the regexes out as data tied to start/stop and
# remote/local and then combining the loops.
if (defined $lsb{'default-start'} && length($lsb{'default-start'})) {
my @required = split(' ', $lsb{'required-start'} || '');
if ($needs_fs{remote}) {
if (none { /^\$(?:remote_fs|all)\z/ } @required) {
tag 'init.d-script-missing-dependency-on-remote_fs',
"etc/init.d/${initd_file}: required-start";
}
}
if ($needs_fs{local}) {
if (none { /^\$(?:local_fs|remote_fs|all)\z/ } @required) {
tag 'init.d-script-missing-dependency-on-local_fs',
"etc/init.d/${initd_file}: required-start";
}
}
}
if (defined $lsb{'default-stop'} && length($lsb{'default-stop'})) {
my @required = split(' ', $lsb{'required-stop'} || '');
if ($needs_fs{remote}) {
if (none { /^(?:\$remote_fs|\$all|umountnfs)\z/ } @required) {
tag 'init.d-script-missing-dependency-on-remote_fs',
"etc/init.d/${initd_file}: required-stop";
}
}
if ($needs_fs{local}) {
if (none { /^(?:\$(?:local|remote)_fs|\$all|umountn?fs)\z/ }
@required) {
tag 'init.d-script-missing-dependency-on-local_fs',
"etc/init.d/${initd_file}: required-stop";
}
}
}
# Check syntax rules that apply to all of the keywords.
for my $keyword (qw(required-start should-start required-stop should-stop))
{
next unless defined $lsb{$keyword};
for my $dependency (split(/\s+/, $lsb{$keyword})) {
if (defined $implied_dependencies{$dependency}) {
tag 'init.d-script-should-depend-on-virtual-facility',
"etc/init.d/${initd_file}",
"$dependency -> $implied_dependencies{$dependency}";
} elsif ($keyword =~ m/^required-/ && $dependency =~ m/^\$/) {
tag 'init.d-script-depends-on-unknown-virtual-facility',
"etc/init.d/${initd_file}", $dependency
unless ($VIRTUAL_FACILITIES->known($dependency));
}
}
}
# all tags included in file?
for my $option (qw(start stop restart force-reload)) {
$tag{$option}
or tag 'init.d-script-does-not-implement-required-option',
"etc/init.d/${initd_file} $option";
}
for my $option (qw(status)) {
$tag{$option}
or tag 'init.d-script-does-not-implement-optional-option',
"etc/init.d/${initd_file} $option";
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/po-debconf.desc 0000664 0000000 0000000 00000012617 12310413144 015570 0 ustar Check-Script: po-debconf
Author: Denis Barbier
Abbrev: pd
Type: source
Info: This looks for common mistakes in packages using po-debconf(7).
Needs-Info: debfiles
Tag: not-using-po-debconf
Severity: serious
Certainty: certain
Info: This package seems to be using debconf templates, but it does not
use po-debconf to make translations possible (debian/po doesn't
exist). Debian Policy requires that all packages using debconf use a
gettext-based translation system. If this package uses one other than
po-debconf, please report this as a lintian bug along with how to detect
that system.
Ref: policy 3.9.1
Tag: untranslatable-debconf-templates
Severity: serious
Certainty: possible
Info: This package seems to be using debconf templates, but some
descriptions are not translatable. You should prepend an underscore
before every translatable field, as described in po-debconf(7). This
may mean that translators weren't properly warned about new strings.
.
Translators may be notified of changes using podebconf-report-po, for
example:
.
podebconf-report-po --call --withtranslators --deadline="+10 days" \
--languageteam
.
If the field is not intended for users to see, ensure the first line
of the description contains "for internal use".
Ref: policy 3.9.1
Tag: stray-translated-debconf-templates
Severity: normal
Certainty: certain
Info: This package contains a file named *templates.XX or
*templates.XX_XX. This was the naming convention for the translated
templates merged using debconf-mergetemplate. Since the package is using
po-debconf, these files should be replaced by language-specific files in
the debian/po directory and should no longer be needed.
Tag: missing-potfiles-in
Severity: normal
Certainty: certain
Info: The required file POTFILES.in is missing from
debian/po.
Ref: po-debconf(7)
Tag: missing-file-from-potfiles-in
Severity: normal
Certainty: certain
Info: A file listed in debian/po/POTFILES.in could not be found
in the source package.
Ref: po-debconf(7)
Tag: missing-templates-pot
Severity: normal
Certainty: certain
Info: The required file templates.pot is missing from
debian/po.
Ref: po-debconf(7)
Tag: unknown-encoding-in-po-file
Severity: normal
Certainty: certain
Info: Encoding must be declared in PO files. Otherwise, charset
conversions cannot be performed.
Tag: invalid-po-file
Severity: normal
Certainty: certain
Info: Errors were found in the listed PO file that will cause its content
to be discarded. Run msgfmt on the file to see the error
messages.
Tag: debconf-translation-using-general-list
Severity: normal
Certainty: certain
Info: This debconf translation is using the general debconf-i18n list as
the address in the Language-Team field.
.
The intended purpose of the Language-Team field is to be an additional
contact for new translation requests in addition to the previous
translator (as recorded in Last-Translator). The field should therefore
point to a mailing list dedicated to the language of this PO file, not
the general list for translation discussions.
Tag: misnamed-po-file
Severity: normal
Certainty: possible
Info: The name of this PO file doesn't appear to be a valid language
code. Any files in debian/po ending in .po will be
processed as translations by po2debconf for the language code equal to
the file name without the trailing .po. If the file name does
not correctly reflect the language of the translation, the translation
will not be accessible to users of that language.
.
If this file isn't actually a PO file, rename it to something that
doesn't end in .po or move it to another directory so that
translation merging programs will not be confused.
Tag: newer-debconf-templates
Severity: normal
Certainty: possible
Info: debconf-updatepo has not been run since the last change to your
debconf templates.
.
You should run debconf-updatepo whenever debconf templates files are
changed so that translators can be warned that their files are
outdated.
.
This can be ensured by running debconf-updatepo in the 'clean' target
of debian/rules. PO files will then always be up-to-date when
building the source package.
Tag: translated-default-field
Severity: normal
Certainty: possible
Info: You should not mark as translatable "Default:" or "DefaultChoice:"
fields, unless explicitly needed (e.g. default country, default language,
etc.). If this Default field really should be translated, you should
explain translators how they should translate it by using comments or
brackets. For example:
.
# Translators: Default language name, but not translated
_Default: English
.
Or:
.
_Default: English[ Default language name, but not translated]
.
Note that in the first case, Lintian ignores the comment unless it
explicitly references translators and it is appears directly before
the field in question.
Ref: po-debconf(7), #637881
Tag: no-complete-debconf-translation
Severity: wishlist
Certainty: possible
Info: Even though this package provides debconf translation support, there
are no translations or none of the translations are complete. This may
mean that translators weren't properly warned about new strings.
.
Translators may be notified of changes using podebconf-report-po, for
example:
.
podebconf-report-po --call --withtranslators --deadline="+10 days" \
--languageteam
Ref: devref 6.5.2.2
lintian-2.5.22ubuntu1/checks/version-substvars.desc 0000664 0000000 0000000 00000004611 12310413206 017265 0 ustar Check-Script: version-substvars
Author: Adeodato Simó
Abbrev: v-s
Type: source
Needs-Info: debfiles
Info: This script checks for correct use of the various
*Version substvars, e.g. deprecated substvars,
or usage that can cause un-binNMUability
Tag: not-binnmuable-any-depends-any
Severity: important
Certainty: certain
Info: The package is not safely binNMUable because an arch:any package
depends on another arch:any package with a (= ${source:Version})
relationship. Please use (= ${binary:Version}) instead.
Tag: not-binnmuable-any-depends-all
Severity: important
Certainty: certain
Info: The package is not safely binNMUable because an arch:any package
depends on an arch:all package with a (= ${Source-Version}) or
(= ${binary:Version}) relationship. Please use (= ${source:Version})
instead.
.
Note this is also triggered if the dependency uses (>= ${var}),
since that has the same issue.
Tag: not-binnmuable-all-depends-any
Severity: important
Certainty: certain
Info: The package is not safely binNMUable because an arch:all package
depends on an arch:any package with a strict (= ${Source-Version}), or
similar, relationship.
.
It is not possible for arch:all packages to depend so strictly on
arch:any packages while having the package binNMUable, so please use
one of these, whichever is more appropriate:
.
Depends: arch_any (>= ${source:Version})
Depends: arch_any (>= ${source:Version}),
arch_any (<< ${source:Version}.1~)
Tag: version-substvar-for-external-package
Severity: important
Certainty: certain
Info: The first package has a relation on the second package using a
dpkg-control substitution variable to generate the versioned part of
the relation. However the second package is not built from this
source package. Usually this means there is a mistake in the package
name in this dependency.
.
Note that this warning can occur if the package name used in the
relation contains a typo. In this case, correcting the typo should
remove the warning.
Tag: substvar-source-version-is-deprecated
Severity: normal
Certainty: certain
Info: The package uses the now deprecated ${Source-Version} substvar,
which has misleading semantics. Please switch to ${binary:Version} or
${source:Version} as appropriate (introduced in dpkg 1.13.19, released
with etch). Support for ${Source-Version} may be removed from dpkg-dev
in the future.
lintian-2.5.22ubuntu1/checks/filename-length.pm 0000664 0000000 0000000 00000005562 12311317605 016320 0 ustar # filename-length -- lintian check script -*- perl -*-
# Copyright (C) 2011 Niels Thykier
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::filename_length;
use strict;
use warnings;
use autodie;
use Lintian::Tags qw(tag);
use Lintian::Util qw(strip);
use constant FILENAME_LENGTH_LIMIT => 80;
# We could derive this from data/fields/architectures, but that
# contains things like kopensolaris-sparc64 and kfreebsd-sparc64,
# neither of which Debian offically supports.
use constant LONGEST_ARCHITECTURE => length 'kfreebsd-amd64';
sub run {
my ($pkg, $type, $info, $proc) = @_;
# pkg_version(_arch)?.type
# - here we pay for length of "name_version"
my $len = length($pkg) + length($proc->pkg_version) + 1;
my $extra;
if ($type eq 'binary' || $type eq 'source'){
# Here we add length .deb / .dsc (in both cases +4)
$len += 4;
} else {
# .udeb, thats a +5
$len += 5;
}
if ($type ne 'source') {
# non-src pkgs have architecture as well
if ($proc->pkg_arch ne 'all'){
my $real = $len + 1 + length($proc->pkg_arch);
$len += 1 + LONGEST_ARCHITECTURE;
$extra = "$real ($len)";
} else {
# _all has length 4
$len += 4;
}
}
$extra = $len unless defined $extra;
tag 'package-has-long-file-name', "$extra > ". FILENAME_LENGTH_LIMIT
if $len > FILENAME_LENGTH_LIMIT;
return if $type ne 'source';
# Reset to work with elements of the dsc file.
$len = 0;
foreach my $entry (split m/\n/o, $info->field('files', '')){
my $filename;
my $flen;
strip($entry);
next unless $entry;
(undef, undef, $filename) = split m/\s++/o, $entry;
next unless $filename;
$flen = length($filename);
$len = $flen if ($flen > $len);
}
if ($len > FILENAME_LENGTH_LIMIT){
tag 'source-package-component-has-long-file-name',
"$len > " . FILENAME_LENGTH_LIMIT;
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/checks/description.pm 0000664 0000000 0000000 00000017223 12311317603 015577 0 ustar # description -- lintian check script -*- perl -*-
# Copyright (C) 1998 Christian Schwarz
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
package Lintian::description;
use strict;
use warnings;
use autodie;
# Compared to a lower-case string, so it must be all lower-case
use constant DH_MAKE_PERL_TEMPLATE => 'this description was'
. ' automagically extracted from the module by dh-make-perl';
use Encode qw(decode);
use Lintian::Check qw(check_spelling check_spelling_picky);
use Lintian::Tags qw(tag);
sub run {
my ($pkg, $type, $info, undef, $group) = @_;
my $tabs = 0;
my $lines = 0;
my $template = 0;
my $unindented_list = 0;
my $synopsis;
my $description;
# description?
my $full_description = $info->field('description');
unless (defined $full_description) {
tag 'package-has-no-description';
return;
}
$full_description =~ m/^([^\n]*)\n(.*)$/s;
($synopsis, $description) = ($1, $2);
unless (defined $synopsis) {
$synopsis = $full_description;
$description = '';
}
$description = '' unless defined($description);
if ($synopsis =~ m/^\s*$/) {
tag 'description-synopsis-is-empty';
} else {
if ($synopsis =~ m/^\Q$pkg\E\b/i) {
tag 'description-starts-with-package-name';
}
if ($synopsis =~ m/^(an?|the)\s/i) {
tag 'description-synopsis-starts-with-article';
}
if ($synopsis =~ m/(?/) {
tag 'description-is-dh_make-template' unless $template++;
}
# We have to decode into UTF-8 to get the right length for the
# length check. If the changelog uses a non-UTF-8 encoding,
# this will mangle it, but it doesn't matter for the length
# check.
if (length(decode('utf-8', $synopsis)) >= 80) {
tag 'description-too-long';
}
}
my $flagged_homepage;
foreach (split /\n/, $description) {
next if m/^ \.\s*$/o;
if ($lines == 0) {
my $firstline = lc $_;
my $lsyn = lc $synopsis;
if ($firstline =~ /^\Q$lsyn\E$/) {
tag 'description-synopsis-is-duplicated';
} else {
$firstline =~ s/[^a-zA-Z0-9]+//g;
$lsyn =~ s/[^a-zA-Z0-9]+//g;
if ($firstline eq $lsyn) {
tag 'description-synopsis-is-duplicated';
}
}
}
$lines++;
if (m/^ \.\s*\S/o) {
tag 'description-contains-invalid-control-statement';
} elsif (m/^ [\-\*]/o) {
# Print it only the second time. Just one is not enough to be sure that
# it's a list, and after the second there's no need to repeat it.
tag 'possible-unindented-list-in-extended-description'
if $unindented_list++ == 2;
}
if (m/\t/o) {
tag 'description-contains-tabs' unless $tabs++;
}
if (m,^\s*Homepage: /) {
tag 'description-is-dh_make-template' unless $template++;
}
}
if (length(decode('utf-8', $_)) > 80) {
tag 'extended-description-line-too-long';
}
}
if ($type ne 'udeb') {
if ($lines == 0) {
tag 'extended-description-is-empty';
} elsif ($lines <= 2 and not $synopsis =~ /(?:dummy|transition)/i) {
tag 'extended-description-is-probably-too-short'
unless $info->is_pkg_class('any-meta')
or $pkg =~ m{-dbg\Z}xsm;
} elsif ($description =~ /^ \.\s*\n|\n \.\s*\n \.\s*\n|\n \.\s*\n?$/) {
tag 'extended-description-contains-empty-paragraph';
}
}
# Check for a package homepage in the description and no Homepage
# field. This is less accurate and more of a guess than looking
# for the old Homepage: convention in the body.
unless ($info->field('homepage') or $flagged_homepage) {
if (
$description =~ /homepage|webpage|website|url|upstream|web\s+site
|home\s+page|further\s+information|more\s+info
|official\s+site|project\s+home/xi
and $description =~ m,\b(https?://[a-z0-9][^>\s]+),i
) {
tag 'description-possibly-contains-homepage', $1;
} elsif ($description =~ m,\b(https?://[a-z0-9][^>\s]+)>?\.?\s*\z,i) {
tag 'description-possibly-contains-homepage', $1;
}
}
if ($description) {
check_spelling('spelling-error-in-description',
$description,undef, $group->info->spelling_exceptions);
check_spelling_picky('capitalization-error-in-description',
$description);
}
return;
}
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/commands/ 0000775 0000000 0000000 00000000000 12313521266 013256 5 ustar lintian-2.5.22ubuntu1/commands/info 0000775 0000000 0000000 00000016254 12313516300 014140 0 ustar #!/usr/bin/perl -wT
#
# lintian-info -- transform lintian tags into descriptive text
#
# Copyright (C) 1998 Christian Schwarz and Richard Braakman
#
# This program is free software. It is distributed under the terms of
# the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any
# later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, you can find it on the World Wide
# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
use strict;
use warnings;
use Getopt::Long();
# turn file buffering off:
STDOUT->autoflush;
our @INCLUDE_DIRS;
BEGIN {
if (!exists($ENV{'LINTIAN_INCLUDE_DIRS'})) {
print STDERR "Do not call $0 directly, use dplint $0 instead\n";
exit(1);
}
my $dirs = $ENV{'LINTIAN_INCLUDE_DIRS'};
if ($dirs =~ m{\A (.*) \Z}xsm) {
# Untaint LINTIAN_INCLUDE_DIRS
$dirs = $1;
}
@INCLUDE_DIRS = split(':', $dirs);
my $libdir = $INCLUDE_DIRS[-1] . '/lib';
if (-d $libdir) {
require lib;
import lib $libdir;
}
}
use Lintian::Data;
use Lintian::Internal::FrontendUtil qw(split_tag);
use Lintian::Profile;
sub compat();
my ($annotate, $tags, $help, $prof);
my (%already_displayed, $profile);
my (@compat_include_dirs, $compat_user_dirs);
my %opthash = (
'annotate|a' => \$annotate,
'tags|t' => \$tags,
'help|h' => \$help,
'profile=s' => \$prof,
);
if (compat) {
$opthash{'include-dir=s'} = \@compat_include_dirs;
$opthash{'user-dirs!'} = \$compat_user_dirs;
}
Getopt::Long::config('bundling', 'no_getopt_compat', 'no_auto_abbrev');
Getopt::Long::GetOptions(%opthash) or die("error parsing options\n");
# help
if ($help) {
my $me = 'dplint info';
$me = 'lintian-info' if compat;
print <<"EOT";
Usage: $me [log-file...] ...
$me --annotate [overrides ...]
$me --tags tag ...
Options:
-a, --annotate display descriptions of tags in Lintian overrides
-t, --tags display tag descriptions
--profile X use vendor profile X to determine severities
EOT
if (compat) {
# if we are called as lintian-info, we also accept
# --include-dir and --[no-]user-dirs
print <<'EOT';
--include-dir DIR check for Lintian data in DIR
--[no-]user-dirs whether to include profiles from user directories
Note that --include-dir and --[no-]user-dirs must appear as the first
options if used. Otherwise, they will trigger a deprecation warning.
EOT
}
exit 0;
}
if (compat) {
if (@compat_include_dirs or defined($compat_user_dirs)) {
# NB: If these options were indeed first in @ARGV, then dplint
# would have parsed them for us. So the fact that we see their
# values implies they appeared after some other option.
print STDERR join(q{ },
'Warning: --include-dir and --[no-]user-dirs',
"should be the first option(s) if given\n");
fixup_include_dirs();
}
}
$profile = Lintian::Profile->new($prof, \@INCLUDE_DIRS);
Lintian::Data->set_vendor($profile);
# If tag mode was specified, read the arguments as tags and display the
# descriptions for each one. (We don't currently display the severity,
# although that would be nice.)
if ($tags) {
my $unknown = 0;
for my $tag (@ARGV) {
my $info = $profile->get_tag($tag, 1);
if ($info) {
print $info->code . ": $tag\n";
print "N:\n";
print $info->description('text', 'N: ');
} else {
print "N: $tag\n";
print "N:\n";
print "N: Unknown tag.\n";
$unknown = 1;
}
print "N:\n";
}
exit($unknown ? 1 : 0);
}
my $type_re = qr/(?:binary|changes|source|udeb)/o;
# Otherwise, read input files or STDIN, watch for tags, and add descriptions
# whenever we see one, can, and haven't already explained that tag. Strip off
# color and HTML sequences.
while (<>) {
print;
chomp;
next if /^\s*$/;
s/\e[\[\d;]*m//g;
s///g;
s,,,g;
my $tag;
if ($annotate) {
my $tagdata;
next unless m/^(?: # start optional part
(?:\S+)? # Optionally starts with package name
(?: \s*+ \[[^\]]+?\])? # optionally followed by an [arch-list] (like in B-D)
(?: \s*+ $type_re)? # optionally followed by the type
:\s++)? # end optional part
([\-\.a-zA-Z_0-9]+ (?:\s.+)?)$/ox; # [extra] -> $1
$tagdata = $1;
($tag, undef) = split m/ /o, $tagdata, 2;
} else {
my @parts = split_tag($_);
next unless @parts;
$tag = $parts[5];
}
next if $already_displayed{$tag}++;
my $info = $profile->get_tag($tag, 1);
next unless $info;
print "N:\n";
print $info->description('text', 'N: ');
print "N:\n";
}
{
my $backwards_compat;
sub compat() {
return $backwards_compat if defined($backwards_compat);
$backwards_compat = 0;
if (exists($ENV{'LINTIAN_DPLINT_CALLED_AS'})) {
my $called_as = $ENV{'LINTIAN_DPLINT_CALLED_AS'};
$backwards_compat = 1
if $called_as =~ m{ (?: \A | /) lintian-info \Z}xsm;
}
return $backwards_compat;
}
}
exit 0;
sub _load_file_basedir {
# File::BaseDir sprews warnings if $ENV{'HOME'} is undef, so
# make sure it is defined when we load the module. Though,
# we need to scope this, so $ENV{'HOME'} becomes undef again
# when we check for it later.
local $ENV{'HOME'} = $ENV{'HOME'} // '/nonexistent';
require File::BaseDir;
import File::BaseDir qw(config_home config_files data_home);
return;
}
sub fixup_include_dirs {
my (@user_dirs, $user_dir_regex);
# First, determine the user dirs
_load_file_basedir();
if (exists($ENV{'HOME'}) or exists($ENV{'XDG_CONFIG_HOME'})) {
my $data_home = data_home('lintian');
if (defined($data_home)) {
push(@user_dirs, $data_home);
}
}
push(@user_dirs, '/etc/lintian');
# Then remove the user dirs from the original include path (they will
# always be the "first" entries in a predictable order)
$user_dir_regex= join(q{},map { "(?:$_:)?" } map { quotemeta } @user_dirs);
$ENV{'LINTIAN_INCLUDE_DIRS'} =~ s{\A $user_dir_regex}{}xsmg;
# now, rebuild @INCLUDE_DIRS
@INCLUDE_DIRS = split(':', $ENV{'LINTIAN_INCLUDE_DIRS'});
if ($compat_user_dirs) {
unshift(@compat_include_dirs, @user_dirs);
}
# And pre-append the new dirs
unshift(@INCLUDE_DIRS, grep { -d } @compat_include_dirs);
return;
}
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
lintian-2.5.22ubuntu1/.perltidyrc 0000664 0000000 0000000 00000001641 12310413144 013631 0 ustar # -*- conf -*-
#
# Default options for perltidy for proper Perl code reformatting.
#
# This file is based on the one from the rra-c-util package,
# which can be found at .
-bbao # put line breaks before any operator
-nbbc # don't force blank lines before comments (bad for else blocks)
-ce # cuddle braces around else
-l=79 # usually use 78, but don't want 79-long lines reformatted
-pt=2 # don't add extra whitespace around parentheses
-sbt=2 # ...or square brackets
-sfs # no space before semicolon in for (not that I use this form)
-bar # opening-brace-always-on-right
-sot # avoid lines with isolated opening tokens
-sct # ... same for closing tokens
-fs # allow "perltidy, please don't touch this" sections
-fws # don't add or delete whitespace
lintian-2.5.22ubuntu1/man/ 0000775 0000000 0000000 00000000000 12314371467 012237 5 ustar lintian-2.5.22ubuntu1/man/lintian.pod.in 0000664 0000000 0000000 00000066601 12311664423 015011 0 ustar # Copyright 2010 Niels Thykier
# - based on the work Richard Braakman and Christian
# Schwarz (copyrighted 1998).
#
# This manual page is free software. It is distributed under the
# terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This manual page is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this manual page; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
# USA
#
=head1 NAME
lintian - Static analysis tool for Debian packages
=head1 SYNOPSIS
B [I] [I] [I] ...
=head1 DESCRIPTION
Lintian dissects Debian packages and reports bugs and policy
violations. It contains automated checks for many aspects of Debian
policy as well as some checks for common errors.
It uses an archive directory, called I, in which it stores
information about the packages it examines. It can keep this
information between multiple invocations in order to avoid repeating
expensive data-collection operations.
There are three ways to specify binary, udeb or source packages for
Lintian to process: by file name (the .deb file for a binary package
or the .dsc file for a source package), by naming a I<.changes> file,
or by using a lab query (see L below).
If you specify a I<.changes> file, Lintian will process all packages
listed in that file. This is convenient when checking a new package
before uploading it.
If you specify packages to be checked or use one of the options
B<--all> or B<--packages-from-file>, the packages requested will be
processed. Otherwise, if I exists, it is parsed to
determine the name of the .changes file to look for in the parent
directory (when using the actions B<--check> or B<--unpack>). See
L for more information.
=head1 OPTIONS
Actions of the lintian command: (Only one action can be specified per invocation)
=over 4
=item B<-c>, B<--check>
Run all checks over the specified packages. This is the default action.
=item B<-C> chk1,chk2,..., B<--check-part> chk1,chk2,...
Run only the specified checks. You can either specify the name of the
check script or the abbreviation. For details, see the L section
below.
=item B<-F>, B<--ftp-master-rejects>
Run only the checks that issue tags that result in automatic rejects
from the Debian upload queue. The list of such tags is refreshed with
each Lintian release, so may be slightly out of date if it has changed
recently.
This is implemented via a profile and thus this option cannot be used
together with B<--profile>.
=item B<-r>, B<--remove>
Removed the specified packages from the lintian lab. This is only
useful with static labs.
=item B<-R>, B<--remove-lab>
Remove the laboratory directory. This is only useful with static
labs.
=item B<-S>, B<--setup-lab>
Set up or update a static lintian laboratory.
=item B<-T> tag1,tag2,..., B<--tags> tag1,tag2,...
Run only the checks that issue the requested tags. The tests for
other tags within the check scripts will be run but the tags will not
be issued.
With this options all tags listed will be displayed regardless of the
display settings.
=item B<--tags-from-file> filename
Same functionality as B<--tags>, but read the list of tags from a
file. Blank lines and lines beginning with # are ignored. All other
lines are taken to be tag names or comma-separated lists of tag names
to (potentially) issue.
With this options all tags listed will be displayed regardless of the
display settings.
=item B<-u>, B<--unpack>
Unpacks the package will all collections. See the L
section below.
Note in this option will also run all collections. See the
L section below.
=item B<-X> chk1,chk2,..., B<--dont-check-part> chk1,chk2,...
Run all but the the specified checks. You can either specify the name
of the check script or the abbreviation. For details, see the
L section below.
=back
General options:
=over 4
=item B<-d>, B<--debug>
Display debugging messages. (Implies B<-v> and overrules any B<-q>).
Can be used multiple times to increase the debug information. If
passed twice or more, Lintian will emit approximate run times for
collections and checks (if L can be loaded).
If passed 3 times (and if L can be loaded), Lintian will
display memory usage for (some of its) data structures. With 4 times,
the memory usage will be more detailed.
This option cannot be specified in the config file. If used on the
command line it will override the B and the B options
in the config file.
=item B<-h>, B<--help>
Display usage information and exit.
=item B<-q>, B<--quiet>
Suppress all informational messages including override comments
(normally shown with B<--show-overrides>).
This option is silently ignored if B<--debug> is given. Otherwise, if
both B<--verbose> and B<--quiet> is used, the last of these two options
take effect.
This option overrides the B and the B variable in the
configuration file. In the configuration file, this option is enabled
by using B variable. The B and B variables may
not both appear in the config file.
=item B<-v>, B<--verbose>
Display verbose messages.
If B<--debug> is used this option is always enabled. Otherwise, if
both B<--verbose> and B<--quiet> is used (and B<--debug> is not used),
the last of these two options take effect.
This option overrides the B variable in the configuration file.
In the configuration file, this option is enabled by using B
variable. The B and B variables may not both appear
in the config file.
=item B<-V>, B<--version>
Display lintian version number and exit.
=item B<--print-version>
Print unadorned version number and exit.
=back
Behaviour options for B.
=over 4
=item B<--allow-root>
Override lintian's warning when it is run with superuser privileges.
=item B<--color> (never|always|auto|html)
Whether to colorize tags in lintian output based on their severity.
The default is "never", which never uses color. "always" will always
use color, "auto" will use color only if the output is going to a
terminal, and "html" will use HTML EspanE tags with a color style
attribute (instead of ANSI color escape sequences).
This option overrides the B variable in the configuration file.
=item B<--default-display-level>
Reset the current display level to the default. This option behaves
exactly like passing B<-L> ">=important" B<-L> "+>=normal/possible"
B<-L> "+minor/certain" to lintian.
One use for this option is to override only the display settings in
the config file.
=item B<--display-source> X
Only display tags from the source X (e.g. the Policy Manual or the
Developer Reference). This option can be used multiple times to
add additional sources. Example sources are "policy" or "devref"
being the Policy Manual and the Developer Reference (respectively).
The entire list of sources can be found in
I<$LINTIAN_ROOT/data/output/manual-references>
=item B<-E>, B<--display-experimental>, B<--no-display-experimental>
Control whether to display experimental ("X:") tags. They are
normally suppressed.
If a tag is marked experimental, this means that the code that
generates this message is not as well tested as the rest of Lintian,
and might still give surprising results. Feel free to ignore
Experimental messages that do not seem to make sense, though of course
bug reports are always welcome (particularly if they include fixes).
These options overrides the B variable in the
configuration file.
=item B<--fail-on-warnings>
By default, B exits with 0 status if only warnings were
found. If this flag is given, exit with a status of 1 if either
warnings or errors are found.
This option overrides the B variable in the
configuration file.
=item B<-i>, B<--info>
Print explanatory information about each problem discovered in
addition to the lintian error tags. To print a long tag description
without running lintian, see L.
This option overrides B variable in the configuration file.
=item B<-I>, B<--display-info>
Display informational ("I:") tags as well. They are normally
suppressed. (This is equivalent to B<-L> ">=wishlist").
This option overrides the B variable in the
configuration file.
Note: B and B may not both appear in the
configuration file.
=item B<--keep-lab>
By default, temporary labs will be removed after lintian is finished.
Specifying this options will leave the lab behind, which might be
useful for debugging purposes. You can find out where the temporary
lab is located by running lintian with the B<--verbose> option.
For static (non-temporary) labs this option causes Lintian to skip
the automatic clean up of some collections.
=item B<-L> [+|-|=][>=|>|<|<=][S|C|S/C], B<--display-level> [+|-|=][>=|>|<|<=][S|C|S/C]
Fine-grained selection of tags to be displayed. It is possible to add,
remove or set the levels to display, specifying a severity (S:
serious, important, normal, minor, wishlist, pedantic), a certainty
(C: certain, possible, wild-guess), or both (S/C). The default
settings are equivalent to B<-L> ">=important" B<-L>
"+>=normal/possible" B<-L> "+minor/certain").
This option overrides the B variable in the
configuration file. The value of the B in
configuration file should be space separated entries in the same
format as passed via command-line.
Note: B may not be used with B or B
in the configuration file.
=item B<-o>, B<--no-override>
Don't use the overrides file.
This option overrides the B variable in the configuration
file.
=item B<--pedantic>
Display pedantic ("P:") tags as well. They are normally suppressed.
(This is equivalent to B<-L> "+=pedantic").
Pedantic tags are Lintian at its most pickiest and include checks for
particular Debian packaging styles and checks that many people
disagree with. Expect false positives and Lintian tags that you don't
consider useful if you use this option. Adding overrides for pedantic
tags is probably not worth the effort.
This option overrides the B variable in the configuration
file.
Note: B and B may not both appear in the
configuration file.
=item B<--profile> vendor[/prof]
Use the profile from vendor (or the profile with that name). If the
profile name does not contain a slash, the default profile for than
vendor is chosen.
As an example, if you are on Ubuntu and want to use Lintian's Debian
checks, you can use:
--profile debian
Likewise, on a Debian machine you can use this to request the Ubuntu
checks.
If the token I<{VENDOR}> appears in the profile name, B will
substitute the token with a vendor name to find the profile.
B uses L to determine the best vendor to use
(the closer to the current vendor, the better). This is mostly useful
for people implementing their own checks on top of Lintian.
If not specified, the default value is I<{VENDOR}/main>.
Please Refer to the Lintian User Manual for the full documentation of
profiles.
=item B<--show-overrides>
Output tags that have been overridden. The related override comments
will also be printed (unless --quiet is used). Please refer to the
Lintian User Manual for the documentation on how lintian relates
comments to a given override.
This option overrides the B variable in the
configuration file.
=item B<--suppress-tags> tag1,tag2,...
Suppress the listed tags. They will not be reported if they occur and
will not affect the exit status of Lintian. This option can be given
multiple times and can be mixed with B<--suppress-tags-from-file>.
This option can be used together with B<--dont-check-part> ("Not those
checks nor these tags") and B<--check-part> ("Only those checks, but
not these tags (from those checks)") to further reduce the selection of
tags.
When used with B<--tags>, this option is mostly ignored.
=item B<--suppress-tags-from-file> file
Suppress all tags listed in the given file. Blank lines and lines
beginning with # are ignored. All other lines are taken to be tag
names or comma-separated lists of tag names to suppress. The
suppressed tags will not be reported if they occur and will not affect
the exit status of Lintian.
Tags parsed from the file will be handled as if they had been given to
the B<--suppress-tags> option (e.g. ignored if B<--tags> is used).
=item B<-U> info1,info2,..., B<--unpack-info> info1,info2,...
Collect information info1, info2, etc. even if these are not required
by the checks. Collections requested by this option are also not
auto-removed (in this run).
This option is mostly useful for debugging or special purpose setups.
It is allowed to give this option more than once. The following
two lines of arguments are semantically equivalent:
-U info1 -U info2
-U info1,info2
=back
Configuration options:
=over 4
=item B<--cfg> configfile
Read the configuration from configfile rather than the default
locations. This option overrides the B environment
variable.
=item B<--no-cfg>
Do not read any configuration file. This option overrides the
B<--cfg> above.
=item B<--ignore-lintian-env>
Ignore all environment variables starting with I.
This option is mostly useful for applications running B for
checking packages and do not want the invoking user to affect the
result (by setting LINTIAN_PROFILE etc.).
Note it does I cause B to ignore the entire environment
like I or I. The latter can affect the default
profile (or "{VENDOR}" token for B<--profile>).
Should usually be combined with B<--no-user-dirs> (or unsetting $HOME
and all I variables).
=item B<--include-dir> dir
Use dir as an additional "LINTIAN_ROOT". The directory is expected
have a similar layout to the LINTIAN_ROOT (if it exists), but does not
need to be a full self-contained root.
B will check this directory for (additional) profiles, data
files, support libraries and checks. The latter two implies that
Lintian may attempt to I from this directory.
This option may appear more than once; each time adding an additional
directory. Directories are searched in the order they appear on the
command line.
The additional directories will be checked I the user
directories (though see B<--no-user-dirs>) and I the core
LINTIAN_ROOT.
B: This option should be the very first if given.
=item B<-j> [X], B<--jobs>[=X]
Set the limit for how many unpacking jobs Lintian will run in
parallel. If X is not given, Lintian will not limit the number of
unpacking jobs run that can run in parallel.
This option overrides the B variable in the configuration file.
By default Lintian will use I to determine a reasonable default
(or 2, if the nproc fails).
=item B<--lab> labdir
Use labdir as the permanent laboratory. This is where Lintian keeps
information about the packages it checks. This option overrides the
B environment variable and the configuration file entry
of the same name.
=item B<--root> rootdir
Deprecated in 2.5.18 and will be removed in a later release.
This option used to control what directory was used as the
B. It's primary purpose was to use Lintian directly
from a source tree. However, since 2.5.18 Lintian has logic for
automatically configuring itself without any assistance making this
option largely obsolete. Note if passed, then the chosen root dir
must match the actual LINTIAN_ROOT used by Lintian.
This option implies B<--no-user-dirs> for backwards compatbility with
previous versions of Lintian.
=item B<--user-dirs>, B<--no-user-dirs>
By default, B will check I<$HOME> and I for files
supplied by the user or the local sysadmin (e.g. config files and
profiles). This default can be disabled (and re-enabled) by using
B<--no-user-dirs> (and B<--user-dirs>, respectively).
These options will I affect the inclusion of LINTIAN_ROOT, which
is always included.
These option can appear multiple times, in which case the last of them
to appear determines the result.
Note that if the intention is only to disable the user's I<$HOME>,
then unsetting I<$HOME> and I may suffice. Alternatively,
I can be "re-added" by using I<--include-dir> (caveat:
I will be ignored by this).
If the intention is to avoid (unintentional) side-effects from the
calling user, then this option could be combined with
B<--ignore-lintian-env>.
If for some reason B<--no-user-dirs> cannot be used, then consider
unsetting I<$HOME> and all the I<$XDG_*> variables (not just the
I<$XDG_*_HOME> ones).
B: This option should be the very first if given.
=back
Package selection options:
=over 4
=item B<-a>, B<--all>
Check all packages in the laboratory.
Note: If B<--binary>, B<--udeb> or B<--source> is specified, then only
packages of that type is considered.
=item B<-b>, B<--binary>
The lab-queries listed on the command line are by default binary
packages.
With B<--all> this means check all binary packages in the lab.
=item B<--packages-from-file> X
Process the packages listed in X. If the line starts with "!query:",
then the rest of that line is processed as a lab query (see L).
Otherwise the line is read as the path to a file to process (all
whitespace is included!).
If X is "-", Lintian will read the packages from STDIN.
=item B<-s>, B<--source>
The lab-queries listed on the command line are by default source
packages.
With B<--all> this means check all source packages in the lab.
The following packages listed on the command line are source packages.
=item B<--udeb>
The lab-queries listed on the command line are by default udeb
packages.
With B<--all> this means check all udeb packages in the lab.
=back
=head1 CHECKS
@CHECKS@
=head1 COLLECTION
@COLLECTION@
=head1 FILES
Lintian looks for its configuration file in the following locations:
=over 4
=item * The argument given to B<--cfg>
=item * I<$LINTIAN_CFG>
=item * I<$XDG_CONFIG_HOME/lintian/lintianrc>
=item * I<$HOME/.lintianrc>
Deprecated in Lintian/2.5.12 and newer (use the XDG based variant
above)
=item * I
Where XGD_DIR is a directories listed in I<$XDG_CONFIG_DIRS> (or
I if I<$XDG_CONFIG_DIRS> is unset).
=item * I
Deprecated in Lintian/2.5.12 and newer (use the XDG based variant
above)
=back
Lintian uses the following directories:
=over 4
=item I
If no lab location is specified via the LINTIAN_LAB environment
variable, configuration, or the B<--lab> command-line option, lintian
defaults to creating a temporary lab directory in I. To change
the directory used, set the TMPDIR environment variable to a suitable
directory. TMPDIR can be set in the configuration file.
=item I
Scripts that check aspects of a package.
=item I
Scripts that collect information about a package and store it for use
by the check scripts.
=item I
Supporting data used by Lintian checks and for output formatting.
=item I
Utility scripts used by the other lintian scripts.
=back
For binary packages, Lintian looks for overrides in a file named
IpackageE> inside the binary
package, where IpackageE> is the name of the binary
package. For source packages, Lintian looks for overrides in
I and then in
I if the first file is not found.
The first path is preferred. See the Lintian User's Manual for the
syntax of overrides.
=head1 CONFIGURATION FILE
The configuration file can be used to specify default values for some
options. The general format is:
option = value
All whitespace adjacent to the "=" sign as well as leading and
trailing whitespace is ignored. However whitespace within the
value is respected, as demonstrated by this example:
# Parsed as "opt1" with value "val1"
opt1 = val1
# Parsed as "opt2" with value "val2.1 val2.2 val2.3"
opt2 = val2.1 val2.2 val2.3
Unless otherwise specified, no option may appear more than once.
Lintian will ignore empty lines or lines starting with the
B<#>-character.
Generally options will be the long form of the command-line option
without the leading dashes. There some exceptions (such as
--profile), where Lintian uses the same name as the environment
variable.
Lintian only allows a subset of the options specified in the
configuration file; please refer to the individual options in
L.
In the configuration file, all options listed must have a value, even
if they do not accept a value on command line (e.g. --pedantic). The
values "yes", "y", "1", or "true" will enable such a option and "no",
"n", "0" or "false" will disable it. Prior to the 2.5.2 release,
these values were case sensitive.
For other options, they generally take the same values as they do on
the command line. Though some options allow a slightly different
format (e.g. --display-level). These exceptions are explained for the
relevant options in L.
Beyond command line options, it is also allowed to specify the
environment variable "TMPDIR" in the configuration file.
A sample configuration file could look like:
# Sample configuration file for lintian
#
# Set the default profile (--profile)
LINTIAN_PROFILE = debian
# Set the default TMPDIR for lintian to /var/tmp/lintian
# - useful if /tmp is tmpfs with "limited" size.
TMPDIR = /var/tmp/lintian/
# Show info (I:) tags by default (--display-info)
# NB: this cannot be used with display-level
display-info=yes
# Ignore all overrides (--no-override)
# NB: called "override" in the config file
# and has inverted value!
override = no
# Automatically determine if color should be used
color = auto
=head1 EXIT STATUS
=over 4
=item B<0>
No policy violations or major errors detected.
(There may have been warnings, though.)
=item B<1>
Policy violations or major errors detected.
=item B<2>
Lintian run-time error. An error message is sent to stderr.
=back
=head1 LAB QUERY
A lab query can be used to refer to a (set of) package(s) in the
Lintian Laboratory. The general format of a query is:
[type:]package[/version[/arch]]
Where:
=over 4
=item type
This is the type of the package and (if present) must be one of "ALL",
"GROUP", "binary", "udeb", "source" or "changes". This is case
sensitive.
If omitted this defaults to "ALL" unless another default has been
specified (see B<--binary>, B<--udeb> or B<--source>). The pseudo
type "ALL" acts as a wildcard for any real package type.
The special type "GROUP" can be used to match all packages related to
a given source package. For more info, please see L
below.
=item package
This is the name of the package. This is mandatory and must match
exactly.
=item version
This is the version of the package, if left out (or if it is "_") then
any version will do. Otherwise the version must match exactly.
=item arch
This is the architecture of the package, if left out (or it is "_")
then any architecture will do. Otherwise the architecture must match
exactly.
Note: This is I ignored when matching against source
packages or when type is "GROUP".
Note: For changes packages, this must match the contents of the
architecture field in the changes. This field may contain a space
(e.g. "source all") and therefore may also need proper shell escape.
=back
=head2 Group query
A group query can be used to (re-)process all packages in a given
group. The I and I part will be used to look up one
or more source packages. The binaries, udebs and changes files for
each matching source package will also be activated.
=head1 CHECKING LAST BUILD
When run in an unpacked package dir (with no package selection
arguments), Lintian will use I to determine the
source and version of the package. Lintian will then attempt to find
a matching I<.changes> file for this source and version combination.
Lintian will (in order) search the following directories:
=over 4
=item ..
Used by dpkg-buildpackage(1).
=item ../build-area
Used by svn-buildpackage(1).
=item /var/cache/pbuilder/result
Used by pbuilder(1) and cowbuilder(1).
=back
In each directory, Lintian will attempt to find a I<.changes> file
using the following values as architecture (in order):
=over 4
=item I<$DEB_BUILD_ARCH> (or I)
The environment variable DEB_BUILD_ARCH (if not set, "dpkg
--print-architecture" will be used instead)
=item I<$DEB_HOST_ARCH>
The environment variable DEB_HOST_ARCH.
=item I
If dpkg(1) appears to support multi-arch, then any architecture listed
by "dpkg --print-foreign-architectures" will be used (in the order
returned by dpkg).
=item I
Pseudo architecture used by mergechanges(1).
=item I
Used when building architecture indep packages only (e.g
dpkg-buildpackage -A).
=item I
Used for "source only" builds (e.g. dpkg-buildpackage -S).
=back
If a I<.changes> file matches any combination above exists, Lintian
will process the first match as if you had passed it per command line.
If no I<.changes> file can be found, Lintian will print a list of attempted
locations on STDERR and exit 0.
=head1 EXAMPLES
=over 4
=item B<$ lintian foo.changes>
Check the changes file itself and any (binary, udeb or source) package
listed in it.
=item B<$ lintian foo.deb>
Check binary package foo given by foo.deb.
=item B<$ lintian foo.dsc>
Check source package foo given by foo.dsc.
=item B<$ lintian foo.dsc -L +minor/possible>
Check source package foo given by foo.dsc, including minor/possible
tags.
=item B<$ lintian -i foo.changes>
Check the changes file and, if listed, the source and binary package
of the upload. The output will contain detailed information about the
reported tags.
=item B<$ lintian -c --binary foo>
Check the binary package foo in the Lintian laboratory.
=item B<$ lintian -C cpy --source foo>
Run the copyright checks on source package foo. The package foo must
be in the Lintian laboratory.
=item B<$ lintian -u foo -U unpacked>
Unpack all packages named foo in the Lintian laboratory.
=item B<$ lintian -r foo>
Remove all packages named foo from the Lintian laboratory.
=item B<$ lintian>
Assuming I exists, look for a changes file for the
source in the parent dir. Otherwise, print usage information and
exit.
=back
=head1 BUGS
Lintian does not have any locking mechanisms yet. (Running several
Lintian processes on the same laboratory simultaneously is likely to fail
or corrupt the laboratory.)
If you discover any other bugs in lintian, please contact the authors.
=head1 SEE ALSO
L, Lintian User Manual
(file:/usr/share/doc/lintian/lintian.html/index.html)
Packaging tools: L, L,
L.
=head1 AUTHORS
Niels Thykier
Richard Braakman
Christian Schwarz
Please use the email address for
Lintian related comments.
=cut
lintian-2.5.22ubuntu1/man/lintian-info.pod 0000664 0000000 0000000 00000007372 12310413206 015323 0 ustar # Copyright 2010 Niels Thykier
# - based on the work Richard Braakman and Christian
# Schwarz (copyrighted 1998).
#
# This manual page is free software. It is distributed under the
# terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This manual page is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this manual page; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
# USA
#
=head1 NAME
lintian-info - give detailed information about Lintian's error tags
=head1 SYNOPSIS
B [I...]
B B<--tags> I ...
=head1 DESCRIPTION
The B command parses the output of the B
command and gives verbose information about the listed Lintian error
tags, parses a Lintian override file and gives verbose information
about the tags included, or (if given the B<-t> or B<--tags> option)
explains a given tag or tags.
If no log-file is specified on the command line, this command expects
its input on stdin. Thus, the output of B can either be piped
through B or a log file produced by B can be
processed with this command. (Note, though, that the B
command has a command line option B<-i> to display the same results as
B, so you will not normally need to pipe the output of
B into this command.)
=head1 OPTIONS
=over 4
=item B<-a>, B<--annotate>
Read from standard input or any files specified on the command line
and search the input for lines formatted like Lintian override
entries. For each one that was found, display verbose information
about that tag.
=item B<-h>, B<--help>
Display usage information and exit.
=item B<--include-dir> dir
Use dir as an additional "Lintian root". The directory is expected
have a similar layout to the LINTIAN_ROOT (if it exists), but does not
need to be a full self-contained root.
Unlike B, B will I load any code from
these additional directories.
This option may appear more than once; each time adding an additional
directory.
B: This option should be the very first if given.
=item B<--profile> prof
Use the severities from the vendor profile prof when displaying tags.
If the profile name does not contain a slash, the default profile for
than vendor is chosen.
If not specified, B loads the best profile for the
current vendor.
Please Refer to the Lintian User Manual for the full documentation of
profiles.
=item B<-t>, B<--tags>
Rather than treating them as log file names, treat any command-line
options as tag names and display the descriptions of each tag.
=item B<--user-dirs>, B<--no-user-dirs>
By default, B will check I<$HOME> and I for files
supplied by the user or the local sysadmin (e.g. profiles). This
default can be disabled (and re-enabled) by using B<--no-user-dirs>
(and B<--user-dirs>, respectively).
These option can appear multiple times, in which case the of them
to appear determines the result.
B: This option should be the very first if given.
=back
=head1 EXIT STATUS
If B<-t> or B<--tags> was given and one or more of the tags specified
were unknown, this command returns the exit code 1. Otherwise, it
always returns with exit code 0.
=head1 SEE ALSO
L
=head1 AUTHORS
Niels Thykier
Richard Braakman
Christian Schwarz
=cut
lintian-2.5.22ubuntu1/data/ 0000775 0000000 0000000 00000000000 12310413206 012355 5 ustar lintian-2.5.22ubuntu1/data/cruft/ 0000775 0000000 0000000 00000000000 12313507507 013513 5 ustar lintian-2.5.22ubuntu1/data/cruft/missing-dir-search-path 0000664 0000000 0000000 00000000514 12313507507 020060 0 ustar # where we could find missing source leading / means relative to root package
# $dirname will be replaced by path of current
# likely in current dir
./
# for binary object build by libtools
../
# libtool
/.libs/
/.libs/$dirname/
# for missing source set in debian
/debian/
/debian/missing-sources/
/debian/missing-sources/$dirname
lintian-2.5.22ubuntu1/data/cruft/non-distributable-files 0000664 0000000 0000000 00000001111 12310413206 020142 0 ustar # this file are forbidden in main and contrib
# format is
# md5sum ~~ sha1 ~~ sha256 ~~ current name ~~ reason ~~ official reference
#
# current name is the usual name of the file
# reason is human description of the problem
# official reference is a link to the license/official source
#
# Please sort by md5sum
2ab371cb4a67747aaa7835ebb22cb0d5 ~~ a396330a335b055c5b8cb81299921c356286e6a7 ~~ 8e058aa0b336cd2b0bd0dc14db9e7d225ca34d3324652e2ea06eb48462f020f1 ~~ data-forbidden-lintian-files ~~ This is part of lintian test suite, used for testing this tag ~~ http://lintian.debian.org
lintian-2.5.22ubuntu1/data/cruft/non-free-license 0000664 0000000 0000000 00000005346 12310413206 016564 0 ustar # first field is tag
# second field is a list of keyword in lower case separated by &&
# third field is a lower case sentence to match the license. Notes that space are normalized before and formating removed
# fourth field is a regex to use to match the license, use lower case and [ ] for space.
# 5th field is a regex to use for the first block (by default equal to 4th field)
# 6th field is a function to call if the field 2th to 5th match.
# json license
license-problem-json-evil ~~ software && evil && good ~~ software shall be used for good ~~ software [ ] shall [ ] be [ ] used [ ] for [ ] good [ ]? ,? [ ]? not [ ] evil
# non free RFC old version
license-problem-non-free-RFC ~~ document && purpose && translate && language ~~ this document itself may not be modified in any way ~~ this [ ] document [ ] itself [ ] may [ ] not [ ] be [ ] modified [ ] in [ ] any [ ] way [ ]?, [ ]? such [ ] as [ ] by [ ] removing [ ] the [ ] copyright [ ] notice [ ] or [ ] references [ ] to [ ] .{0,256} [ ]? except [ ] as [ ] needed [ ] for [ ] the [ ] purpose [ ] of [ ] developing [ ] .{0,128} [ ]? in [ ] which [ ] case [ ] the [ ] procedures [ ] for [ ] copyrights [ ] defined [ ] in [ ] the [ ] .{0,128} [ ]? process [ ] must [ ] be [ ] followed[ ]?,[ ]? or [ ] as [ ] required [ ] to [ ] translate [ ] it [ ] into [ ] languages [ ]
license-problem-non-free-RFC-BCP78 ~~ license && document && bcp && restriction ~~ bcp 78 ~~ this [ ] document [ ] is [ ] subject [ ] to [ ] (?:the [ ] rights [ ]?, [ ] licenses [ ] and [ ]restrictions [ ] contained [ ] in [ ])? bcp [ ] 78
# check GFDL block - The ".{0,1024}"-part in the regex
# will contain the "no invariants etc." part if
# it is a good use of the license. We include it
# here to ensure that we do not emit a false positive
# if the "redeeming" part is in the next block
# keyword document is here in order to benefit for other license keyword and a shortcut for documentation
license-problem-gfdl-invariants ~~ license && document && gnu && copy && documentation && included ~~ gnu free documentation license ~~ (?'rawcontextbefore'(?:(?:(?!a [ ] copy [ ] of [ ] the [ ] license [ ] is).){1024}|(?:[ ] copy [ ] of [ ] the [ ] license [ ] is.{0,1024}?))) gnu [ ] free [ ] documentation [ ] license (?'rawgfdlsections'(?:(?!gnu [ ] free [ ] documentation [ ] license).){0,1024}?) a [ ] copy [ ] of [ ] the [ ] license [ ] is ~~ (?'rawcontextbefore'(?:(?:(?!a [ ] copy [ ] of [ ] the [ ] license [ ] is).){1024}|\A(?:(?!a [ ] copy [ ] of [ ] the [ ] license [ ] is).){0,1024}|(?:[ ] copy [ ] of [ ] the [ ] license [ ] is.{0,1024}?))) gnu [ ] free [ ] documentation [ ] license (?'rawgfdlsections'(?:(?!gnu [ ] free [ ] documentation [ ] license).){0,1024}?) a [ ] copy [ ] of [ ] the [ ] license [ ] is ~~ _check_gfdl_license_problem lintian-2.5.22ubuntu1/data/cruft/non-free-files 0000664 0000000 0000000 00000146310 12310413206 016241 0 ustar # this file are forbidden in main and contrib
# format is
# md5sum ~~ sha1 ~~ sha256 ~~ current name ~~ reason ~~ official reference
#
# current name is the usual name of the file
# reason is human description of the problem
# official reference is a link to the license/official source
#
# Please sort by md5sum
02e79d9d2fc3a5a9ee6ab5c7744d64a0 ~~ afc4ff937145189043154437750c8bae0bb43f74 ~~ 7327d6bf39bd5048ddffff7563175dc3a465c7553f51bcbad153a69eccf504ed ~~ valid-html20-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
034d80867a2d880134d143e5b457a138 ~~ 7aacd6575cceb6d161cabbcfa04b9f7ae604ca6e ~~ a99ea17b0ed87822455b0c535bebf15f39667243a7a781a99a615092afef8f69 ~~ valid-xml10-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
03c218e88b8627bfe6723cee63227f44 ~~ db19e44adba19eebf4ea04bf0d8653db72bb8da2 ~~ 030810662b02f201f0b903e8064b559c1fefc5f88f280cd5ed44264182786c68 ~~ valid-html401-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
055460df9ab3c8aadd3330bd30805f11 ~~ b54b5fa32a884b4297b2343efdc745d0755cc7d1 ~~ f65941f9487c0a0a3b7445996ecbbd24466d7ae76ea2a597ced55f438fa63838 ~~ trebucbd.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
068de8c0b1d9926c0423a409c0adf881 ~~ 2a33257d868d5d23fccb71b57e21d37c897adf7c ~~ c7d287eac2af4840cec9a2b61adfbc6df18da82d63f5a2431fa07e0b48078f41 ~~ valid-svg11.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
0a83edb1fdc0469f39673613144b8687 ~~ 072bee098c55545f56f693eb3ab3f3eac8912f32 ~~ 43f695a032a284c8c05d773f0bfce5639dc1e6127d87a5d1d45ff178f7efb692 ~~ valid-xhtmlbasic10-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
0c2a0b4b6f069984e510eddb34a8e462 ~~ 227a6d4a20fd807c1db4aac121e75c47a9448b2a ~~ 06a80f90aaf9b0b4b4446a6d5b20d8e59cd328c5cf7202f7e379988f82e4b93f ~~ valid-css2-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
0e14f7af10984e48a51886b8b9c8e3ee ~~ 95e7716cdf9ac4a07eabe09bb4db83db722e5622 ~~ cbf8f3f82a699c22a7e5ece708011a87ceeae76ce3ada9b33415c9144c237fef ~~ valid-html32-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
0ed79958c3b02d6d514dc331b66953c3 ~~ cf33e3d5d7d1c198382fcf64a3b20db05eb6c968 ~~ 308359e53bcb253dca22232084c93427bb1a52c8dd1c9c9e71827356634c2f5e ~~ valid-css2-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
0f18e38686cb819de4b50021b324d590 ~~ e8f1b12529d336cdfdea1be086a6f81c3776049e ~~ 65a1cb69a69cac252043b01fba3652906b605cebcc75e2c54d02f5eeb6f2b75c ~~ valid-svgtiny12-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
10b59a0b3f9c1982013c87c81580f0a0 ~~ ec2e0bf3eada4eb0513f539012a56b92da77601c ~~ 24fc8707ea4ec14e128f747d24bf9d0e2f38b02d54cddceb69448cf0836d16d6 ~~ valid-svg10-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
11bbe23913450b19a5711a9c1f7c2228 ~~ bc686e10dfaff59ff9e1bbf008e97e4fa2290e03 ~~ faab2771380875d54f6188344da47ac2619c0e16d18b61700c1037493a837697 ~~ definitive-guide.png ~~ Non free book cover. ~~ http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=24735&sid=00d5a91304948ce71a38e695d225e122
127423d6da6ddd673915edcd61264bb4 ~~ 65399bc8e392478a2c7e899b061e6377162bf7da ~~ 2cfd9f2d1e1c9be94f077439a54b31d304b39520d38f5b9eace983965baecc98 ~~ valid-css1-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
127a486e3e554209d2551a5aa76d8927 ~~ 74518a5e53df261767ef3a385aec12f682027071 ~~ 41a824318d6027205ed5adb4fe157bbd4aee6ac4f5e8d1fad0b0fa1a28aa0bec ~~ valid-css2-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
147b1c61b0cf362fe9c6f69fd2ae012e ~~ 43dd70fdf999e9e87683827cea64ea45fc124127 ~~ 2e939f5626079dde3c002482a5c0cecebd5e7dc6c3fc8acec4cf9b05cc1ffa44 ~~ valid-xhtmlbasic10.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
14e7ebd754a6815c621fe3077f85b17f ~~ 607a24b9f392e2531b8d94eaf62ef91593f46da4 ~~ f0b2eadb29a9d9c63122fed05bbe52750d8605a81c8bc85fe1cae9949c35d82b ~~ valid-html40-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
163d7d71acfc0ca7db3b733fa310a276 ~~ d5e6fc3807300636574f099f61daaddf5fb5d6f5 ~~ 1cf896df22f56f5b83d9cba17f8400f0cbd8638ddddc6d130f47d73982c33971 ~~ valid-css2.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
167e27add66e9e8eb0d28a1235dd3bda ~~ 74941cc95734772f8b17aeec33e9a116f94a26ae ~~ f3f6b09855b6700977e214aab5eb9e5be6813976a24f894bd7766e92c732fbe1 ~~ couri.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
17e6af61533aad07ffd56119e995f6a1 ~~ 53fd2d33ce8d5639dd0c409e5b41d28f1e6d341d ~~ b4ae8f92fe5c2d145b8890b20c008eb21632e7084b0b8fde90eb107adec35e99 ~~ valid-html32-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
18110f421269eba9191127a2b9c40778 ~~ eb3e1c014f7c33932cd06908524cf7c44b29b8f2 ~~ cf4f78a94a207138ed4b634b3fcecc9922fc6fa94c4bb42ac3f77dbfe689e347 ~~ valid-css1.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
181c48c6bce494b7c97de93b3ac2359a ~~ 95e6a7b2d58c15c312ec36ed6abe096b13a7a56e ~~ 01accbd90451af33dc3b0cf935278af3605624ede3bac88becd1dd328d53d8e8 ~~ valid-svgtiny12-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
1835cc9ea99d41071c627d23a7cf5a58 ~~ e0550b80f7241c0c9c819c7ae4263769ca9c4f45 ~~ 602f0412c03828aae92741d0ac5fdc783ef9be79d7d99ed0d4c02a3ea6396c14 ~~ valid-html20-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
18d86628c801d531df9703ac50b3db3f ~~ 0ea79af20e41291d9e19563e056511a8ed65c093 ~~ f8589f6740e6296d5fac5e40c25d41ee4fd81e545fbc702a880f5031636ae230 ~~ valid-html40.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
1a56b45a66b07b4c576d5ead048ed992 ~~ bc1382a14358f747cbd3ff54676950231f67c95a ~~ 10d099c88521b1b9e380b7690cbe47b54bb19396ca515358cfdc15ac249e2f5d ~~ webdings.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
1d3fda2edb4a89ab60a23c5f7c7d81dd ~~ 9eaea0911d89d63e39e95f2e2116eaec7e0bb91e ~~ 2b3aa1645779a9e634744faf9b01e9102b0c9b88fd6deced7934df86b949af7e ~~ sRGB.icm ~~ This file may not be distributed without fee if modified. ~~ http://bugs.debian.org/657281
1e30b3b20c8f0635122df48988ef2c2e ~~ d520a305379a359cb8069efa81eed4d18d3cab5c ~~ e3ba6e0ece6799e84a5e8224bb5d683c6897ceca5ec2c58fffa8818be9144bda ~~ valid-xhtmlbasic10-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
1e4e5d1975bdf4a5c648afbf8872fa13 ~~ f6bafcca21153f02b4449fc8949cdd5786bb2992 ~~ 1523f19bda6acca42c47c50da719a12dd34f85cc2606e6a5af15a7728b377b60 ~~ georgiai.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
209da8a9016a12eb5d9d1a7ee34638a2 ~~ 0ed3144eb20cc54a73837f9eb0c9672693b2e9e5 ~~ 260e87368b06066863e853e2fda2551cb9b3739ea3d9892a4d475e6e1af4590e ~~ valid-svgtiny11-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
20f23317e90516cbb7d38bd53b3d1c5b ~~ 9c5be4c1f151257798602aa74a7937dcead5db1f ~~ 6715838c52f813f3821549d3f645db9a768bd6f3a43d8f85a89cb6875a546c61 ~~ cour.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
22bce04f537a28d2d3e64f73ad910351 ~~ f7d110da2eef2cdefa2ee8e66fbbad35b7998cf8 ~~ 464f143fa846f01adad267793c20bf075f78f71000cd1aa799c094d5fa22caf0 ~~ valid-html40-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
23f86f9f398de2043fc228cd7d8e7283 ~~ 576da542de411199ec69ba239317b44ff95348d4 ~~ df76b219e5c633f3e8ecc09dd214bf5a31c2a424c76553a283f8ac8620ff8891 ~~ valid-mathml20.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
24b3a293c865a2c265280f017fb24ba5 ~~ 3ac316b55334e70a6993ded91328682733c4d133 ~~ 91b59186656f52972531a11433c866fd56e62ec4e61e2621a2dba70c8f19a828 ~~ verdanai.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
24f5a9360a3d7b0483fa68240da1241a ~~ 1eec251f6da09ccea499fac8b263684590831d61 ~~ 37ae4813be539afea94d73ee075d5cd17140a042237f93a06a0b23f479862525 ~~ project-support.jpg ~~ Non free logo. ~~ http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=24735&sid=00d5a91304948ce71a38e695d225e122
25633f73d92a0646e733e50cf2cc3b07 ~~ d205d443f4431600378adaa92a29cc0396508919 ~~ 70ade233175a6a6675e4501461af9326e6f78b1ffdf787ca0da5ab0fc8c9cfd6 ~~ ariali.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
260fb0b39d93c57755234c30c44eca4e ~~ 883f3ad1314f80f65fb47a5a12d50ffb26d1b554 ~~ 4f438144260f3e0bed889de8b2aa0635b36cf38c9a9f16ed12d7ee1cbba15ce3 ~~ valid-css2-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
26ba1ba208c37e5417b5b74d331a644d ~~ 7085c8c0c9746aa718d81cf59a78642be1008487 ~~ 2814fc0c03847da8ad725052ead899ef44d2cfbf69044d02661dac1fa0a9a49d ~~ valid-svg10-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
274bffcbe48d0b1c1959f6a782fefd39 ~~ c36ae8c104cb08216a8a4016c07e45f9b064fae7 ~~ 1a30b0a4318affe15a4d6af381f39fa24215b6975f0d23c90b7b72d657055d03 ~~ valid-html20.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
288235a67dd5d01befc2ced6c00b2ca1 ~~ 499b7270c24af9eb236037457b40bb0924f69a4b ~~ 3d152f011c6fc65b2e693ba0b68e275083ff18e70174d8f88ce3efce7be5cee0 ~~ valid-svgtiny11-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
2c8b213e276a778c4b18a896b2002cd2 ~~ 0424bf00624e144a9c6a36553c119c9b55534808 ~~ 6b9ffdde47a95ea1024117301b77401eb61af63abf7c016c615ffc0b021c6cdb ~~ valid-svg10-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
2ef0a3da342c98067b57d3285f26c02b ~~ 11c90411dd0340cc7c83ee43554b9e4b780a7565 ~~ 40370d10ee90e1ef6f238729e1aed7c63dc8da35ac062bd4599cb8267bd8ab0c ~~ valid-xml10-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
2ef216df211bd28924637ab82597c1e9 ~~ 7bb393411d0ea3ec77c8c163d5131c4d3f839e6b ~~ a51e388f1261ec2bf1fa73496d85454244e99d18cf1636a678446d6f1f59d168 ~~ valid-css1-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
2f56157e02756a47a0f2b1520695011c ~~ 244c6b7f5c90368e9538748eb9804323e3048962 ~~ 98c450a906ffe2b2dc515f59fe265a1fe88aff5efc922ee77f81bd4c6fa47a13 ~~ valid-xhtml20.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
2fa45221a62d6b5cb9f91ce6a49ab2a2 ~~ 03ce32f2fd5b6563f357d0627af7424eefc78e7a ~~ a18ce0b6fc336bb58148672fe82ae1c9b4b3c4dc7a5e39fc10a2122baa2d5b98 ~~ valid-svgtiny11.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
2fe9ed8884ea91fb8df5b775b45e9dd7 ~~ b4aad64d5b79007f8addba8e8b4805c0075d2fa4 ~~ 42813bca4bf2c612778f22763290c93579e5b169bb28fdfb0a6abbf257622c48 ~~ valid-svg11-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
3019df8c130fc39c949a705266365d34 ~~ b773a346ab457e1c3192437e2c30cdbce05cd02b ~~ 4675edd75bfa382dd4bbbc709593f3f769708df8a4a36e7f3906cd02be2054c2 ~~ valid-css1-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
320894f07fd8f448e5eee51f851c3572 ~~ 12a2f91e1f6c92eeeb75b85c018931bcc1a4a3f1 ~~ 88bb59de7991e0322b0e10a0005814dc44628a19e2cbf1e9474a7affcc2a1c1c ~~ valid-xhtml11-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
324dca8bc1f5c7d1cbfc21a6bf60959f ~~ f0389704f49b34511259a3b7c893a9bc0352ed0e ~~ 65d81ab2b1a084f3fb115c46c8150a2afc4e89ef3e78a0c467339ed4e7971fed ~~ valid-xhtml20-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
34cd8fd9e4fae9f075d4c9a2c971d065 ~~ 0d99c9d151db525c20b8209b9f0ee1ce812a961c ~~ 4044aa6b5bebbc36980206b45b0aaaaa5681552a48bcadb41746d5d1d71fd7b4 ~~ arialbd.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
356b779a06c228895d3228fc1ee1355c ~~ e6ccaa38bf5eb9a3c4f1c667d414eda8358c8d7c ~~ 298586eced80f0f99adb3e5252a16b64bcc11aa833e50772be1ffda25c6e8925 ~~ id3v22-tda.mp3 ~~ According to tag (COMMENT="ripped by [...]"). ~~ http://bugs.debian.org/736203
36317f85acf46c21da79de350c28d28d ~~ e7a6e90d4de5ec35b49d6a3cc81caf9b43f6bc80 ~~ 1509709af9da7a54ff83a90c311ed354bbfb8caf85843ef35f82e0807f1ad785 ~~ valid-xhtml20-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
37082bc60cf6a5af10fdc5fcdf905b29 ~~ b561161b6f15ebc09cc14a14669e32a8cdd7624c ~~ a3de696410c388a3df2e68520cc596d64b4b14954c87d2713aa10a49bec46e2f ~~ valid-html40-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
37153ab647107018620cc415fdf5837c ~~ 08cd698e02907eed5a04e75a36b266ba5a9ed741 ~~ 22ace033995dc54b0f3288ac6b5e438d8b9d46de7daf6806cb8cc8f1cb0f1d6f ~~ valid-xhtml20-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
378737887fff3128b99884883b11ced7 ~~ 233d467e1340fa7c6fe020c9234687d59a526c97 ~~ d1da5c100ace9d29f2a9a1e73d1e63daac570e0d280eebcc1008168871b7bc54 ~~ valid-svgtiny11.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
39cdcac91b02b0c0db457f6920c6acd9 ~~ 85236c5ee9bb6ef3009be77f8adcfbb0b609f9df ~~ 213dbcd8ee2057af7db0f323bc5e3d77707d785a2a527e31d9ac7cb7548fa4c8 ~~ valid-html32.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
39f24df117c3ced49f129aa8e4a26295 ~~ 93428cd89c1041e65a358f7acdb2f2bbef96a120 ~~ 8bf6ed6d7fa35b29f67efed4938d6c2f0e7147dca04efd5806be27d50081f3fd ~~ valid-xhtml11-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
3ba52ab1fa0cd726e7868e9c6673902c ~~ ba19d57e11bd674c1d8065e1736454dc0a051751 ~~ 96ed14949ca4b7392cff235b9c41d55c125382abbe0c0d3c2b9dd66897cae0cb ~~ verdana.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
3cf661cc8862886c1d280823da177661 ~~ 1c52ade48cd7a8f6f508474d6b1820ef616a01cd ~~ ff566480f8308ca2241131dd0a39f996dd29043b8ebe9781e090cc266b874d98 ~~ valid-css-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
3cfc9c924b87d933f57a51a03d4fa0f5 ~~ 1d21654b0e08f8bec7f7d7c5bb017a1b037b61fc ~~ e754da93ec799df34e9b1ab85df495caedbbd5fcf1896cf08fd8361588d39df1 ~~ valid-xhtml11.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
3e0823042b28b72908951240200ba290 ~~ 16de7da2d395230fdd0b844e340c6600f4e8c5e7 ~~ 2f84e29197b6a8332965213c874780220b8e30c5fa349741586252dcbdf181d5 ~~ valid-xhtml10-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
3e7043e8125f1c8998347310f2c315bc ~~ 49560b47dac944923a6c918c75f27fbe8a3054c5 ~~ dad7c04acb26e23dfe4780e79375ca193ddaf68409317e81577a30674668830e ~~ ariblk.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
3fbdc9eeecb5a8613277be69f0383f39 ~~ cb9987c1518b7d08466ef4f0ab22fe4a7cd14494 ~~ 3c23d51873f2f04a2dde1aae54454664d8c69ba54747f74c2a3ed1fa1a4d5d45 ~~ valid-html40-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
411d33fd82f04daecbfb10020a69b7ea ~~ aa1dc8920929d523c3e2ea0c94acb118d24232f2 ~~ a03f47087b21cd41337b1e06bc1751f6cbd2b150349f6b304d821d4b5d01921f ~~ valid-css1.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
42dbc9acc2c7b33fd88e5a8bacdffb86 ~~ 6a77510bce4fdab639de128b417c5580974dafb4 ~~ 5917dc36c6274ea18055f876159d005df46f62eaa5e116b5e2c5e774fd2e8735 ~~ valid-html32-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
43f1ddf6ab8bc25fe4ff26f9765306b2 ~~ db90e922040a9b83743d610b7ae66490842989de ~~ 2c99faf273c1c176f3878febb0caeb87691fac1b8a22f66488581ee42b676a5f ~~ valid-xml10-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
4532a59f9263477d5bb292ec74f3ea53 ~~ 92b3b7a815fc8af2e1c0af2df0c70ced2434c258 ~~ b45bd555ada8525ae253d15816a2bdba103cd995058e16b37ae573840b7914df ~~ valid-xhtmlprint10-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
467689e1ff1bb49a08e3a0e2b54129e6 ~~ 7da1c4f5a93675ba956d84cd63983ae32a00b267 ~~ 4edc8d5f94b5e97f118376311e4c8484ff964aaefaf50c27ed1f3f7d236d846b ~~ valid-xhtml-rdfa-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
47820e664fb46597e29935435d20fdd4 ~~ 0b457a37d643b41afd048f63b27f8a58ed894c99 ~~ f906418016008f581f35f68292ded3c2129167ae1ddb024722c897fa0144e0db ~~ valid-html401-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
47e0ad5d9f8d4622a896f4769a382770 ~~ 9c519e4482230e51aa4eebd08cdd9b852874f2be ~~ 0a4c1a699a684ed74906662cb7cf0042bf1e19f0e9c5feb33f60de74b836a1d7 ~~ valid-xhtmlbasic10-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
4a4e798e768d580e994127f92bca9c7f ~~ d41faa8d0fba6dbcc3a058cfbc6abf66258e1808 ~~ 80f18f480b9826e075814a18edfc6a7d3fd2584ac86644f709ef9617d095ae2d ~~ valid-xhtml-rdfa-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
4bd3e733593d533cfeee8a3ad32ec65f ~~ 97b94632698a6569eb6ab42ba143d78f01e8543f ~~ 6e404ce33318bf7b383f2d35b0281c7647cc105f1fb30d55a43133296e71c9ab ~~ valid-svg11-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
4c175ddf046bdc9fb7308c5c4db1c59e ~~ 3ccac12a9ecb188c3814acc998b06a21f8e6c24c ~~ 39ec7559ccbcd70a9c9b61c4a3bfaf03bf5d4af95561b5ad8da96af0880e6d36 ~~ valid-html401-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
4d426d260789d44003b1526ca71893f9 ~~ 345904717964673b5dbfb32c5f37120995c68e04 ~~ 62f6663512c4d0bd39bd296e03bc6d948174dce69f0b205036c019d6cb0455d9 ~~ valid-mathml20-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
4e7ed61f78a86fa9fc6a58b3c107dd0d ~~ 28ac8a98d71b387252d167708fa5944094495512 ~~ c520c18704c61942ec7358c050d1fcb3cfc61c88520202150d3afba2d4faa733 ~~ valid-css-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
4f97f4d6ba74767259ccfb242ce0e3f7 ~~ d9d9ad4ba85fcd9dbe69e7866613756f1dbb4e97 ~~ 4e98adeff8ccc8ef4e3ece8d4547e288ff85fdc9c7ca711a4599c234874bbe86 ~~ times.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
53f94aed311ed8f88dad3be7dfb0522d ~~ edc7e6b20fb2833cf8ea1de576da9ec1ab562265 ~~ f28fcd434e116d0ad8ad523953f5aff3bf167ebdba5ff7273c935c8a9df598c8 ~~ valid-xhtml10-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
54c6fd8ea93b273acf0047a261b19fc7 ~~ 2ef1dbafc37fc8dd2cdca2c6ed9325a5d82a4d9c ~~ 5caf3e728d91c107b388e67ea3c5f3b1e5fd3eb7d1b99477ed61ce85070f11ae ~~ valid-xml11-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
54d5361fbd234bf6514c33230cf0c659 ~~ b6ba9d52f361e3e5352ab0b3b07816a406ba61d3 ~~ 52ae8eb2852754b330097997e243cb98d6c2982a6d707d62c707bed34cc7200b ~~ valid-xhtml11.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
58cce9ac66081951ad7aac1463b06313 ~~ e3b528c66f8deac9fb28b15999a4f9d4ee6435bd ~~ cee3631d5da85ac2f9eabf3a1656842ae4e6e8694ce545ffdf6f98e0b13d656b ~~ tricks.png ~~ Non free book cover. ~~ http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=24735&sid=00d5a91304948ce71a38e695d225e122
5bbad00fb58aafdda30d6775c476686c ~~ bd1141cb3bb0207346c1facfdcb0bff5c09ce405 ~~ e9f115a1aa98f9802bd25bab14d4f92bdf9c30070b4a562ff0ebfc0fc043d3dc ~~ valid-xhtml-rdfa-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
5bbf23e7c90a7c96a779f758528a04f9 ~~ b26a404f0899eb0621b017f92ca1a45f8eb0c26c ~~ f95a2fb17ca6317c54587a2b809f2e15c3d05c2ce49434e601f34b90490fc012 ~~ valid-html20-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
5d51432151f81ada3bf6f463f1263c36 ~~ 0042bbea30f7a37a38c4905f1b28fd9f921b650f ~~ d8caa94f426fe0c286037b1db37a25160855b901fe70b6c1f146081dc9f05f50 ~~ valid-xhtml11-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
5dcca5eebb87214e8d459cded09a5373 ~~ a177dc6152f9afc51700a894ce7ef5e5d30ab316 ~~ db93d557a2704790a06fe793484bb6fd591af757b6d097098db2a36f5bc471f8 ~~ valid-svgtiny12.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
5f06ed664188785dfe65d7fc76a86622 ~~ a2770de9b277d5c07662a8f48c31cf64eaff3b3c ~~ fb287e3cc39c1df7bf24a41b7536670537419b70d323da63e517e9218ec6810a ~~ valid-svg10-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
653fbc47ebae9108b2991a026ba8ed0a ~~ 08b67468fcd1c01e03c528ad6bd5fa6aee8904d4 ~~ 444f62bb103e21e198563eda5929e506cfcbeead612736538629fb6544902c9e ~~ valid-xml11-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
65cd8d7bc6d9070d17b4c772032d4c6f ~~ 228e976744a7fef771e0155ffeec79bbc05f21b8 ~~ cbd75ff057348f6a53d0561aa1513c2998569c979eaf1a2749f1573c42450a07 ~~ valid-html20-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
660fb33181e24b9695be97cf13cc5b73 ~~ 6a6ac853ba451bccc6ba49156aba483a557abdf7 ~~ f8fecf79e9b69ba9a28da6bd1118e13a6486f6f7c471f7da56ab11cec144d0e3 ~~ valid-xhtml11-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
663974c9fe3ba55b228724fd4d4e445f ~~ 953839b69c5bc047cb53efefc755dd21175a3a1d ~~ 48d9bc613917709d3b0e0f4a6d4fe33a5c544c5035dffe9e90bc11e50e822071 ~~ andalemo.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
6baa9d31753a781bd3adf59324316468 ~~ c7d7e06b40d353cfbd432ef2f943ad4f8dab5840 ~~ aa03e3f7e0354f393f686ca50bf80aca16c68e63e880da2eb62564a8ca3d7a07 ~~ valid-html32-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
6c0321ba4f9bc33777d4784dcd15e0f6 ~~ da4d6ff7bf0f96a7c7454eb654da573b64f47673 ~~ 6a4090c537cc88c006ca822981a3c7826058c0fcfc84bc7174bb35091f2f5e71 ~~ valid-xhtmlbasic10-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
6c2e943f1c31c7613d85e971b1c5352a ~~ 3b999e70cb0a9b60e1f19e19400f424fa58cd799 ~~ f73ab06f5c13d72bb23860bd8792a86221730be65c5ee56a423f82088803041b ~~ valid-svgtiny11-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
6d2bd425ff00a79dd02e4c95f689861b ~~ e997a0bf7a322c7ba5d4bde9251129dee3f66119 ~~ 192e1b0d18e90334e999a99f8c32808d6a2e74b3698b8cd90c943c2249a46549 ~~ timesbi.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
6e8ad6a37983ddb3a0951ac3a7c0b4d7 ~~ a105793df7445263f250f7f5b925236519b39332 ~~ 8a9e64adf9351dbc0f333daae135c88d5162ed8eadf5e65801c19914ab657bab ~~ valid-xhtml10.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
6ea617b8063a70212794c9fefc868bf3 ~~ a39ac02973936089311e242bf5c7c3368fdc4235 ~~ d57d2a852758d0cfc58130901f1b3e4c0473b4a4fb52478f4bf49c95434ac61d ~~ valid-xhtml20-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
7088205c37654319e430b57dda2aabfe ~~ eb5f70db5d0a68c00e2c502c49d6f06f5ce52bb1 ~~ 29d63668ca4f958b7b0910c7cd6b307af30904418f15b572dbde37f962a9239b ~~ valid-xhtml-rdfa.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
70e7be8567bc05f771b59abd9d696407 ~~ 6480f383a9cd92c8d75ac11ef206c53e3233abb2 ~~ ec3ffb302488251e1b67fb09dd578b364c5339e27c1cfb26eb627666236453d0 ~~ trebuc.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
71b2b30faae6968739c7bcccd324040c ~~ 5583e9ceda3be6eccc2eec3fb066d2260cf54ac2 ~~ 0851e174d2b3ece515802dedf74a64e975a0ebb051386deca4f798cc1e354340 ~~ valid-html32.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
74325a1957cd934f819f61be1c73784f ~~ b4325f497fab7ccdd04062d1e883e82431383ae6 ~~ cab1c2e2878c7505db695d6277d85cf87cbd5b529154b089ad0d9101ef417abf ~~ valid-css-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
774c6de7a25e927d04fd84d467c9e936 ~~ 71c654ebdc6eccb5daca4c180dd9da9bc5bed94f ~~ e5194e57cbe7370c9e43f2a5198a066347a6d575f8bac3622d962edb39c62ccf ~~ valid-html20-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
775a202b8d5ec8cf009535a076c9fc52 ~~ 6f135be1bff8203d04bc80b4b89df7ede291a9f7 ~~ c576108c0cfb59bc82a9ef0a64159ced37896f903acccdf5effa07a33f175457 ~~ data-non-free-lintian-files ~~ This is part of lintian test suite, used for testing this tag ~~ http://lintian.debian.org
781f30fd5839bba3e48998256d4c3458 ~~ ce539215e8f662c438192b86b670989beaf7fd0c ~~ f42d521ab513aba165aee2e82bea1363b693b7e5a6c96e7dad098e299b9d15d5 ~~ valid-xml11.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
7a3571eae7ef7351263e5bf118b3504f ~~ 6e3d6332535f81b6ac6d6983730335e898ee3f35 ~~ c4e4c2bcbbab229653c3285bbe211bdd9efba44c84cf8d76414bfbb46fc3dbd4 ~~ valid-xml10.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
7a5e17a4b613e35d1d10f518495254bf ~~ 3367ef25993e088e9fef41eb03011c51f81645d7 ~~ b86ef30256234d5037a4ca2627375dcb93c050c31dc28c82d935ac149ef8e425 ~~ valid-html32-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
7bfbe49aca0f69c6a936d548af568a94 ~~ c43655d90095c92a761a6baf4c3eb3a43a7ab7ef ~~ 0582d49672e7157e71d910d0005e97fe14ad1661307b5b108bf3e4bca0770077 ~~ valid-svg12.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
7cee00720025ab007428f6e3e1a7214e ~~ 01a6c6f262e003a1a2dc30e0cdd8ca412eb8be6e ~~ 26496d2be92279a0f4a6394497964491837339ae44af590e9f92f516ec4e9d34 ~~ valid-svgtiny11-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
7d94f95bf383769b51379d095139f2d7 ~~ 39b43bf424ac193259b3787764c1cdd7a7e2242c ~~ edf8a7c5bfcac2e1fe507faab417137cbddc9071637ef4648238d0768c921e02 ~~ courbd.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
7e562ac7e442b624574c5c4f35afc6e0 ~~ ed0e8aea57c4ad9f3089f9fda0ec79df3cc2fc65 ~~ 7af51046652b9c8fd2f1504b38d50b1a0730d5f604d4f4a997024bbb8e839f9f ~~ valid-svg12-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
80eb5bb65bce626e4fe1c30b01b415b3 ~~ 466f3d78e234967f32b78853b0861f6339f4a272 ~~ ca8e911927118a9cfddcedcd562b50d86c22349479c3347ab4337ebf180eb0e2 ~~ valid-css2.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
81d64ec3675c4adc14e9ad2c5c8103a7 ~~ 5518f0bdebe7212d10492ab6f4fff9b0230c3cbe ~~ 873361465d994994762d0b9845c99fc7baa2a600442ea8db713a7dd19f8b0172 ~~ comicbd.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
84a0496cfe509bf4370ad17af6d85622 ~~ 7ab8f1991dabde584b9838771e6dfd1507ba90c5 ~~ c92e0fa07d29e3cc5c2b4cd5cb9366e4216599ba367ca7bddcbb99b6947de344 ~~ valid-svg12-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
875f43ef98790eeb2eb6bbf4fd9f357d ~~ 64abf9487f0ab95bc58980fdeb4b6135e675a0ce ~~ ca6287c7970f25be503c1d4a11544331f75700d357a9ed44614a4908b8d4a6da ~~ valid-xml11-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
87996b1fe7118751e5e5ab90580a952e ~~ 776a5b2b388ff669ec30a1866048967bcc7b81a4 ~~ 0342f1f4084b2f0df09138e28c6b7c859aca3e7dd87860691758d788dd81ca04 ~~ valid-xml10-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
8ba42fcbb61411cd8d04c84669fb5046 ~~ f4a6e779ff48886c3bee82e283c3384cabb2554b ~~ 9f819a940bd8fc82763563864f16b848a760a2c5534ad5d8f35893136c12ba38 ~~ valid-svgtiny12-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
8d468c1a8dfd2b7d6cce25eff76b65c6 ~~ 8d9069fe50f89461de9fe4d293d0f4e62980e1b7 ~~ 244738a697d313e29ebe0059ddd1cb23ad8fefe5bbaf1954463401bf8998ae63 ~~ valid-svg10-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
8d708f9880597a9810b8a1b778189035 ~~ 65870fe048c78512165c65acd3f3af16f0311fc3 ~~ c96fa8de8fa62207eaf3921ce08d1997b8927c2c2d2f6b7ebbae72c8bfc01bbe ~~ valid-svg12-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
8e6f0c4c08a843c0299f156e74f0728b ~~ d7fab95973fba222ec6cd09b99b265ca7874a397 ~~ d9abcff597e9e3069b67e1197bb6f358f0b89208af73288356e7fd801b7937a6 ~~ valid-mathml20.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
8e8603d86a548e2c41a4966e55f58844 ~~ 2b68e4c7f4bd0477fab8f6da4a1c0abcd27c3286 ~~ b90668c33f6e67f621b64d9ea8d37266f0ef481f5dd0b5c45490afa5d998db2c ~~ valid-xhtml11-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
8f308fe77b584e20b246aa1f8403d2e9 ~~ 2614ce1c336f8568b9bf0c14752edfe1819a072f ~~ db56fdac7d3ba20b7aededcb6ee86c46687489d17b759e1708ea4e2d21e38410 ~~ trebucit.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
8fc622c3a2e2d992ec059cca61e3dfc0 ~~ 1cc231f6ba7e2c141e28db4eac92b211d4033df6 ~~ 00f1fc230ac99f9b97ba1a7c214eb5b909a78660cb3826fca7d64c3af5a14848 ~~ impact.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
90a24770ba08869e300ce7571a68bb79 ~~ 754f1e1c05a332ebbde9f3d380e74b39eb9d94e2 ~~ 3dad336c17ce25b5179cdc0ab8c15c7539083d6b40d8186e2f51a1713e123d30 ~~ valid-xhtmlbasic10-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
90a7a620a2d20028d19d5789a3663d77 ~~ 16c6d4f70538144a00442078a8afcde652e8c6ef ~~ 97647e43f30579fc5a71c8ac80e6957b12dda05ec0302d7d54089ec9fca91d6a ~~ donate.png ~~ From paypal button. ~~ http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=24735&sid=00d5a91304948ce71a38e695d225e122
91da8b37dca8c84af7fff31cddaddcbe ~~ 36b8fef88da3b502579c794336d08321954dbd3b ~~ 189899f40cbb8a439bfb516197d8cf35433385e8960275734b00b4f25798e6cd ~~ valid-xhtml20-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
92fe5e5ef3fcd253d1b766340959adbc ~~ 98cac714cf4a6ae6fbbad38c7309b761ad899924 ~~ 56fbeb9566b24d19386e5a0d64129991faeaa6c9ca44633b070230af29b1fab6 ~~ valid-css.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
932e79d2f55e5664ff706c61ea4622b9 ~~ 3b666844300ac255da1aff067f83f0ff3fb9aad8 ~~ 54e49a69fa169fd55a53a6df83ea3aae41c7a6abe524cacbc991d17de7daab45 ~~ valid-xhtml10-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
9413fd425c1f69b3dc6c0a9bcea42da8 ~~ 8673414fd20425f98e7153686c9771cfb77fef1d ~~ d07f51b1625a732200cb4c768345a34c8d0dff0ac2fa94a87a8ad1f5bc70df8e ~~ valid-xhtml-rdfa-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
957dd4f17296522dead302ab4fcdfa8d ~~ 5f896ef096ad01f495cefc126e963b2cd6638fab ~~ c25ae529b4cecdbca148b6ccb862ee0abad770af8b1fd29c8dba619d1b8da78a ~~ timesi.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
99192cee336734ba883a660ab024921f ~~ 51a08207c696205d16fdb9e8f649c1ecb51eb7ec ~~ ccc6c9bec5c19b544fd4a027a2f9ec07006d6616e205d315845bb368d61f2ebe ~~ valid-html401.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
998d8d0124a6ee1aab92679f39f60ffe ~~ 579eeaed4679d9e35a9743e7ff87ba4b07b7f0de ~~ 12dcac11bac023b7184b10e605820626cbd3c5e3312d3cd4e758e112e06cde80 ~~ valid-xhtmlprint10-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
9a5ee67a90f6fcda231066e76ddc2bc7 ~~ 1f50fe05eaf41339766d465be8aeed90c92b2718 ~~ 216654adb0174972350894e95a58f50654c80fba64992cb7e4c61eb84a402f63 ~~ valid-mathml20-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
9a7fb2fcadcd6251ece4a26ce2a2cf03 ~~ 13380521c26669f9e61dca80298e4808c2d2ab66 ~~ 9ab00fee1773663d6e937bb1d746496ebc76ef7b869ca3b9b9912bbd16812396 ~~ valid-svgtiny12-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
9e49c3f7c4d063d18c1a074d6ac2675f ~~ c12fb8238c5a2db23d22c081a766d3e64903037e ~~ 052a153ac653cee8e2b7015d982d42a8524f43ede8a2c7d8335d085ce73879f6 ~~ valid-css-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
9ec1fb4ce244280c1d77a0ff6caca171 ~~ 11d6957b24ba5b897bacce56372b5e9bc564ae33 ~~ 2b8138629103b5d498ff0dda2dd276f5f536cf30a10e10afff37f18dc71b68f6 ~~ valid-svg11.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
9febb0b81034473ffec6e8e68cdd78d1 ~~ 8410c83ddaca876af87bc75366d82cf95e4f5d05 ~~ 05f6d5d529a7204f99615dd67726e36ec0c5be12ec0f467ce2568dda5d6dc865 ~~ valid-html40-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
a2b3bcdb39097b6aed17a766652b92b2 ~~ 0aba42fc6e5b1e78992414f5c4df31376f90f0e2 ~~ 2f371cd9d96b3ac544519d85c16dc43ceacdfcea35090ee8ddf3ec5857c50328 ~~ arialbi.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
a2b4dc9afc18e76cfcaa0071fa7cd0da ~~ fe5e9cfe72f1cbf07b4190f7fc4702cd15f452d1 ~~ c8f5065ba91680f596af3b0378e2c3e713b95a523be3d56ae185ca2b8f5f0b23 ~~ verdanab.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
a315d5babf0907b7437506c12e9c66ad ~~ 1f5f5148b3ee5b361c3f63a39699d329d286e982 ~~ a87c7f818752705fa0ff6c94c4368ba5a1b89c47a70cce33b4630d51dc8ef4bb ~~ valid-html401-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
a455acadf3a8494b13ecd9647a6c4f0a ~~ c01cdfb17564d9a33b2bb2fe25f57ca540ff0d9d ~~ 9f92e78a75201776eade029e5044d56b76a5ca1f040340e03760b3ef3a4ec86d ~~ valid-mathml20-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
a50f9c96a76356e3d01013e0b042989f ~~ d17fae7a6628e2bc4c31a2074b666a775eed9055 ~~ b82c53776058f291382ff7e008d4675839d2dc21eb295c66391f6fb0655d8fc0 ~~ comic.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
a5b7cb8e0efac6bfac265c7a1e2f9400 ~~ 0160e47f713e81adc7fa90ccee47b7794b165e9a ~~ 02ce5ee344c4e4d1046374ac8a42f522c9e8961827c86ea75f68bd7eea4dc174 ~~ valid-svgtiny12.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
a5d7699bee6b7a3ecb554c707bcb7e66 ~~ 9b873d3399237be0723d0ebba21426d0ed91fdb3 ~~ 98ebd604adea6bbd42efcc31f15f4abaaff118b033afe1d70c70cd98c1c38a91 ~~ valid-xhtml20.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
a718767221642d3a83d2af645eddfd47 ~~ 21ca26055a1c5bd08de7d7379775fb492dc0d2c2 ~~ 71057d0a4b0a7a21588465d9a7e9afc33ac0e85db05777eb79f801c2a4ad7539 ~~ valid-xhtml-rdfa-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
a7f312474dca7b17dc3475075637bdfe ~~ 267ad1f6a62205ba8e6bae5639b8d9056578f568 ~~ cb38e77f63cc8798ec881452be9f17e77b0820069dd8e67fdc1cfcc06f42784b ~~ valid-css2-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
a8babd1abc3be0acc7831e4a030a01df ~~ e0441025cdd38734f6dcbd610c3acd3ef7d91474 ~~ 8ad41ca14758b4266235b2ca6a16811dc44983ed118d0cba0b4398bc05c9246f ~~ valid-xhtml10.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
aaf594015c74e1f5efc6c2564c7386c6 ~~ 72e079046e6df264cf3dbd7f946a34e9c212e5e0 ~~ b612e8f4fa38c76b16f3e48585edb24991d5ffc8bb451d1f81523b7e0e43bf9f ~~ valid-mathml20-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
abbc84e259b7a7f00986c0941f4354c6 ~~ 6e5159e13faf938362093c764803fe8f0523940c ~~ 9969f0deeab0e011294a1a7a71a928f6b3e4e05a06f177071a5611cda978d339 ~~ valid-xml11-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
b041a1c34404ae52a2e237c954e3d98c ~~ 00ba0772b858ee90d98688538348a5e98c8326f2 ~~ ba3c582e625d54caed29af09b74047219afdd08d09a7d8e742cdd2d2e729ce1b ~~ valid-xml10-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
b066355b92e008e72dc1dce7bb83dec3 ~~ 2c1c69aad79c804e88764c962e24f6a5813442de ~~ 2884642732a81c4d66561faff094d8b763af008576a58a2d78c1da966033361c ~~ valid-xhtmlbasic10-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
b15431dd1c93e12280fe4037b90e0920 ~~ 9939b411597062cc9e114c38132b1be6b8dc3e52 ~~ 8a5f2c0ee0e6378953214cf4e1d4c1a532791f44e4d963d87d8857599d8905dc ~~ valid-mathml20-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
b1bc241fc57cc7e6d0317e806d547b94 ~~ b1106897e13f1c7c943418331c4f31516fd658b6 ~~ d2f7cef65e78ab2088af72d8acc7df6d1f1da92826bd75586138364e466a35f6 ~~ valid-css1-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
b1e79950a20e54f6a20d0480c4c7e712 ~~ 4fd3d68a9ba1fb8597d480d652ea3d374a259a30 ~~ aacd131ae899adb2338c3d1bbffb27818c507d137ccb5ec6259c50cd63e66580 ~~ valid-xhtml10-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
b43417fb9fd9c882511c444b4e952395 ~~ 67590724c8fd8465c8db2e3bce0f1ab740c26b50 ~~ b79493e5acc5f3025778f44b6abe35c3d2a0fd08871fcaa27b9b82f2bf1214ed ~~ valid-xhtmlprint10-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
b6b32e3e6f0c12493aac5311cde3e88f ~~ 17c1155dd5b03cb9c0d0fcfb05ca64ae5d714fe4 ~~ c74ce366d9d19521a4a95197d227b324730f30815e017b76d926ba7395a8b05d ~~ valid-html401-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
b7ca28ec04c8b59fb299e3a800de5e48 ~~ 386ad5fe9242c7ce6db6b778a4788ff15ab635ce ~~ 59ad761ae0ff5e32b8368a6eeb69539c995d8c0eda596f37c4bd96b906bd3bc3 ~~ valid-xhtml20-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
b8837688de7cd2e68c23f2f710135b70 ~~ 60a7fea13bc67a809911735cee5ab016094fb181 ~~ 5dbe339485b91f260e4f0070b36a1604308a6cbaf5aeee5c38194ad602144ca2 ~~ valid-svg12.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
bc1ac3e3b56bb48769beb243dff2446c ~~ de41f8e3c1131e8476947047b939f48c65830166 ~~ 3382de0b11c8a53eefb1d43e744f1d9665a11f8982916a1b0278900ef6f600d1 ~~ valid-html20.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
bc4ad1bf80077d63abebfa7fd5c83dfc ~~ 02a8d25d48caadffacfda95b798901fe8c45fa2a ~~ 859bf913d5f318ffc27c7747027354d1798219db861c7886820f5fd61571fcd9 ~~ valid-svg12-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
bdd052f421da1394e165d12628203830 ~~ b5777d5ec1bb3604a6171dda162a9ad23cce1b42 ~~ aad2694c593a41d17128124c5647246851e18d993628301c952e10fc86d82ff4 ~~ valid-css-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
c61b355a5811e56ed3d7cea5d67c900e ~~ 3ccf584caad7dfaf07a2b492e6e27dfe642c6ba0 ~~ 82d2fbadb88a8632d7f2e8ad50420c9fd2e7d3cbc0e90b04890213a711b34b93 ~~ georgiab.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
c822d9854da9f276aa29a70b6f37d8d1 ~~ 303670924caf87066c18dc4cb19dce337af7ea2c ~~ bac47bae29cf8f10ad926401eaf7ebe7d7f49e7c5671aeb12e8dd658a405725d ~~ valid-css-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
c8720db4c921c18df5bc8f53fbaac4df ~~ 1439d9a56c8ff06a5ac846a5a7ac8612618a9e92 ~~ f816c05b2bbcf3bcf2b4a8ae6029fae4b99e921d35608f2624f8e73ffbad7ce6 ~~ valid-svg10.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
c8c648fbab1d669f1c130ecd533452c1 ~~ 5c2649a6e2bd6d0b822380183781a30d772dc661 ~~ d6db6255f32591be723b45289f75e0018cc7a2eacefef52033b48f81d8a37f32 ~~ valid-xhtml11-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
ca679923a7d341f733de44408739382f ~~ e155eb67721c4b1d864c0d0409c6e0ccf0fcdccd ~~ 9447a078e011848189d9b0037bfa8b37d561f259e321bd6693052ec398faf741 ~~ valid-xhtml10-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
cb61e3ed0a20147e401244c09626bb9e ~~ f8de9891e3ef0ff821ea6ddbf8da39bc61849d2c ~~ e97279bc4354799db6940a8546076887bc3f2b873e91aa544f210089b4ae8fc7 ~~ valid-xhtml-rdfa-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
cbc979588a3ae01494c991f9f2e43863 ~~ 6a049f5815f9927936531bb8c9b0a324059a1a90 ~~ 2c53aa19b877695fe2d26749dd4787923a6a53d3cb40c8dca970e2c702ab0439 ~~ valid-xml10.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
cbe696cd6659f1d7f6d09cd17ad25fc6 ~~ eaaffe86521aa39d6df64f41d20e74761d6aaf34 ~~ 18c12ea703ec885599fc7f3a983de2df13295780790578d7a495b54c2134e806 ~~ valid-svg10-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
ccc79917c28a6f67735a66a369b02a4e ~~ e90ad6929f33a9c7ab4e1168220f0cf932f54ddb ~~ 4f20d42a39386e6845a94bea0e6c85d5975139990ef6e69c1e45a58544f79251 ~~ valid-css2-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
ce4f946f5b4ea75a774c717ce0b1383c ~~ d392230007b12a21e95a07faaa4135de3a367fe8 ~~ 45a8b982ba73c191a6bc0dbed3fbf13b1f834d2a20d0293d10dfb96b45996ecc ~~ valid-xml11-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
ce79392e1f7f2eb1c37414653feb9ccd ~~ 56bb6e8e3d8166ca4314add0e4c5b108d5be9262 ~~ a4154b6550859c2638ab09e3561f666a1f7bd899723a8da8a4c8e467b9432fc2 ~~ valid-svgtiny12-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
cfc9632ec5e6091e2a11c1dba6e2b270 ~~ b6c278875e8bb398392d104b2598b9d2a7d8be8a ~~ 4970d5940eff2c99e8ebca2325f56de667ef8d97f5075d477cf5f37438f1b2a3 ~~ valid-css1-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
d0e9246f555b3fd579f675ed0da5f970 ~~ 4f58e8e20a0a6000b3b44b60b52633c27e078796 ~~ 0efe4af5f7be218828d77152b5e38fe206987a0f7f0f6666105bf257f5ba3b24 ~~ valid-css.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
d319984b757dd214c8d33fd0a20d12ca ~~ 1021a94b161b6c7b85e82eb7ddd3895fbe6510e7 ~~ 191312d4cf3819d4f1aeadf5fa4442a885ab89ac0ef3192caaa33ce00df68f19 ~~ valid-mathml20-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
d361c3a673aa980a47e10f05baf99116 ~~ d186ae2feb0a319ea9e6ea8b5956be1fb54da935 ~~ 5fd67205d64f00759b4394cadbd66a729303c0adcf328d531f833a7491c170f4 ~~ valid-xhtmlprint10.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
d3b42501d0e2598b1289e38a6ed78442 ~~ 227da85240b8afdb3a28fee0c4db0dc09f07e5e7 ~~ 5d6c200ce86e8e40a7760f926a3a64265c82c7658ba89a53bccd284dd839962c ~~ valid-svgtiny11-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
d7ce0073b774bed6f9ef5f48c11fdcd3 ~~ 7ac34e68d6c4e612e572bdf37abe2ad8af493b51 ~~ a093c7252b83d7a292ce8fa829dbbe6cbd7d1a0db615c2b54c0925c28e48512e ~~ valid-xhtmlprint10.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
d903ac66ad9e5d99b57b4be94f7ef1e5 ~~ 960301306e982cdbda6236c0fd11fc51cf6a52f1 ~~ 1016dd7b56cfc6482d0883b4d4978b3aaa131d6d4e00775e9d51f7ac356761c8 ~~ valid-svgtiny11-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
d94351568b3934d8c391e66a8df6c7f2 ~~ 32fbf4d2d436c83d8145878e5a79ee58999bcf4f ~~ b2c0439e9cf6dd2a91214119dfb701253d1e9a8bffdad66fefe95d08d76b4c20 ~~ valid-xhtml-rdfa.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
da414c01f951b020bb09a4165d3fb5fa ~~ c5f4818fa6876e93f043a209597bcb39c57e43ca ~~ 66dbfa20b534fba0e203da140fec7276a45a1069e424b1b9c35547538128bbe8 ~~ courbi.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
debeb65b839c838c141e7f93c27d1903 ~~ 1b0fd975e35d36b854c41ca7f61377e212541b52 ~~ 93aaa6f7ca6035516be06e858c6df7237073bbe776f618858da97405c6898144 ~~ valid-svg11-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
e111e8cadca60735b0f6800776745f44 ~~ 5b67357755fe776ff4e780f142fc982f1b95ffd4 ~~ ed26408f095153fa973e68d4da2d8ddd50b7d550e4cbbedb9e725d94ca8faf0e ~~ valid-xml11-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
e1581c126f047814a1e03a3a2c341ab3 ~~ d1e71083fe3ec82397f45bd4ec7011aa8ca5e42f ~~ f1c9ee4d47070ecec0c6679f83798c99b661e498ac14de1eea0d641274863b1d ~~ valid-xhtml10-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
e1b9ca24d31179ef3379d474bcce3be2 ~~ c3e4b470c40f4def158690679ca4be7cd61adecf ~~ 11772b66e51d7163d202637ce50341fae3874932c2a1934708e7eb369fd74664 ~~ valid-svg12-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
e2657b6eaefba7956736f6d3ba27c5e8 ~~ 7c6402b8d71adf5d8db84e27282821b3dd18df5c ~~ 14df28b3f91ad668ffb04d6f272e5a63ad16dc98fd7d97a70127ada5f7c3385f ~~ valid-xhtmlprint10-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
e2cf1908851d20f450e6e03b7e9fef96 ~~ 55472e91d355827ef7f06f83405ac2606c323a42 ~~ fd05621339a229d712f3d8681a67e85ecadf2f9b4bab12f92b2a4a82ad82aaf6 ~~ valid-svg11-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
e2efd5381ecd97ec8cb9426150e2c7a8 ~~ e7d4545ff817632f4e3cbd2a066629d10cb0bf3c ~~ 229719502b58a36a03bf955d47cf9b1f4c581893437df3ebe2d381fd391d9ffd ~~ valid-xml10-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
e5d52bbfff45e1044381bacb7fc8e300 ~~ 328b246b57108d5f175eb9a4df8f613b7207d0bf ~~ c983e037d8e4e694dd0fb0ba2e625bca317d67a41da2dc81e46a374e53d0ec8a ~~ georgiaz.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
e650e0edc37445be4850285b15f0ec13 ~~ 315c60122079a0a2afde814e3726ab2ec0dfe680 ~~ e2dd625ef1cd8b0711faa967559ecbc68656fbc77a0f01640204414e6b2488b0 ~~ valid-html401.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
e75df4e582aba891ad90b1eed4f99df6 ~~ 7948737ddc42534000f4c8cb58bf09073218fc0c ~~ 849da570171fe982a94cc2831aa866170224b89285959ed4e2eb602c4192b1a9 ~~ valid-xhtmlprint10-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
e82af93429c91fb02e57360761885ad8 ~~ 7621a6721fb6fc9fa0b635bb8c7b2c7ce28babd5 ~~ 867a1e83e91b14c56fba894fbb7023f941332e6fcb5d74512e152afcb2e6ce6a ~~ valid-html20-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
e8ec3589482f137ad186d175ce15a8b2 ~~ b8349e0a1d1535e99edee016e16d3743c2a97f16 ~~ 8985d5856f602a6e2bf06df4c2d398003dbf6558498608b7ec3a7008dc7c5c9c ~~ valid-svgtiny12-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
e9f82b83f9cc8fc2b4daada6d016d86c ~~ 078057aed474c249b11f27b81a4533539681d1b2 ~~ fa4b2a687ee885d755627bc8d2a87cb7aba7f05227884e258ac8cf490221c6cf ~~ valid-html40-blue-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
eaaaf139af3d6615e0f1517ab8535561 ~~ c44c680f80887edc66c33bbdb84c2a594bca33e9 ~~ 036524f7f1235b21d4b437c29d5a869aaccf90f597f5ab6c23e37b496fb7e293 ~~ valid-svg12-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
eba743583c36fc0d3242c6bb40bfe65b ~~ dd541054e7f57bedd7f566ccd6b0a21a7b8ac21f ~~ c4f34419a761c3a87fc923beb0caa3eeb55d435eece3a6d1f0fb06bbce85d951 ~~ valid-html32-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
ed6e29caf3843142d739232aa8642158 ~~ f67a30f4db2ff469ed5b2c9830d031cb4b3174b4 ~~ 4357b63cef20c01661a53c5dae70ffd20cb4765503aaed6d38b17a57c5a90bff ~~ timesbd.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
ed9d3bf664eb65b59ca04cd09bd4ad3e ~~ ac709f6589fd0e84168db9b416b42c7819d5b138 ~~ 4c2dec7019be4aa6ac58b22b6b91b39e9151577e14c335cb1e15323df02a2d3a ~~ valid-xml11.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
eed112802f9ebd24f2bb818444d79302 ~~ ade9de54aafab10c85328381ee2cb51951be4531 ~~ 3d24bc0fd996909c369db799d9af8e68b6b7a7a00402724236a83d3b6a861ab5 ~~ valid-xhtmlbasic10.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
ef9699cf523ad3255aaced735ca298a3 ~~ 082aa1f53b8ac43750e56985b1480c16cecefa26 ~~ 6122dcdbd5bf8a602a4175617e837b8c4253ea4bb822daf57657f24f1e399c9c ~~ valid-svg11-blue-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
f11c0317db527bdd80fa0afa04703441 ~~ 2c5cb7cfa19eea5d90c375dc0f9f8e502ea97f0c ~~ 35c0f3559d8db569e36c31095b8a60d441643d95f59139de40e23fada819b833 ~~ arial.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
f2436b9c355b64bcabe83795628f83ec ~~ 2b46b87b9020e4941619b0f3c6821c535d268d00 ~~ 035f9ee8644e8ba3814b56db72f86aa5aa74b37975968b8a73fec2777c268437 ~~ valid-xhtmlprint10-v.eps~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
f43ea864440de28ad70e8a78b9144334 ~~ de3c89fb14962630df6adf0fc6e8e623cf6d5064 ~~ 4dbee0615c3828ff10de69d61b02cf0230d219057a3937948776fc7372682879 ~~ valid-css1-v.svg~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
f4b306eed95aa7d274840533be635532 ~~ 5d69d55862471d18f1c22132a44f05291134cbf4 ~~ 7d0bb20c632bb59e81a0885f573bd2173f71f73204de9058feb68ce032227072 ~~ georgia.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
f5b0791d2da535e5514e1fb151de4ab8 ~~ e978eaebe367ca32a1af485176f185dc53c6666d ~~ 1aa0412fc75dfbf07c2db9493420d526becefffa1eb0f5b6de416fc63412efd5 ~~ valid-svg10.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
f6150b1b96bb240c72402eb2e2dfbfd9 ~~ aeb3b0c851f88073fd37f9b42bcb519de5c4e7ef ~~ 1b70592d167880d1a8814f28d6a40343bbd5b18a11cf816ec073c88e9d178b22 ~~ valid-svg11-blue.png~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
f71e418a494262774b44bad8d400dd1c ~~ 4ad77a8a8793845602ad465ca56330ed89521f0c ~~ 2c3642d60402842222c2df85736669a7c2dcf3a868f83d75dd1199baf2c5b2a8 ~~ valid-html401-blue.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
f7310c29df0070530c48a47f2dca9014 ~~ 09aff891c626fe7d3b878f40a6376073b90d4fde ~~ 698e220f48f4a40e77af7eb34958c8fd02f1e18c3ba3f365d93bfa2ed4474c80 ~~ verdanaz.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
fb5d68cb58c6ad7e88249d65f6900740 ~~ bc377a42afee7f73f0b80e2ed6e0d18edbd4f8fd ~~ c0a6bdf31f9f2953b2f08a0c1734c892bc825f0fb17c604d420f7acf203a213b ~~ trebucbi.ttf~~ The EULA does not allow modification, reverse engineering etc. ~~ http://bugs.debian.org/298545#29
fce22382a573ac597fd2838d752eeb91 ~~ c67489df016f5da7cbc988c2668c3889166636e5 ~~ 67517f5fae665bff099374bca81f9f92edcdda3621ce5980d4feb14b9e603b4f ~~ networkredux.png ~~ Non free logo. ~~ http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=24735&sid=00d5a91304948ce71a38e695d225e122
fd00ed13dce8482c1516750fdb262dbc ~~ 1c9529c61616c36873fd55e48ef60b95e05b0bde ~~ f94ef89f8f127a018a024b022aadf4599daa9b322b815dfc53b9daa663dd78e7 ~~ valid-html40.gif~~ The valid w3c icons could not be modified. ~~ http://www.w3.org/QA/Tools/Icons
lintian-2.5.22ubuntu1/data/cruft/warn-file-type 0000664 0000000 0000000 00000003322 12313507507 016301 0 ustar # warn about a file type
#format is
# tag (unique) ~~ type regex (x) [~~ name regex (x) optional empty means .* ~~ missing source transform regex separated by && or map or nothing do not check]
# note that map is not evaluated but check with regex so please use correct form:
# map { 's/SOMEREGEXP/'.$_.'/'} qw(LIST)
#
# File should match both "type regex" and "name regex"
#
source-contains-prebuilt-binary ~~ \bELF\b ~~ ~~ map { 's/(?i)(?:\.(?:bin|elf|hs|oo?|out|so(?:\.\d+)*))?$/'.$_.'/'} qw(.asm .c .cpp .cxx .f .F .S)
source-contains-prebuilt-flash-object ~~ ^Macromedia \s Flash ~~ ~~ s/(?i)\.swf$/.as/
source-contains-prebuilt-flash-project ~~ ^Composite \s Document \s File ~~ (?i)\.fla$ ~~ s/(?i)\.fla$/.as/
source-contains-prebuilt-java-object ~~ (?: Java [ ] (?:Jar [ ] file|archive [ ] data) | Zip [ ] archive | JAR) ~~ (?i)\.jar$
source-contains-prebuilt-javascript-object ~~ .* ~~ (?i)[\.-](?:min|pack(?:ed)?)\.js$ ~~ s/(?i)[\.-](?:min|pack(?:ed)?)(?=\.js$)//
source-contains-prebuilt-python-object ~~ ^python \s \d(\.\d+)? \s byte-compiled ~~ .* ~~ s/(?i)(?<=\.py)[co]$//
source-contains-prebuilt-silverlight-object ~~ ^Zip \s archive \s data ~~ (?i)\.xac$
source-contains-prebuilt-windows-binary ~~ \b(?:PE(?:32|64)|(?:MS-DOS|COFF)\s executable)\b
lintian-2.5.22ubuntu1/data/cruft/autotools 0000664 0000000 0000000 00000000326 12310413206 015455 0 ustar # List of packages that will suppress the
# {ancient,outdated}-autotools-helper-file tags
#
autotools-dev
automake
automaken
automake1.4
automake1.7
automake1.8
automake1.9
automake1.10
automake1.11
dh-autoreconf
lintian-2.5.22ubuntu1/data/cruft/non-distributable-license 0000664 0000000 0000000 00000000404 12310413206 020466 0 ustar # see non-free-license for syntax
# nvdia opencv infamous license
license-problem-nvidia-intellectual ~~ license && intellectual && retain && property ~~ retain all intellectual property and proprietary rights in and to this software and related documentation lintian-2.5.22ubuntu1/data/cruft/gfdl-license-fragments-checks 0000664 0000000 0000000 00000004002 12310413206 021175 0 ustar # this data file check gfdl
# first field is known good gfdl section (regex)
# if second field is present it is good only for these files (regexp). By default ok for all file
# if third field is present tag with the parameters if the two previous field match
# verbatim text used in the license
\A with [ ] the [ ] Invariant [ ] Sections [ ] being [ ] LIST (?:[ ] THEIR [ ] TITLES)? [ ]? [,\.;]? [ ]? with [ ] the [ ] Front(?:[ ]?-?[ ]?|[ ])Cover [ ] Texts [ ] being [ ] LIST (?:[ ] THEIR [ ] TITLES)? [ ]? [,\.;]? [ ]? (?:and[ ])? with [ ] the [ ] Back(?:[ ]?-?[ ]?|[ ])Cover [ ] Texts [ ] being [ ] LIST (?:[ ] THEIR [ ] TITLES)? \Z ~~
# variant are tagged not official
# official text variations
\A (?:with[ ])? (?:the[ ])? no [ ]? Invariant [ ]+ Sections? [ ]? [,\.;]? [ ]? (?:with[ ])? (?:the[ ])? no [ ] Front[ ]?-?[ ]?Cover (?:[ ] Texts?)? [ ]? [,\.;]? [ ]? (?:and[ ])? (?:with[ ])? (?:the[ ])? no [ ] Back[ ]?-?[ ]?Covers? (?:[ ] Texts?)? \Z ~~ ~~ license-problem-gfdl-non-official-text
# (dict fold)
\A (?:with[ ])? no [ ] Invariant [ ] Sections? [ ]? [,\.;]? [ ]? (?:no[ ])? Front[ ]?-?[ ]? (?:cover[ ])? (?:Texts?[ ])? or [ ] (?:no[ ])? Back(?:[ ]?-?[ ]?|[ ])Cover [ ] Texts?\Z ~~ ~~ license-problem-gfdl-non-official-text
# (libnss-pgsql)
\A There [ ] are [ ] no [ ] invariants? [ ] sections? \Z ~~ ~~ license-problem-gfdl-non-official-text
# (parsewiki)
\A without [ ] any [ ] Invariant [ ] Sections? \Z ~~ ~~ license-problem-gfdl-non-official-text
# (lilypond)
\A with [ ] no [ ] invariants? [ ] sections? \Z ~~ ~~ license-problem-gfdl-non-official-text
#
# Conditionnaly ok
#
with [ ] \&FDLInvariantSections; [ ]? [,\.;]? [ ]? with [ ]+\&FDLFrontCoverText; [ ]? [,\.;]? [ ]? and [ ] with [ ] \&FDLBackCoverText; ~~ /customization/[^/]+/entities/[^/]+\.docbook\Z
\A with [ ] the [ ]? <_: [ ]? link-\d+ [ ]? /> [ ]? being [ ] list [ ] their [ ] titles [ ]?[,\.;]?[ ]? with [ ] the [ ]? <_: [ ]* link-\d+ [ ]? /> [ ]? being [ ] list [ ]?[,\.;]?[ ]? (?:and[ ])? with [ ] the [ ]? <_:[ ]? link-\d+ [ ]? /> [ ]? being [ ] list \Z ~~ .po\Z lintian-2.5.22ubuntu1/data/standards-version/ 0000775 0000000 0000000 00000000000 12310413206 016023 5 ustar lintian-2.5.22ubuntu1/data/standards-version/release-dates 0000664 0000000 0000000 00000002445 12310413206 020471 0 ustar # This is a list of all known standards versions, current and older, with
# their dates of publication. The dates are in seconds since epoch to
# avoid having to do time conversion during the check. (Believe it or
# not, this takes a noticable amount of time.)
#
# To get the date of a new standards version, try:
#
# perl -MDate::Parse -e 'print str2time(""), "\n"'
#
# You'll need libtimedate-perl installed.
3.9.5 1382920848
3.9.4 1348029336
3.9.3 1329968436
3.9.2 1302155335
3.9.1 1280111901
3.9.0 1277700052
3.8.4 1264616563
3.8.3 1250381606
3.8.2 1245181373
3.8.1 1236829852
3.8.0 1212562800
3.7.3 1196668800
3.7.2 1146639600
3.7.1 1146639600
3.7.0 1146034800
3.6.2 1118991600
3.6.1 1061276400
3.6.0 1057734000
3.5.10 1052550000
3.5.9 1047024000
3.5.8 1037347200
3.5.7 1030777200
3.5.6 996044400
3.5.5 991378800
3.5.4 988441200
3.5.3 987318000
3.5.2 982483200
3.5.1 982224000
3.5.0 980755200
3.2.1 967100400
3.2.0 964940400
3.1.1 942739200
3.1.0 941702400
3.0.1 932022000
3.0.0 930812400
2.5.1 925196400
2.5.0 909648000
2.4.1 892537200
2.4.0 886147200
2.3.0 873097200
2.2.0 868777200
2.1.3 858412800
2.1.2 848736000
2.1.1 842511600
2.1.0 841561200
2.0.1 841474800
2.0.0 841042800
0.2.1 840783600
0.2.0 840610800
lintian-2.5.22ubuntu1/data/standards-version/ancient-date 0000664 0000000 0000000 00000000275 12310413206 020306 0 ustar # Any Standards Version released before this day is "ancient"
# That date has to be within 22 and 24 months in the past
# at release time
# Format is ANCIENT < Date
ANCIENT < 14 March 2012
lintian-2.5.22ubuntu1/data/deb-format/ 0000775 0000000 0000000 00000000000 12310413206 014375 5 ustar lintian-2.5.22ubuntu1/data/deb-format/extra-members 0000664 0000000 0000000 00000001266 12310413206 017100 0 ustar # List of extra members permitted in the .deb files
#
# Format is:
# =>
#
#
# is a 0-indexed position of where the extra member is
# expected. It can be "ANYWHERE" if the order is not relevant. Note
# despite of the value of , any member appearing before the
# data.tar member MUST have a name starting with "_". If not Lintian
# will presume it is the control.tar or the data.tar member (depending
# on how early it occurs). It is impossible for any valid "2.0" deb
# file to have an extra member at position 0 (which is exclusively
# reserved for the "debian-binary" member)
#
# For Debian, no extra members are defined, so the file is empty atm.
lintian-2.5.22ubuntu1/data/control-files/ 0000775 0000000 0000000 00000000000 12310413144 015136 5 ustar lintian-2.5.22ubuntu1/data/control-files/udeb-permissions 0000664 0000000 0000000 00000000411 12310413144 020345 0 ustar # Manually maintained list of files in a udeb control.tar.gz along
# with their expected permissions.
#
config 0755
control 0644
isinstallable 0755
menutest 0755
postinst 0755
shlibs 0644
symbols 0644
templates 0644
lintian-2.5.22ubuntu1/data/control-files/deb-permissions 0000664 0000000 0000000 00000000467 12310413144 020173 0 ustar # Manually maintained list of files in a deb control.tar.gz along
# with their expected permissions.
#
clilibs 0644
config 0755
control 0644
conffiles 0644
md5sums 0644
postinst 0755
preinst 0755
postrm 0755
prerm 0755
shlibs 0644
symbols 0644
templates 0644
triggers 0644 lintian-2.5.22ubuntu1/data/menu-format/ 0000775 0000000 0000000 00000000000 12310413144 014610 5 ustar lintian-2.5.22ubuntu1/data/menu-format/add-categories 0000664 0000000 0000000 00000002615 12310413144 017412 0 ustar # This is a list of all Additional Categories for .desktop files.
#
# It is manually maintained; please keep it sorted.
2DGraphics
3DGraphics
Accessibility
ActionGame
Adult
AdventureGame
Amusement
ArcadeGame
Archiving
Art
ArtificialIntelligence
Astronomy
AudioVideoEditing
Biology
BlocksGame
BoardGame
Building
Calculator
Calendar
CardGame
Chart
Chat
Chemistry
Clock
Compression
ComputerScience
ConsoleOnly
Construction
ContactManagement
Core
Database
DataVisualization
Debugger
DesktopSettings
Dialup
Dictionary
DiscBurning
Documentation
Economy
Electricity
Electronics
Email
Emulator
Engineering
Feed
FileManager
Filesystem
FileTools
FileTransfer
Finance
FlowChart
Geography
Geology
Geoscience
GNOME
GTK
GUIDesigner
HamRadio
HardwareSettings
History
Humanities
IDE
ImageProcessing
InstantMessaging
IRCClient
Java
KDE
KidsGame
Languages
Literature
LogicGame
Maps
Math
MedicalSoftware
Midi
Mixer
Monitor
Motif
Music
News
NumericalAnalysis
OCR
P2P
PackageManager
ParallelComputing
PDA
Photography
Physics
Player
Presentation
Printing
Profiling
ProjectManagement
Publishing
Qt
RasterGraphics
Recorder
RemoteAccess
RevisionControl
Robotics
RolePlaying
Scanning
Security
Sequencer
Shooter
Simulation
Spirituality
Sports
SportsGame
Spreadsheet
StrategyGame
Telephony
TelephonyTools
TerminalEmulator
TextEditor
TextTools
Translation
Tuner
TV
VectorGraphics
VideoConference
Viewer
WebBrowser
WebDevelopment
WordProcessor
XFCE
lintian-2.5.22ubuntu1/data/menu-format/menu-sections 0000664 0000000 0000000 00000003321 12310413144 017323 0 ustar # Data file of all the valid sections a menu item (or submenu) can go in.
#
# Authorative source of menu sections:
# http://www.debian.org/doc/packaging-manuals/menu-policy/ch2#s2.1
#
# This file maps "root sections" to the valid sections in each root
# sections.
#
# Format:
# root-section[/section]
#
# Please keep it sorted.
Applications/Accessibility
Applications/Amateur Radio
Applications/Data Management
Applications/Editors
Applications/Education
Applications/Emulators
Applications/File Management
Applications/Graphics
Applications/Mobile Devices
Applications/Network/Communication
Applications/Network/File Transfer
Applications/Network/Monitoring
Applications/Network/Web Browsing
Applications/Network/Web News
Applications/Office
Applications/Programming
Applications/Project Management
Applications/Science/Astronomy
Applications/Science/Biology
Applications/Science/Chemistry
Applications/Science/Data Analysis
Applications/Science/Electronics
Applications/Science/Engineering
Applications/Science/Geoscience
Applications/Science/Mathematics
Applications/Science/Medicine
Applications/Science/Physics
Applications/Science/Social
Applications/Shells
Applications/Sound
Applications/System/Administration
Applications/System/Hardware
Applications/System/Language Environment
Applications/System/Monitoring
Applications/System/Package Management
Applications/System/Security
Applications/Terminal Emulators
Applications/Text
Applications/TV and Radio
Applications/Video
Applications/Viewers
Applications/Web Development
Games/Action
Games/Adventure
Games/Blocks
Games/Board
Games/Card
Games/Puzzles
Games/Simulation
Games/Strategy
Games/Tools
Games/Toys
Help
Screen/Saving
Screen/Locking
Window Managers
FVWM Modules
Window Maker
lintian-2.5.22ubuntu1/data/debhelper/ 0000775 0000000 0000000 00000000000 12313553047 014322 5 ustar lintian-2.5.22ubuntu1/data/debhelper/maint_commands 0000664 0000000 0000000 00000001036 12313551606 017235 0 ustar dh_apache2
dh_apparmor
dh_cligacpolicy
dh_cme_upgrade
dh_configpackage
dh_consoledata
dh_dkms
dh_icons
dh_installcatalogs
dh_installcliframework
dh_installcligac
dh_installdeb
dh_installdebconf
dh_installemacsen
dh_installinit
dh_installlisting
dh_installmenu
dh_installmodules
dh_installtex
dh_installudev
dh_installwm
dh_installxfonts
dh_installxmlcatalogs
dh_installxsp
dh_installzope
dh_installzopeinstance
dh_makeshlibs
dh_metainit
dh_nativejava
dh_php5
dh_pysupport
dh_suidregister
dh_systemd_enable
dh_systemd_start
dh_ucf
dh_usrlocal
lintian-2.5.22ubuntu1/data/debhelper/dh_addons 0000664 0000000 0000000 00000002322 12313551606 016166 0 ustar acc=dh-acc
ada_library=dh-ada-library
apache2=apache2-dev
aqbanking=libaqbanking34-dev
aspell_simple=dictionaries-common-dev
autoreconf=dh-autoreconf
autotools_dev=autotools-dev
bash_completion=bash-completion
cli=cli-common-dev
cli_nant=cli-common-dev
cme_upgrade=libconfig-model-perl
components=pkg-components
config_package=config-package-dev
d_i=dh-di
dkms=dkms
dpatch=dpatch
eclipse_helper=javahelper
germinate=germinate
gir=gobject-introspection
gnome=gnome-pkg-tools
golang=dh-golang
javahelper=javahelper
jh_maven_repo_helper=maven-repo-helper
kde=pkg-kde-tools
linktree=dh-linktree
lisp=dh-lisp
lua=dh-lua
maven_repo_helper=maven-repo-helper
ocaml=dh-ocaml
parrot=parrot-devel
perl_dbi=libdbi-perl
perl_imager=libimager-perl
php5=dh-php5
phpcomposer=pkg-php-tools
phppear=pkg-php-tools
pkgkde_symbolshelper=pkg-kde-tools
pydeb=python-van.pydeb
pyppd=pyppd
pypy=dh-python
python2=python
python3=dh-python
python_support=debhelper
python_virtualenv=dh-virtualenv
quilt=quilt
rebar=dh-rebar
ruby=gem2deb
scour=python-scour
sodeps=pkg-kde-tools
sphinxdoc=sphinx-common
swi_prolog=swi-prolog-nox
systemd=dh-systemd
tex=tex-common
xine=libxine-dev
xsf=xserver-xorg-dev
xsp=dh-xsp
xul_ext=mozilla-devscripts
xulrunner=xulrunner-dev
lintian-2.5.22ubuntu1/data/debhelper/miscDepends_commands 0000664 0000000 0000000 00000000456 12313551606 020370 0 ustar dh_apache2
dh_cme_upgrade
dh_dkms
dh_gconf
dh_gtkmodules
dh_installcatalogs
dh_installdebconf
dh_installdocs
dh_installgsettings
dh_installlisting
dh_installtex
dh_installxfonts
dh_installxmlcatalogs
dh_linktree
dh_lisp
dh_nativejava
dh_pangomodules
dh_php5
dh_pidgin
dh_pyppd
dh_systemd_enable
dh_ucf
lintian-2.5.22ubuntu1/data/debhelper/dh_addons-manual 0000664 0000000 0000000 00000000640 12310413144 017431 0 ustar # Manually maintained list of dependencies needed for dh addons. This overrides
# information from data/debhelper/dh_addons (the latter file is automatically
# generated).
#
# Please keep this sorted.
lv2config||lv2core
python2||python | python-all | python-dev | python-all-dev
python3||python3 | python3-all | python3-dev | python3-all-dev
python_support||python-support
sphinxdoc||python-sphinx | python3-sphinx
lintian-2.5.22ubuntu1/data/debhelper/dh_packages 0000664 0000000 0000000 00000001647 12313551606 016505 0 ustar apache2-dev
autotools-dev
bash-completion
cli-common-dev
config-package-dev
debhelper
desktop-profiles
dh-acc
dh-ada-library
dh-apparmor
dh-autoreconf
dh-buildinfo
dh-consoledata
dh-di
dh-golang
dh-kpatches
dh-linktree
dh-lisp
dh-lua
dh-make
dh-metainit
dh-ocaml
dh-php5
dh-python
dh-rebar
dh-systemd
dh-virtualenv
dh-xsp
dictionaries-common-dev
dkms
doxygen
dpatch
gcj-jdk
gem2deb
germinate
gnome-pkg-tools
gnustep-make
gobject-introspection
haskell-devscripts
libaqbanking34-dev
libconfig-model-perl
libdbi-perl
libgcj-common
libgstreamer0.10-dev
libgtk2.0-dev
libimager-perl
libpango1.0-dev
libxine-dev
mozilla-devscripts
parrot-devel
pdl
pidgin-dev
pkg-components
pkg-kde-tools
pkg-php-tools
pyppd
python
python-numpy
python-ply
python-scour
python-sip-dev
python-support
python-van.pydeb
python3-numpy
python3-sip-dev
quilt
sphinx-common
swi-prolog-nox
tex-common
xml-core
xserver-xorg-dev
xulrunner-dev
yorick-dev
zope-debhelper
lintian-2.5.22ubuntu1/data/debhelper/dh_commands-manual 0000664 0000000 0000000 00000001405 12310413144 017762 0 ustar # Manually maintained list of dh_commands that requires a versioned
# dependency *AND* are not provided by debhelper. Commands provided
# by debhelper is handled in checks/debhelper.
#
# dh_X||dependency
#
# Note spaces are not allowed around the "||"-separator.
#
# The dh_X is the dh_command and the dependency is the full dependency
# (including both package and version). This overrules any thing
# listed in dh_commands (which is auto-generated).
#
# Please keep this sorted.
dh_lv2config||lv2core
dh_nativejava||gcj-native-helper | default-jdk-builddep
dh_python2||python | python-all | python-dev | python-all-dev
dh_python3||python3 | python3-all | python3-dev | python3-all-dev
dh_sphinxdoc||python-sphinx | python3-sphinx
dh_xine||libxine-dev | libxine2-dev
lintian-2.5.22ubuntu1/data/debhelper/dh_commands 0000664 0000000 0000000 00000010112 12313551606 016513 0 ustar dh_acc=dh-acc
dh_ada_library=dh-ada-library
dh_apache2=apache2-dev
dh_apparmor=dh-apparmor
dh_aqbanking=libaqbanking34-dev
dh_aspell-simple=dictionaries-common-dev
dh_auto_build=debhelper
dh_auto_build_nant=cli-common-dev
dh_auto_clean=debhelper
dh_auto_clean_nant=cli-common-dev
dh_auto_configure=debhelper
dh_auto_install=debhelper
dh_auto_test=debhelper
dh_autoreconf=dh-autoreconf
dh_autoreconf_clean=dh-autoreconf
dh_autotools-dev_restoreconfig=autotools-dev
dh_autotools-dev_updateconfig=autotools-dev
dh_bash-completion=bash-completion
dh_bugfiles=debhelper
dh_builddeb=debhelper
dh_buildinfo=dh-buildinfo
dh_clean=debhelper
dh_clideps=cli-common-dev
dh_clifixperms=cli-common-dev
dh_cligacpolicy=cli-common-dev
dh_clistrip=cli-common-dev
dh_cme_upgrade=libconfig-model-perl
dh_components=pkg-components
dh_compress=debhelper
dh_configpackage=config-package-dev
dh_consoledata=dh-consoledata
dh_desktop=debhelper
dh_di_kernel_gencontrol=dh-di
dh_di_kernel_install=dh-di
dh_di_numbers=dh-di
dh_dkms=dkms
dh_doxygen=doxygen
dh_dpatch_patch=dpatch
dh_dpatch_unpatch=dpatch
dh_fixperms=debhelper
dh_gconf=debhelper
dh_gencontrol=debhelper
dh_germinate_clean=germinate
dh_germinate_metapackage=germinate
dh_girepository=gobject-introspection
dh_gnome=gnome-pkg-tools
dh_gnome_clean=gnome-pkg-tools
dh_gnustep=gnustep-make
dh_golang=dh-golang
dh_gstscancodecs=libgstreamer0.10-dev
dh_gtkmodules=libgtk2.0-dev
dh_haskell_blurbs=haskell-devscripts
dh_haskell_depends=haskell-devscripts
dh_haskell_extra_depends=haskell-devscripts
dh_haskell_provides=haskell-devscripts
dh_haskell_shlibdeps=haskell-devscripts
dh_icons=debhelper
dh_install=debhelper
dh_installcatalogs=debhelper
dh_installchangelogs=debhelper
dh_installcliframework=cli-common-dev
dh_installcligac=cli-common-dev
dh_installcron=debhelper
dh_installdeb=debhelper
dh_installdebconf=debhelper
dh_installdirs=debhelper
dh_installdocs=debhelper
dh_installemacsen=debhelper
dh_installexamples=debhelper
dh_installgsettings=debhelper
dh_installifupdown=debhelper
dh_installinfo=debhelper
dh_installinit=debhelper
dh_installkpatches=dh-kpatches
dh_installlisting=desktop-profiles
dh_installlogcheck=debhelper
dh_installlogrotate=debhelper
dh_installman=debhelper
dh_installmanpages=debhelper
dh_installmenu=debhelper
dh_installmime=debhelper
dh_installmodules=debhelper
dh_installpam=debhelper
dh_installppp=debhelper
dh_installtex=tex-common
dh_installudev=debhelper
dh_installwm=debhelper
dh_installxfonts=debhelper
dh_installxmlcatalogs=xml-core
dh_installxsp=dh-xsp
dh_installyorick=yorick-dev
dh_installzope=zope-debhelper
dh_installzopeinstance=zope-debhelper
dh_javadoc=gcj-jdk
dh_link=debhelper
dh_linktree=dh-linktree
dh_lintian=debhelper
dh_lisp=dh-lisp
dh_listpackages=debhelper
dh_lua=dh-lua
dh_make=dh-make
dh_makeclilibs=cli-common-dev
dh_makeshlibs=debhelper
dh_md5sums=debhelper
dh_metainit=dh-metainit
dh_movefiles=debhelper
dh_movelibkdeinit=pkg-kde-tools
dh_nativejava=libgcj-common
dh_numpy3=python3-numpy
dh_numpy=python-numpy
dh_ocaml=dh-ocaml
dh_ocamlclean=dh-ocaml
dh_ocamldoc=dh-ocaml
dh_ocamlinit=dh-ocaml
dh_pangomodules=libpango1.0-dev
dh_parrot=parrot-devel
dh_pdl=pdl
dh_perl=debhelper
dh_perl_dbi=libdbi-perl
dh_perl_imager=libimager-perl
dh_php5=dh-php5
dh_phpcomposer=pkg-php-tools
dh_phppear=pkg-php-tools
dh_pidgin=pidgin-dev
dh_prep=debhelper
dh_pydeb=python-van.pydeb
dh_pyppd=pyppd
dh_pypy=dh-python
dh_pysupport=python-support
dh_python-ply=python-ply
dh_python2=python
dh_python3=dh-python
dh_quilt_patch=quilt
dh_quilt_unpatch=quilt
dh_rebar=dh-rebar
dh_ruby=gem2deb
dh_ruby_fixdepends=gem2deb
dh_sameversiondep=pkg-kde-tools
dh_scour=python-scour
dh_scrollkeeper=debhelper
dh_shlibdeps=debhelper
dh_sip3=python3-sip-dev
dh_sip=python-sip-dev
dh_sodeps=pkg-kde-tools
dh_sphinxdoc=sphinx-common
dh_strip=debhelper
dh_suidregister=debhelper
dh_swi_prolog=swi-prolog-nox
dh_systemd_enable=dh-systemd
dh_systemd_start=dh-systemd
dh_testdir=debhelper
dh_testroot=debhelper
dh_ucf=debhelper
dh_undocumented=debhelper
dh_usrlocal=debhelper
dh_virtualenv=dh-virtualenv
dh_xine=libxine-dev
dh_xsf_substvars=xserver-xorg-dev
dh_xul-ext=mozilla-devscripts
dh_xulrunner=xulrunner-dev
lintian-2.5.22ubuntu1/data/debhelper/filename-config-files 0000664 0000000 0000000 00000000450 12310413144 020355 0 ustar # This is a list of known debhelper config files which consist of a list
# of filenames. It's used for tests that look for problems in debhelper
# processing of file names, such as using glob characters that aren't
# guaranteed to work.
dirs
docs
examples
info
install
manpages
sgmlcatalogs
wm
lintian-2.5.22ubuntu1/data/output/ 0000775 0000000 0000000 00000000000 12313551606 013727 5 ustar lintian-2.5.22ubuntu1/data/output/manual-references 0000664 0000000 0000000 00000265417 12313551606 017265 0 ustar # Data about titles, sections, and URLs of manuals, used to expand references
# in tag descriptions and add links for HTML output. Each line of this file
# has four fields separated by double colons:
#
# :: :: ::
#
# If is empty, that line specifies the title and URL for the whole
# manual. If is empty, that manual is not available on the web.
#
# Last updated: 2014-03-23
debconf-spec::::Configuration management::http://www.debian.org/doc/packaging-manuals/debconf_specification.html
debconf-spec::aen27::Introduction::http://www.debian.org/doc/packaging-manuals/debconf_specification.html#AEN27
debconf-spec::aen30::Configuration Data::http://www.debian.org/doc/packaging-manuals/debconf_specification.html#AEN30
debconf-spec::aen45::Templates::http://www.debian.org/doc/packaging-manuals/debconf_specification.html#AEN45
debconf-spec::aen101::Configuration frontends::http://www.debian.org/doc/packaging-manuals/debconf_specification.html#AEN101
debconf-spec::aen106::Communication with the frontend::http://www.debian.org/doc/packaging-manuals/debconf_specification.html#AEN106
debconf-spec::aen283::Debian install-time configuration::http://www.debian.org/doc/packaging-manuals/debconf_specification.html#AEN283
devref::::Debian Developer's Reference::http://www.debian.org/doc/developers-reference/
devref::1::Scope of This Document::http://www.debian.org/doc/developers-reference/scope.html
devref::2::Applying to Become a Maintainer::http://www.debian.org/doc/developers-reference/new-maintainer.html
devref::2.1::Getting started::http://www.debian.org/doc/developers-reference/new-maintainer.html#getting-started
devref::2.2::Debian mentors and sponsors::http://www.debian.org/doc/developers-reference/new-maintainer.html#mentors
devref::2.3::Registering as a Debian developer::http://www.debian.org/doc/developers-reference/new-maintainer.html#registering
devref::3::Debian Developer's Duties::http://www.debian.org/doc/developers-reference/developer-duties.html
devref::3.1::Package Maintainer's Duties::http://www.debian.org/doc/developers-reference/developer-duties.html#package-maintainer-duties
devref::3.1.1::Work towards the next stable
release::http://www.debian.org/doc/developers-reference/developer-duties.html#help-release
devref::3.1.2::Maintain packages in stable
::http://www.debian.org/doc/developers-reference/developer-duties.html#maintain-stable
devref::3.1.3::Manage release-critical bugs::http://www.debian.org/doc/developers-reference/developer-duties.html#rc-bugs
devref::3.1.4::Coordination with upstream developers::http://www.debian.org/doc/developers-reference/developer-duties.html#upstream-coordination
devref::3.2::Administrative Duties::http://www.debian.org/doc/developers-reference/developer-duties.html#administrative-duties
devref::3.2.1::Maintaining your Debian information::http://www.debian.org/doc/developers-reference/developer-duties.html#user-maint
devref::3.2.2::Maintaining your public key::http://www.debian.org/doc/developers-reference/developer-duties.html#key-maint
devref::3.2.3::Voting::http://www.debian.org/doc/developers-reference/developer-duties.html#voting
devref::3.2.4::Going on vacation gracefully::http://www.debian.org/doc/developers-reference/developer-duties.html#inform-vacation
devref::3.2.5::Retiring::http://www.debian.org/doc/developers-reference/developer-duties.html#s3.7
devref::3.2.6::Returning after retirement::http://www.debian.org/doc/developers-reference/developer-duties.html#returning
devref::4::Resources for Debian Developers::http://www.debian.org/doc/developers-reference/resources.html
devref::4.1::Mailing lists::http://www.debian.org/doc/developers-reference/resources.html#mailing-lists
devref::4.1.1::Basic rules for use::http://www.debian.org/doc/developers-reference/resources.html#mailing-lists-rules
devref::4.1.2::Core development mailing lists::http://www.debian.org/doc/developers-reference/resources.html#core-devel-mailing-lists
devref::4.1.3::Special lists::http://www.debian.org/doc/developers-reference/resources.html#mailing-lists-special
devref::4.1.4::Requesting new development-related lists::http://www.debian.org/doc/developers-reference/resources.html#mailing-lists-new
devref::4.2::IRC channels::http://www.debian.org/doc/developers-reference/resources.html#irc-channels
devref::4.3::Documentation::http://www.debian.org/doc/developers-reference/resources.html#doc-rsrcs
devref::4.4::Debian machines::http://www.debian.org/doc/developers-reference/resources.html#server-machines
devref::4.4.1::The bugs server::http://www.debian.org/doc/developers-reference/resources.html#servers-bugs
devref::4.4.2::The ftp-master server::http://www.debian.org/doc/developers-reference/resources.html#servers-ftp-master
devref::4.4.3::The www-master server::http://www.debian.org/doc/developers-reference/resources.html#servers-www
devref::4.4.4::The people web server::http://www.debian.org/doc/developers-reference/resources.html#servers-people
devref::4.4.5::The VCS servers::http://www.debian.org/doc/developers-reference/resources.html#servers-vcs
devref::4.4.6::chroots to different distributions::http://www.debian.org/doc/developers-reference/resources.html#dchroot
devref::4.5::The Developers Database::http://www.debian.org/doc/developers-reference/resources.html#devel-db
devref::4.6::The Debian archive::http://www.debian.org/doc/developers-reference/resources.html#archive
devref::4.6.1::Sections::http://www.debian.org/doc/developers-reference/resources.html#archive-sections
devref::4.6.2::Architectures::http://www.debian.org/doc/developers-reference/resources.html#s4.6.2
devref::4.6.3::Packages::http://www.debian.org/doc/developers-reference/resources.html#s4.6.3
devref::4.6.4::Distributions::http://www.debian.org/doc/developers-reference/resources.html#s4.6.4
devref::4.6.5::Release code names::http://www.debian.org/doc/developers-reference/resources.html#codenames
devref::4.7::Debian mirrors::http://www.debian.org/doc/developers-reference/resources.html#mirrors
devref::4.8::The Incoming system::http://www.debian.org/doc/developers-reference/resources.html#incoming-system
devref::4.9::Package information::http://www.debian.org/doc/developers-reference/resources.html#pkg-info
devref::4.9.1::On the web::http://www.debian.org/doc/developers-reference/resources.html#pkg-info-web
devref::4.9.2::The dak ls utility::http://www.debian.org/doc/developers-reference/resources.html#dak-ls
devref::4.10::The Package Tracking System::http://www.debian.org/doc/developers-reference/resources.html#pkg-tracking-system
devref::4.10.1::The PTS email interface::http://www.debian.org/doc/developers-reference/resources.html#pts-commands
devref::4.10.2::Filtering PTS mails::http://www.debian.org/doc/developers-reference/resources.html#pts-mail-filtering
devref::4.10.3::Forwarding VCS commits in the PTS::http://www.debian.org/doc/developers-reference/resources.html#pts-vcs-commit
devref::4.10.4::The PTS web interface::http://www.debian.org/doc/developers-reference/resources.html#pts-web
devref::4.11::Developer's packages overview::http://www.debian.org/doc/developers-reference/resources.html#ddpo
devref::4.12::Debian's FusionForge installation: Alioth::http://www.debian.org/doc/developers-reference/resources.html#alioth
devref::4.13::Goodies for Developers::http://www.debian.org/doc/developers-reference/resources.html#developer-misc
devref::4.13.1::LWN Subscriptions::http://www.debian.org/doc/developers-reference/resources.html#lwn
devref::4.13.2::Gandi.net Hosting Discount::http://www.debian.org/doc/developers-reference/resources.html#gandi
devref::5::Managing Packages::http://www.debian.org/doc/developers-reference/pkgs.html
devref::5.1::New packages::http://www.debian.org/doc/developers-reference/pkgs.html#newpackage
devref::5.2::Recording changes in the package::http://www.debian.org/doc/developers-reference/pkgs.html#changelog-entries
devref::5.3::Testing the package::http://www.debian.org/doc/developers-reference/pkgs.html#sanitycheck
devref::5.4::Layout of the source package::http://www.debian.org/doc/developers-reference/pkgs.html#sourcelayout
devref::5.5::Picking a distribution::http://www.debian.org/doc/developers-reference/pkgs.html#distribution
devref::5.5.1::Special case: uploads to the stable
and oldstable
distributions::http://www.debian.org/doc/developers-reference/pkgs.html#upload-stable
devref::5.5.2::Special case: uploads to testing/testing-proposed-updates
::http://www.debian.org/doc/developers-reference/pkgs.html#upload-t-p-u
devref::5.6::Uploading a package::http://www.debian.org/doc/developers-reference/pkgs.html#upload
devref::5.6.1::Uploading to ftp-master
::http://www.debian.org/doc/developers-reference/pkgs.html#upload-ftp-master
devref::5.6.2::Delayed uploads::http://www.debian.org/doc/developers-reference/pkgs.html#delayed-incoming
devref::5.6.3::Security uploads::http://www.debian.org/doc/developers-reference/pkgs.html#s5.6.4
devref::5.6.4::Other upload queues::http://www.debian.org/doc/developers-reference/pkgs.html#s5.6.5
devref::5.6.5::Notification that a new package has been installed::http://www.debian.org/doc/developers-reference/pkgs.html#upload-notification
devref::5.7::Specifying the package section, subsection and priority::http://www.debian.org/doc/developers-reference/pkgs.html#override-file
devref::5.8::Handling bugs::http://www.debian.org/doc/developers-reference/pkgs.html#bug-handling
devref::5.8.1::Monitoring bugs::http://www.debian.org/doc/developers-reference/pkgs.html#bug-monitoring
devref::5.8.2::Responding to bugs::http://www.debian.org/doc/developers-reference/pkgs.html#bug-answering
devref::5.8.3::Bug housekeeping::http://www.debian.org/doc/developers-reference/pkgs.html#bug-housekeeping
devref::5.8.4::When bugs are closed by new uploads::http://www.debian.org/doc/developers-reference/pkgs.html#upload-bugfix
devref::5.8.5::Handling security-related bugs::http://www.debian.org/doc/developers-reference/pkgs.html#bug-security
devref::5.9::Moving, removing, renaming, orphaning, adopting, and reintroducing packages::http://www.debian.org/doc/developers-reference/pkgs.html#archive-manip
devref::5.9.1::Moving packages::http://www.debian.org/doc/developers-reference/pkgs.html#moving-pkgs
devref::5.9.2::Removing packages::http://www.debian.org/doc/developers-reference/pkgs.html#removing-pkgs
devref::5.9.3::Replacing or renaming packages::http://www.debian.org/doc/developers-reference/pkgs.html#s5.9.3
devref::5.9.4::Orphaning a package::http://www.debian.org/doc/developers-reference/pkgs.html#orphaning
devref::5.9.5::Adopting a package::http://www.debian.org/doc/developers-reference/pkgs.html#adopting
devref::5.9.6::Reintroducing packages::http://www.debian.org/doc/developers-reference/pkgs.html#reintroducing-pkgs
devref::5.10::Porting and being ported::http://www.debian.org/doc/developers-reference/pkgs.html#porting
devref::5.10.1::Being kind to porters::http://www.debian.org/doc/developers-reference/pkgs.html#kind-to-porters
devref::5.10.2::Guidelines for porter uploads::http://www.debian.org/doc/developers-reference/pkgs.html#porter-guidelines
devref::5.10.3::Porting infrastructure and automation::http://www.debian.org/doc/developers-reference/pkgs.html#porter-automation
devref::5.10.4::When your package is not portable::http://www.debian.org/doc/developers-reference/pkgs.html#packages-arch-specific
devref::5.10.5::Marking non-free packages as auto-buildable::http://www.debian.org/doc/developers-reference/pkgs.html#non-free-buildd
devref::5.11::Non-Maintainer Uploads (NMUs)::http://www.debian.org/doc/developers-reference/pkgs.html#nmu
devref::5.11.1::When and how to do an NMU::http://www.debian.org/doc/developers-reference/pkgs.html#nmu-guidelines
devref::5.11.2::NMUs and debian/changelog
::http://www.debian.org/doc/developers-reference/pkgs.html#nmu-changelog
devref::5.11.3::Using the DELAYED/
queue::http://www.debian.org/doc/developers-reference/pkgs.html#nmu-delayed
devref::5.11.4::NMUs from the maintainer's point of view::http://www.debian.org/doc/developers-reference/pkgs.html#nmu-maintainer
devref::5.11.5::Source NMUs vs Binary-only NMUs (binNMUs)::http://www.debian.org/doc/developers-reference/pkgs.html#nmu-binnmu
devref::5.11.6::NMUs vs QA uploads::http://www.debian.org/doc/developers-reference/pkgs.html#nmu-qa-upload
devref::5.11.7::NMUs vs team uploads::http://www.debian.org/doc/developers-reference/pkgs.html#nmu-team-upload
devref::5.12::Collaborative maintenance::http://www.debian.org/doc/developers-reference/pkgs.html#collaborative-maint
devref::5.13::The testing distribution::http://www.debian.org/doc/developers-reference/pkgs.html#testing
devref::5.13.1::Basics::http://www.debian.org/doc/developers-reference/pkgs.html#testing-basics
devref::5.13.2::Updates from unstable::http://www.debian.org/doc/developers-reference/pkgs.html#testing-unstable
devref::5.13.3::Direct updates to testing::http://www.debian.org/doc/developers-reference/pkgs.html#t-p-u
devref::5.13.4::Frequently asked questions::http://www.debian.org/doc/developers-reference/pkgs.html#faq
devref::6::Best Packaging Practices::http://www.debian.org/doc/developers-reference/best-pkging-practices.html
devref::6.1::Best practices for debian/rules
::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-debian-rules
devref::6.1.1::Helper scripts::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#helper-scripts
devref::6.1.2::Separating your patches into multiple files::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#multiple-patches
devref::6.1.3::Multiple binary packages::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#multiple-binary
devref::6.2::Best practices for debian/control
::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-debian-control
devref::6.2.1::General guidelines for package descriptions::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-desc-basics
devref::6.2.2::The package synopsis, or short description::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-pkg-synopsis
devref::6.2.3::The long description::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-pkg-desc
devref::6.2.4::Upstream home page::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-upstream-info
devref::6.2.5::Version Control System location::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-vcs
devref::6.3::Best practices for debian/changelog
::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-debian-changelog
devref::6.3.1::Writing useful changelog entries::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-changelog-do
devref::6.3.2::Common misconceptions about changelog entries::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-changelog-misconceptions
devref::6.3.3::Common errors in changelog entries::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-changelog-errors
devref::6.3.4::Supplementing changelogs with NEWS.Debian
files::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-news-debian
devref::6.4::Best practices for maintainer scripts::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-debian-maint-scripts
devref::6.5::Configuration management with debconf
::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-config-mgmt
devref::6.5.1::Do not abuse debconf::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.1
devref::6.5.2::General recommendations for authors and translators::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.2
devref::6.5.3::Templates fields definition::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3
devref::6.5.4::Templates fields specific style guide::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.4
devref::6.6::Internationalization::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-i18n
devref::6.6.1::Handling debconf translations::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-i18n-debconf
devref::6.6.2::Internationalized documentation::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-i18n-docs
devref::6.7::Common packaging situations::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-common-situations
devref::6.7.1::Packages using autoconf/automake::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-autotools
devref::6.7.2::Libraries::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-libraries
devref::6.7.3::Documentation::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-docs
devref::6.7.4::Specific types of packages::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-other
devref::6.7.5::Architecture-independent data::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-archindepdata
devref::6.7.6::Needing a certain locale during build::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-locale
devref::6.7.7::Make transition packages deborphan compliant::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-transition
devref::6.7.8::Best practices for .orig.tar.{gz,bz2,xz}
files::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-origtargz
devref::6.7.9::Best practices for debug packages::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-dbg
devref::6.7.10::Best practices for meta-packages::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#bpp-meta
devref::7::Beyond Packaging::http://www.debian.org/doc/developers-reference/beyond-pkging.html
devref::7.1::Bug reporting::http://www.debian.org/doc/developers-reference/beyond-pkging.html#submit-bug
devref::7.1.1::Reporting lots of bugs at once (mass bug filing)::http://www.debian.org/doc/developers-reference/beyond-pkging.html#submit-many-bugs
devref::7.2::Quality Assurance effort::http://www.debian.org/doc/developers-reference/beyond-pkging.html#qa-effort
devref::7.2.1::Daily work::http://www.debian.org/doc/developers-reference/beyond-pkging.html#qa-daily-work
devref::7.2.2::Bug squashing parties::http://www.debian.org/doc/developers-reference/beyond-pkging.html#qa-bsp
devref::7.3::Contacting other maintainers::http://www.debian.org/doc/developers-reference/beyond-pkging.html#contacting-maintainers
devref::7.4::Dealing with inactive and/or unreachable maintainers::http://www.debian.org/doc/developers-reference/beyond-pkging.html#mia-qa
devref::7.5::Interacting with prospective Debian developers::http://www.debian.org/doc/developers-reference/beyond-pkging.html#newmaint
devref::7.5.1::Sponsoring packages::http://www.debian.org/doc/developers-reference/beyond-pkging.html#sponsoring
devref::7.5.2::Advocating new developers::http://www.debian.org/doc/developers-reference/beyond-pkging.html#advocating-new-developers
devref::7.5.3::Handling new maintainer applications::http://www.debian.org/doc/developers-reference/beyond-pkging.html#become-application-manager
devref::8::Internationalization and Translations::http://www.debian.org/doc/developers-reference/l10n.html
devref::8.1::How translations are handled within Debian::http://www.debian.org/doc/developers-reference/l10n.html#l10n-handling
devref::8.2::I18N & L10N FAQ for maintainers::http://www.debian.org/doc/developers-reference/l10n.html#l10n-faqm
devref::8.2.1::How to get a given text translated::http://www.debian.org/doc/developers-reference/l10n.html#l10n-faqm-tr
devref::8.2.2::How to get a given translation reviewed::http://www.debian.org/doc/developers-reference/l10n.html#l10n-faqm-rev
devref::8.2.3::How to get a given translation updated::http://www.debian.org/doc/developers-reference/l10n.html#l10n-faqm-update
devref::8.2.4::How to handle a bug report concerning a translation::http://www.debian.org/doc/developers-reference/l10n.html#l10n-faqm-bug
devref::8.3::I18N & L10N FAQ for translators::http://www.debian.org/doc/developers-reference/l10n.html#l10n-faqtr
devref::8.3.1::How to help the translation effort::http://www.debian.org/doc/developers-reference/l10n.html#l10n-faqtr-help
devref::8.3.2::How to provide a translation for inclusion in a package::http://www.debian.org/doc/developers-reference/l10n.html#l10n-faqtr-inc
devref::8.4::Best current practice concerning l10n::http://www.debian.org/doc/developers-reference/l10n.html#l10n-best
devref::A::Overview of Debian Maintainer Tools::http://www.debian.org/doc/developers-reference/tools.html
devref::A.1::Core tools::http://www.debian.org/doc/developers-reference/tools.html#tools-core
devref::A.1.1::dpkg-dev
::http://www.debian.org/doc/developers-reference/tools.html#dpkg-dev
devref::A.1.2::debconf
::http://www.debian.org/doc/developers-reference/tools.html#debconf
devref::A.1.3::fakeroot
::http://www.debian.org/doc/developers-reference/tools.html#fakeroot
devref::A.2::Package lint tools::http://www.debian.org/doc/developers-reference/tools.html#tools-lint
devref::A.2.1::lintian
::http://www.debian.org/doc/developers-reference/tools.html#lintian
devref::A.2.2::debdiff::http://www.debian.org/doc/developers-reference/tools.html#debdiff
devref::A.3::Helpers for debian/rules
::http://www.debian.org/doc/developers-reference/tools.html#tools-helpers
devref::A.3.1::debhelper
::http://www.debian.org/doc/developers-reference/tools.html#debhelper
devref::A.3.2::dh-make
::http://www.debian.org/doc/developers-reference/tools.html#dh-make
devref::A.3.3::equivs
::http://www.debian.org/doc/developers-reference/tools.html#equivs
devref::A.4::Package builders::http://www.debian.org/doc/developers-reference/tools.html#tools-builders
devref::A.4.1::cvs-buildpackage
::http://www.debian.org/doc/developers-reference/tools.html#cvs-buildpackage
devref::A.4.2::debootstrap
::http://www.debian.org/doc/developers-reference/tools.html#debootstrap
devref::A.4.3::pbuilder
::http://www.debian.org/doc/developers-reference/tools.html#pbuilder
devref::A.4.4::sbuild
::http://www.debian.org/doc/developers-reference/tools.html#sbuild
devref::A.5::Package uploaders::http://www.debian.org/doc/developers-reference/tools.html#uploaders
devref::A.5.1::dupload
::http://www.debian.org/doc/developers-reference/tools.html#dupload
devref::A.5.2::dput
::http://www.debian.org/doc/developers-reference/tools.html#dput
devref::A.5.3::dcut::http://www.debian.org/doc/developers-reference/tools.html#dcut
devref::A.6::Maintenance automation::http://www.debian.org/doc/developers-reference/tools.html#tools-maint-automate
devref::A.6.1::devscripts
::http://www.debian.org/doc/developers-reference/tools.html#devscripts
devref::A.6.2::autotools-dev
::http://www.debian.org/doc/developers-reference/tools.html#autotools-dev
devref::A.6.3::dpkg-repack
::http://www.debian.org/doc/developers-reference/tools.html#dpkg-repack
devref::A.6.4::alien
::http://www.debian.org/doc/developers-reference/tools.html#alien
devref::A.6.5::debsums
::http://www.debian.org/doc/developers-reference/tools.html#debsums
devref::A.6.6::dpkg-dev-el
::http://www.debian.org/doc/developers-reference/tools.html#dpkg-dev-el
devref::A.6.7::dpkg-depcheck::http://www.debian.org/doc/developers-reference/tools.html#dpkg-depcheck
devref::A.7::Porting tools::http://www.debian.org/doc/developers-reference/tools.html#tools-porting
devref::A.7.1::quinn-diff
::http://www.debian.org/doc/developers-reference/tools.html#quinn-diff
devref::A.7.2::dpkg-cross
::http://www.debian.org/doc/developers-reference/tools.html#dpkg-cross
devref::A.8::Documentation and information::http://www.debian.org/doc/developers-reference/tools.html#tools-doc
devref::A.8.1::docbook-xml
::http://www.debian.org/doc/developers-reference/tools.html#docbook-xml
devref::A.8.2::debiandoc-sgml
::http://www.debian.org/doc/developers-reference/tools.html#debiandoc-sgml
devref::A.8.3::debian-keyring
::http://www.debian.org/doc/developers-reference/tools.html#debian-keyring
devref::A.8.4::debian-maintainers
::http://www.debian.org/doc/developers-reference/tools.html#debian-maintainers
devref::A.8.5::debview
::http://www.debian.org/doc/developers-reference/tools.html#debview
devref::4.6.4.1::Stable, testing, and unstable::http://www.debian.org/doc/developers-reference/resources.html#sec-dists
devref::4.6.4.2::More information about the testing distribution::http://www.debian.org/doc/developers-reference/resources.html#s4.6.4.2
devref::4.6.4.3::Experimental::http://www.debian.org/doc/developers-reference/resources.html#experimental
devref::5.8.5.1::The Security Tracker::http://www.debian.org/doc/developers-reference/pkgs.html#bug-security-tracker
devref::5.8.5.2::Confidentiality::http://www.debian.org/doc/developers-reference/pkgs.html#bug-security-confidentiality
devref::5.8.5.3::Security Advisories::http://www.debian.org/doc/developers-reference/pkgs.html#bug-security-advisories
devref::5.8.5.4::Preparing packages to address security issues::http://www.debian.org/doc/developers-reference/pkgs.html#bug-security-building
devref::5.8.5.5::Uploading the fixed package::http://www.debian.org/doc/developers-reference/pkgs.html#bug-security-upload
devref::5.9.2.1::Removing packages from Incoming
::http://www.debian.org/doc/developers-reference/pkgs.html#s5.9.2.1
devref::5.10.2.1::Recompilation or binary-only NMU::http://www.debian.org/doc/developers-reference/pkgs.html#binary-only-nmu
devref::5.10.2.2::When to do a source NMU if you are a porter::http://www.debian.org/doc/developers-reference/pkgs.html#source-nmu-when-porter
devref::5.10.3.1::Mailing lists and web pages::http://www.debian.org/doc/developers-reference/pkgs.html#s5.10.3.1
devref::5.10.3.2::Porter tools::http://www.debian.org/doc/developers-reference/pkgs.html#s5.10.3.2
devref::5.10.3.3::wanna-build
::http://www.debian.org/doc/developers-reference/pkgs.html#wanna-build
devref::5.13.2.1::Out-of-date::http://www.debian.org/doc/developers-reference/pkgs.html#outdated
devref::5.13.2.2::Removals from testing::http://www.debian.org/doc/developers-reference/pkgs.html#removals
devref::5.13.2.3::Circular dependencies::http://www.debian.org/doc/developers-reference/pkgs.html#circular
devref::5.13.2.4::Influence of package in testing::http://www.debian.org/doc/developers-reference/pkgs.html#s5.13.2.4
devref::5.13.2.5::Details::http://www.debian.org/doc/developers-reference/pkgs.html#details
devref::5.13.4.1::What are release-critical bugs, and how do they get counted?::http://www.debian.org/doc/developers-reference/pkgs.html#rc
devref::5.13.4.2::How could installing a package into testing
possibly break other packages?::http://www.debian.org/doc/developers-reference/pkgs.html#s5.13.4.2
devref::6.2.5.1::Vcs-Browser::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.2.5.1
devref::6.2.5.2::Vcs-*::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.2.5.2
devref::6.5.2.1::Write correct English::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.2.1
devref::6.5.2.2::Be kind to translators::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.2.2
devref::6.5.2.3::Unfuzzy complete translations when correcting typos and spelling::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.2.3
devref::6.5.2.4::Do not make assumptions about interfaces::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.2.4
devref::6.5.2.5::Do not use first person::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.2.5
devref::6.5.2.6::Be gender neutral::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.2.6
devref::6.5.3.1::Type::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3.1
devref::6.5.3.1.1::string::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3.1.1
devref::6.5.3.1.2::password::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3.1.2
devref::6.5.3.1.3::boolean::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3.1.3
devref::6.5.3.1.4::select::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3.1.4
devref::6.5.3.1.5::multiselect::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3.1.5
devref::6.5.3.1.6::note::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3.1.6
devref::6.5.3.1.7::text::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3.1.7
devref::6.5.3.1.8::error::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3.1.8
devref::6.5.3.2::Description: short and extended description::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3.2
devref::6.5.3.3::Choices::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3.3
devref::6.5.3.4::Default::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.3.4
devref::6.5.4.1::Type field::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.4.1
devref::6.5.4.2::Description field::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.4.2
devref::6.5.4.2.1::String/password templates::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.4.2.1
devref::6.5.4.2.2::Boolean templates::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.4.2.2
devref::6.5.4.2.3::Select/Multiselect::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.4.2.3
devref::6.5.4.2.4::Notes::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.4.2.4
devref::6.5.4.3::Choices field::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.4.3
devref::6.5.4.4::Default field::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.4.4
devref::6.5.4.5::Default field::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#s6.5.4.5
devref::6.7.8.1::Pristine source::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#pristinesource
devref::6.7.8.2::Repackaged upstream source::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#repackagedorigtargz
devref::6.7.8.3::Changing binary files::http://www.debian.org/doc/developers-reference/best-pkging-practices.html#changed-binfiles
devref::7.1.1.1::Usertags::http://www.debian.org/doc/developers-reference/beyond-pkging.html#usertags
devref::7.5.1.1::Sponsoring a new package::http://www.debian.org/doc/developers-reference/beyond-pkging.html#sponsoring-new-package
devref::7.5.1.2::Sponsoring an update of an existing package::http://www.debian.org/doc/developers-reference/beyond-pkging.html#sponsoring-update
doc-base::::Debian doc-base Manual::
doc-base::1::About doc-base
::
doc-base::2::The packages interface::
doc-base::2.1::Introduction::
doc-base::2.2::Document IDs::
doc-base::2.3::Control Files::
doc-base::2.3.1::Example::
doc-base::2.3.2::Syntax of the control file::
doc-base::2.3.2.1::The main section::
doc-base::2.3.2.2::Format sections::
doc-base::2.3.3::The section field::
doc-base::2.4::Registering Documents With doc-base
::
doc-base::2.5::doc-base 0.8.x features and incompatibilities::
doc-base::2.5.1::Splitting control files over multiple binary packages::
doc-base::2.5.2::Registering local documents::
doc-base::2.5.3::dpkg triggers::
doc-base::2.6::Checking Syntax of Control Files::
doc-base::3::Getting information about installed documents::
doc-base::4::TODO List::
doc-base::4.1::Roadmap for 0.9.* releases::
doc-base::4.2::Old TODO entries::
fhs::::Filesystem Hierarchy Standard::http://www.pathname.com/fhs/pub/fhs-2.3.html
fhs::introduction::Introduction::http://www.pathname.com/fhs/pub/fhs-2.3.html#INTRODUCTION
fhs::purpose::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE
fhs::conventions::Conventions::http://www.pathname.com/fhs/pub/fhs-2.3.html#CONVENTIONS
fhs::thefilesystem::The Filesystem::http://www.pathname.com/fhs/pub/fhs-2.3.html#THEFILESYSTEM
fhs::therootfilesystem::The Root Filesystem::http://www.pathname.com/fhs/pub/fhs-2.3.html#THEROOTFILESYSTEM
fhs::purpose2::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE2
fhs::requirements::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS
fhs::specificoptions::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS
fhs::binessentialusercommandbinaries::/bin : Essential user command binaries (for use by all users)::http://www.pathname.com/fhs/pub/fhs-2.3.html#BINESSENTIALUSERCOMMANDBINARIES
fhs::purpose3::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE3
fhs::requirements2::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS2
fhs::specificoptions2::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS2
fhs::bootstaticfilesofthebootloader::/boot : Static files of the boot loader::http://www.pathname.com/fhs/pub/fhs-2.3.html#BOOTSTATICFILESOFTHEBOOTLOADER
fhs::purpose4::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE4
fhs::specificoptions3::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS3
fhs::devdevicefiles::/dev : Device files::http://www.pathname.com/fhs/pub/fhs-2.3.html#DEVDEVICEFILES
fhs::purpose5::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE5
fhs::specificoptions4::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS4
fhs::etchostspecificsystemconfiguration::/etc : Host-specific system configuration::http://www.pathname.com/fhs/pub/fhs-2.3.html#ETCHOSTSPECIFICSYSTEMCONFIGURATION
fhs::purpose6::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE6
fhs::requirements3::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS3
fhs::specificoptions5::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS5
fhs::etcoptconfigurationfilesforopt::/etc/opt : Configuration files for /opt::http://www.pathname.com/fhs/pub/fhs-2.3.html#ETCOPTCONFIGURATIONFILESFOROPT
fhs::etcx11configurationforthexwindows::/etc/X11 : Configuration for the X Window System (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#ETCX11CONFIGURATIONFORTHEXWINDOWS
fhs::etcsgmlconfigurationfilesforsgmlan::/etc/sgml : Configuration files for SGML (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#ETCSGMLCONFIGURATIONFILESFORSGMLAN
fhs::aen795::/etc/xml : Configuration files for XML (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#AEN795
fhs::homeuserhomedirectories::/home : User home directories (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#HOMEUSERHOMEDIRECTORIES
fhs::purpose10::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE10
fhs::requirements4a::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS4A
fhs::libessentialsharedlibrariesandkern::/lib : Essential shared libraries and kernel modules::http://www.pathname.com/fhs/pub/fhs-2.3.html#LIBESSENTIALSHAREDLIBRARIESANDKERN
fhs::purpose11::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE11
fhs::requirements5::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS5
fhs::specificoptions7::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS7
fhs::libltqualgtalternateformatessential::/lib<qual> : Alternate format essential shared libraries (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#LIBLTQUALGTALTERNATEFORMATESSENTIAL
fhs::purpose12::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE12
fhs::requirements6::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS6
fhs::mediamountpoint::/media : Mount point for removeable media::http://www.pathname.com/fhs/pub/fhs-2.3.html#MEDIAMOUNTPOINT
fhs::purposemediamountpoint::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSEMEDIAMOUNTPOINT
fhs::specificoptionsmediamount::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONSMEDIAMOUNT
fhs::mntmountpointforatemporarilymount::/mnt : Mount point for a temporarily mounted filesystem::http://www.pathname.com/fhs/pub/fhs-2.3.html#MNTMOUNTPOINTFORATEMPORARILYMOUNT
fhs::purpose13::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE13
fhs::optaddonapplicationsoftwarepackages::/opt : Add-on application software packages::http://www.pathname.com/fhs/pub/fhs-2.3.html#OPTADDONAPPLICATIONSOFTWAREPACKAGES
fhs::purpose14::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE14
fhs::requirements7::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS7
fhs::roothomedirectoryfortherootuser::/root : Home directory for the root user (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#ROOTHOMEDIRECTORYFORTHEROOTUSER
fhs::purpose15::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE15
fhs::sbinsystembinaries::/sbin : System binaries::http://www.pathname.com/fhs/pub/fhs-2.3.html#SBINSYSTEMBINARIES
fhs::purpose16::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE16
fhs::requirements8::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS8
fhs::specificoptions8::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS8
fhs::srvdataforservicesprovidedbysystem::/srv : Data for services provided by this system::http://www.pathname.com/fhs/pub/fhs-2.3.html#SRVDATAFORSERVICESPROVIDEDBYSYSTEM
fhs::purpose16a::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE16A
fhs::tmptemporaryfiles::/tmp : Temporary files::http://www.pathname.com/fhs/pub/fhs-2.3.html#TMPTEMPORARYFILES
fhs::purpose17::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE17
fhs::theusrhierarchy::The /usr Hierarchy::http://www.pathname.com/fhs/pub/fhs-2.3.html#THEUSRHIERARCHY
fhs::purpose18::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE18
fhs::requirements9::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS9
fhs::specificoptions9::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS9
fhs::usrx11r6xwindowsystemversion11rel::/usr/X11R6 : X Window System, Version 11 Release 6 (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRX11R6XWINDOWSYSTEMVERSION11REL
fhs::purpose19::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE19
fhs::specificoptions10::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS10
fhs::usrbinmostusercommands::/usr/bin : Most user commands::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRBINMOSTUSERCOMMANDS
fhs::purpose20::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE20
fhs::specificoptions11::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS11
fhs::usrincludedirectoryforstandardinclu::/usr/include : Directory for standard include files.::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRINCLUDEDIRECTORYFORSTANDARDINCLU
fhs::purpose21::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE21
fhs::specificoptions12::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS12
fhs::usrliblibrariesforprogrammingandpa::/usr/lib : Libraries for programming and packages::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRLIBLIBRARIESFORPROGRAMMINGANDPA
fhs::purpose22::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE22
fhs::specificoptions13::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS13
fhs::usrlibltqualgtalternateformatlibrari::/usr/lib<qual> : Alternate format libraries (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRLIBLTQUALGTALTERNATEFORMATLIBRARI
fhs::purpose23::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE23
fhs::usrlocallocalhierarchy::/usr/local : Local hierarchy::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRLOCALLOCALHIERARCHY
fhs::usrlocalshare1::/usr/local/share::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRLOCALSHARE1
fhs::usrsbinnonessentialstandardsystembi::/usr/sbin : Non-essential standard system binaries::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRSBINNONESSENTIALSTANDARDSYSTEMBI
fhs::purpose25::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE25
fhs::usrsharearchitectureindependentdata::/usr/share : Architecture-independent data::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRSHAREARCHITECTUREINDEPENDENTDATA
fhs::purpose26::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE26
fhs::requirements11::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS11
fhs::specificoptions15::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS15
fhs::usrsharedictwordlists::/usr/share/dict : Word lists (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRSHAREDICTWORDLISTS
fhs::usrsharemanmanualpages::/usr/share/man : Manual pages::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRSHAREMANMANUALPAGES
fhs::usrsharemiscmiscellaneousarchitecture::/usr/share/misc : Miscellaneous architecture-independent data::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRSHAREMISCMISCELLANEOUSARCHITECTURE
fhs::usrsharesgmlsgmlandxmldata::/usr/share/sgml : SGML data (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRSHARESGMLSGMLANDXMLDATA
fhs::aen2007::/usr/share/xml : XML data (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#AEN2007
fhs::usrsrcsourcecode::/usr/src : Source code (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRSRCSOURCECODE
fhs::purpose30::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE30
fhs::thevarhierarchy::The /var Hierarchy::http://www.pathname.com/fhs/pub/fhs-2.3.html#THEVARHIERARCHY
fhs::purpose31::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE31
fhs::requirements12::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS12
fhs::specificoptions20::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS20
fhs::varaccountprocessaccountinglogs::/var/account : Process accounting logs (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARACCOUNTPROCESSACCOUNTINGLOGS
fhs::purpose32::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE32
fhs::varcacheapplicationcachedata::/var/cache : Application cache data::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARCACHEAPPLICATIONCACHEDATA
fhs::purpose33::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE33
fhs::specificoptions21::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS21
fhs::varcachefontslocallygeneratedfonts::/var/cache/fonts : Locally-generated fonts (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARCACHEFONTSLOCALLYGENERATEDFONTS
fhs::varcachemanlocallyformattedmanualpag::/var/cache/man : Locally-formatted manual pages (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARCACHEMANLOCALLYFORMATTEDMANUALPAG
fhs::varcrashsystemcrashdumps::/var/crash : System crash dumps (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARCRASHSYSTEMCRASHDUMPS
fhs::purpose36::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE36
fhs::vargamesvariablegamedata::/var/games : Variable game data (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARGAMESVARIABLEGAMEDATA
fhs::purpose37::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE37
fhs::varlibvariablestateinformation::/var/lib : Variable state information::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARLIBVARIABLESTATEINFORMATION
fhs::purpose38::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE38
fhs::requirements13::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS13
fhs::specificoptions23::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS23
fhs::varliblteditorgteditorbackupfilesan::/var/lib/<editor> : Editor backup files and state (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARLIBLTEDITORGTEDITORBACKUPFILESAN
fhs::varlibhwclockstatedirectoryforhwclo::/var/lib/hwclock : State directory for hwclock (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARLIBHWCLOCKSTATEDIRECTORYFORHWCLO
fhs::varlibmiscmiscellaneousvariabledata::/var/lib/misc : Miscellaneous variable data::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARLIBMISCMISCELLANEOUSVARIABLEDATA
fhs::varlocklockfiles::/var/lock : Lock files::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARLOCKLOCKFILES
fhs::purpose42::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE42
fhs::varloglogfilesanddirectories::/var/log : Log files and directories::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARLOGLOGFILESANDDIRECTORIES
fhs::purpose43::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE43
fhs::specificoptions24::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS24
fhs::varmailusermailboxfiles::/var/mail : User mailbox files (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARMAILUSERMAILBOXFILES
fhs::purpose44::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE44
fhs::varoptvariabledataforopt::/var/opt : Variable data for /opt::http://www.pathname.com/fhs/pub/fhs-2.3.html#VAROPTVARIABLEDATAFOROPT
fhs::purpose45::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE45
fhs::varrunruntimevariabledata::/var/run : Run-time variable data::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARRUNRUNTIMEVARIABLEDATA
fhs::purpose46::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE46
fhs::requirements14::Requirements::http://www.pathname.com/fhs/pub/fhs-2.3.html#REQUIREMENTS14
fhs::varspoolapplicationspooldata::/var/spool : Application spool data::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARSPOOLAPPLICATIONSPOOLDATA
fhs::purpose47::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE47
fhs::specificoptions25::Specific Options::http://www.pathname.com/fhs/pub/fhs-2.3.html#SPECIFICOPTIONS25
fhs::varspoollpdlineprinterdaemonprintqu::/var/spool/lpd : Line-printer daemon print queues (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARSPOOLLPDLINEPRINTERDAEMONPRINTQU
fhs::varspoolrwhorwhodfiles::/var/spool/rwho : Rwhod files (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARSPOOLRWHORWHODFILES
fhs::vartmptemporaryfilespreservedbetwee::/var/tmp : Temporary files preserved between system reboots::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARTMPTEMPORARYFILESPRESERVEDBETWEE
fhs::purpose50::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE50
fhs::varypnetworkinformationservice::/var/yp : Network Information Service (NIS) database files (optional)::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARYPNETWORKINFORMATIONSERVICE
fhs::purpose51::Purpose::http://www.pathname.com/fhs/pub/fhs-2.3.html#PURPOSE51
fhs::operatingsystemspecificannex::Operating System Specific Annex::http://www.pathname.com/fhs/pub/fhs-2.3.html#OPERATINGSYSTEMSPECIFICANNEX
fhs::linux::Linux::http://www.pathname.com/fhs/pub/fhs-2.3.html#LINUX
fhs::rootdirectory::/ : Root directory::http://www.pathname.com/fhs/pub/fhs-2.3.html#ROOTDIRECTORY
fhs::binessentialusercommandbinaries2::/bin : Essential user command binaries (for use by all users)::http://www.pathname.com/fhs/pub/fhs-2.3.html#BINESSENTIALUSERCOMMANDBINARIES2
fhs::devdevicesandspecialfiles::/dev : Devices and special files::http://www.pathname.com/fhs/pub/fhs-2.3.html#DEVDEVICESANDSPECIALFILES
fhs::etchostspecificsystemconfiguration2::/etc : Host-specific system configuration::http://www.pathname.com/fhs/pub/fhs-2.3.html#ETCHOSTSPECIFICSYSTEMCONFIGURATION2
fhs::lib64::/lib64 and /lib32 : 64/32-bit libraries (architecture dependent)::http://www.pathname.com/fhs/pub/fhs-2.3.html#LIB64
fhs::prockernelandprocessinformationvir::/proc : Kernel and process information virtual filesystem::http://www.pathname.com/fhs/pub/fhs-2.3.html#PROCKERNELANDPROCESSINFORMATIONVIR
fhs::sbinessentialsystembinaries::/sbin : Essential system binaries::http://www.pathname.com/fhs/pub/fhs-2.3.html#SBINESSENTIALSYSTEMBINARIES
fhs::usrincludeheaderfilesincludedbycp::/usr/include : Header files included by C programs::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRINCLUDEHEADERFILESINCLUDEDBYCP
fhs::usrsrcsourcecode2::/usr/src : Source code::http://www.pathname.com/fhs/pub/fhs-2.3.html#USRSRCSOURCECODE2
fhs::varspoolcroncronandatjobs::/var/spool/cron : cron and at jobs::http://www.pathname.com/fhs/pub/fhs-2.3.html#VARSPOOLCRONCRONANDATJOBS
fhs::appendix::Appendix::http://www.pathname.com/fhs/pub/fhs-2.3.html#APPENDIX
fhs::thefhsmailinglist::The FHS mailing list::http://www.pathname.com/fhs/pub/fhs-2.3.html#THEFHSMAILINGLIST
fhs::backgroundofthefhs::Background of the FHS::http://www.pathname.com/fhs/pub/fhs-2.3.html#BACKGROUNDOFTHEFHS
fhs::generalguidelines::General Guidelines::http://www.pathname.com/fhs/pub/fhs-2.3.html#GENERALGUIDELINES
fhs::scope::Scope::http://www.pathname.com/fhs/pub/fhs-2.3.html#SCOPE
fhs::acknowledgments::Acknowledgments::http://www.pathname.com/fhs/pub/fhs-2.3.html#ACKNOWLEDGMENTS
fhs::contributors::Contributors::http://www.pathname.com/fhs/pub/fhs-2.3.html#CONTRIBUTORS
java-policy::::Debian policy for Java::http://www.debian.org/doc/packaging-manuals/java-policy/
java-policy::1::Background::http://www.debian.org/doc/packaging-manuals/java-policy/c42.html
java-policy::2::Policy::http://www.debian.org/doc/packaging-manuals/java-policy/c50.html
java-policy::2.1::Virtual machines::http://www.debian.org/doc/packaging-manuals/java-policy/c50.html#policy-vm
java-policy::2.2::Building Java packages::http://www.debian.org/doc/packaging-manuals/java-policy/x84.html
java-policy::2.3::Java programs::http://www.debian.org/doc/packaging-manuals/java-policy/x95.html
java-policy::2.4::Java libraries::http://www.debian.org/doc/packaging-manuals/java-policy/x110.html
java-policy::2.5::Native Java Bytecode (gcj packages)::http://www.debian.org/doc/packaging-manuals/java-policy/x155.html
java-policy::2.6::Main, contrib or non-free::http://www.debian.org/doc/packaging-manuals/java-policy/x179.html
java-policy::3::Issues to discuss::http://www.debian.org/doc/packaging-manuals/java-policy/c186.html
java-policy::4::Advices to Java packagers::http://www.debian.org/doc/packaging-manuals/java-policy/c213.html
lintian::::Lintian User's Manual::http://lintian.debian.org/manual/
lintian::1::Introduction::http://lintian.debian.org/manual/chapter-1.html
lintian::1.1::About Lintian::http://lintian.debian.org/manual/chapter-1.html#section-1.1
lintian::1.2::The intention of Lintian::http://lintian.debian.org/manual/section-1.2.html
lintian::1.3::Design issues::http://lintian.debian.org/manual/section-1.3.html
lintian::1.4::Disclaimer::http://lintian.debian.org/manual/section-1.4.html
lintian::2::Getting started::http://lintian.debian.org/manual/chapter-2.html
lintian::2.1::Installing Lintian::http://lintian.debian.org/manual/chapter-2.html#section-2.1
lintian::2.2::Running lintian::http://lintian.debian.org/manual/section-2.2.html
lintian::2.3::Lintian Tags::http://lintian.debian.org/manual/section-2.3.html
lintian::2.4::Overrides::http://lintian.debian.org/manual/section-2.4.html
lintian::2.4.1::Format of override files::http://lintian.debian.org/manual/section-2.4.html#section-2.4.1
lintian::2.4.2::Documenting overrides::http://lintian.debian.org/manual/section-2.4.html#section-2.4.2
lintian::2.4.3::Architecture specific overrides::http://lintian.debian.org/manual/section-2.4.html#section-2.4.3
lintian::2.5::Vendor Profiles::http://lintian.debian.org/manual/section-2.5.html
lintian::2.5.1::Rules for profile names and location::http://lintian.debian.org/manual/section-2.5.html#section-2.5.1
lintian::2.5.2::Profile syntax and semantics::http://lintian.debian.org/manual/section-2.5.html#section-2.5.2
lintian::2.6::Vendor specific data files::http://lintian.debian.org/manual/section-2.6.html
lintian::2.6.1::Load paths and order::http://lintian.debian.org/manual/section-2.6.html#section-2.6.1
lintian::2.6.2::Basic syntax of data files::http://lintian.debian.org/manual/section-2.6.html#section-2.6.2
lintian::3::Advanced usage::http://lintian.debian.org/manual/chapter-3.html
lintian::3.1::How Lintian works::http://lintian.debian.org/manual/chapter-3.html#section-3.1
lintian::3.2::The laboratory::http://lintian.debian.org/manual/section-3.2.html
lintian::3.3::Writing your own Lintian checks::http://lintian.debian.org/manual/section-3.3.html
lintian::3.3.1::Check description file::http://lintian.debian.org/manual/section-3.3.html#section-3.3.1
lintian::3.3.2::Check Perl module file::http://lintian.debian.org/manual/section-3.3.html#section-3.3.2
menu::::Debian Menu System::http://www.debian.org/doc/packaging-manuals/menu.html/
menu::1::Introduction::http://www.debian.org/doc/packaging-manuals/menu.html/ch1.html
menu::2::Menu from the viewpoint of a user::http://www.debian.org/doc/packaging-manuals/menu.html/ch2.html
menu::2.1::How/when do the window manager startup files get created?::http://www.debian.org/doc/packaging-manuals/menu.html/ch2.html#s2.1
menu::2.2::Tuning of the generated window manager startup files::http://www.debian.org/doc/packaging-manuals/menu.html/ch2.html#s2.2
menu::2.3::Optimization of menu tree: hints::http://www.debian.org/doc/packaging-manuals/menu.html/ch2.html#s2.3
menu::3::The menu file::http://www.debian.org/doc/packaging-manuals/menu.html/ch3.html
menu::3.1::Location::http://www.debian.org/doc/packaging-manuals/menu.html/ch3.html#s3.1
menu::3.2::Syntax::http://www.debian.org/doc/packaging-manuals/menu.html/ch3.html#s3.2
menu::3.3::The title field::http://www.debian.org/doc/packaging-manuals/menu.html/ch3.html#s3.3
menu::3.4::The needs field::http://www.debian.org/doc/packaging-manuals/menu.html/ch3.html#s3.4
menu::3.5::The section field::http://www.debian.org/doc/packaging-manuals/menu.html/ch3.html#s3.5
menu::3.6::The command field::http://www.debian.org/doc/packaging-manuals/menu.html/ch3.html#s3.6
menu::3.7::The icon field::http://www.debian.org/doc/packaging-manuals/menu.html/ch3.html#s3.7
menu::3.8::The hints field::http://www.debian.org/doc/packaging-manuals/menu.html/ch3.html#s3.8
menu::3.9::Entries for menu sections.::http://www.debian.org/doc/packaging-manuals/menu.html/ch3.html#s3.9
menu::3.10::Fvwm's task and title bars::http://www.debian.org/doc/packaging-manuals/menu.html/ch3.html#s3.10
menu::4::What packages with applications should do::http://www.debian.org/doc/packaging-manuals/menu.html/ch4.html
menu::4.1::Providing a menu file::http://www.debian.org/doc/packaging-manuals/menu.html/ch4.html#s4.1
menu::4.2::Adding a hook for dpkg in your packages::http://www.debian.org/doc/packaging-manuals/menu.html/ch4.html#s4.2
menu::5::What packages with menu managers should do::http://www.debian.org/doc/packaging-manuals/menu.html/ch5.html
menu::6::How a user can override the menus::http://www.debian.org/doc/packaging-manuals/menu.html/ch6.html
menu::6.1::Configuring the menus::http://www.debian.org/doc/packaging-manuals/menu.html/ch6.html#s6.1
menu::6.2::Specifying that a menu entry should not be displayed::http://www.debian.org/doc/packaging-manuals/menu.html/ch6.html#s6.2
menu::6.3::Including other files::http://www.debian.org/doc/packaging-manuals/menu.html/ch6.html#s6.3
menu::7::The internals of the menu package::http://www.debian.org/doc/packaging-manuals/menu.html/ch7.html
menu::7.1::The update-menus program::http://www.debian.org/doc/packaging-manuals/menu.html/ch7.html#s7.1
menu::7.2::The install-menu program::http://www.debian.org/doc/packaging-manuals/menu.html/ch7.html#s7.2
menu::7.3::The install-menu config script definitions::http://www.debian.org/doc/packaging-manuals/menu.html/ch7.html#s7.3
menu::7.4::Hints, tree optimization::http://www.debian.org/doc/packaging-manuals/menu.html/ch7.html#s7.4
menu::8::Variables and functions in the install-menu scripts::http://www.debian.org/doc/packaging-manuals/menu.html/ch8.html
menu::8.1::String constants::http://www.debian.org/doc/packaging-manuals/menu.html/ch8.html#s8.1
menu::8.2::Variables::http://www.debian.org/doc/packaging-manuals/menu.html/ch8.html#s8.2
menu::8.3::Functions::http://www.debian.org/doc/packaging-manuals/menu.html/ch8.html#s8.3
menu-policy::::The Debian Menu sub-policy::http://www.debian.org/doc/packaging-manuals/menu-policy/
menu-policy::1::About this document::http://www.debian.org/doc/packaging-manuals/menu-policy/ch1.html
menu-policy::2::Menu Structure::http://www.debian.org/doc/packaging-manuals/menu-policy/ch2.html
menu-policy::2.1::Preferred menu structure::http://www.debian.org/doc/packaging-manuals/menu-policy/ch2.html#s2.1
perl-policy::::Debian Perl Policy::http://www.debian.org/doc/packaging-manuals/perl-policy/
perl-policy::1::About this document::http://www.debian.org/doc/packaging-manuals/perl-policy/ch1.html
perl-policy::2::Perl Packaging::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-perl.html
perl-policy::3::Locally Installed Modules::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-site.html
perl-policy::4::Packaged Modules::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-module_packages.html
perl-policy::5::Perl Programs::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-programs.html
perl-policy::6::Programs Embedding Perl::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-embed.html
perl-policy::A::Perl 6::http://www.debian.org/doc/packaging-manuals/perl-policy/ap-perl6.html
perl-policy::2.1::Versions::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-perl.html#s-versions
perl-policy::2.2::Base Package::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-perl.html#s-base
perl-policy::2.3::Module Path::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-perl.html#s-paths
perl-policy::2.4::Documentation::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-perl.html#s-docs
perl-policy::3.1::Site Directories::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-site.html#s-site_dirs
perl-policy::3.2::Site Installation::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-site.html#s-site_install
perl-policy::4.1::Vendor Directories::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-module_packages.html#s-vendor_dirs
perl-policy::4.2::Module Package Names::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-module_packages.html#s-package_names
perl-policy::4.3::Vendor Installation::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-module_packages.html#s-vendor_install
perl-policy::4.4::Module Dependencies::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-module_packages.html#s-module_deps
perl-policy::5.1::Script Magic::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-programs.html#s-hash_bang
perl-policy::5.2::Program Dependencies::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-programs.html#s-program_deps
perl-policy::6.1::Building Embedded Programs::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-embed.html#s-build_embedded
perl-policy::6.2::Embedded Perl Dependencies::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-embed.html#s-embedded_deps
perl-policy::6.3::Perl Package Upgrades::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-embed.html#s-perl_upgrades
perl-policy::4.4.1::Architecture-Independent Modules::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-module_packages.html#s-indep_modules
perl-policy::4.4.2::Binary Modules::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-module_packages.html#s-binary_modules
perl-policy::4.4.3::Automating Perl Dependencies::http://www.debian.org/doc/packaging-manuals/perl-policy/ch-module_packages.html#s-dh_perl
policy::::Debian Policy Manual::http://www.debian.org/doc/debian-policy/
policy::1::About this manual::http://www.debian.org/doc/debian-policy/ch-scope.html
policy::2::The Debian Archive::http://www.debian.org/doc/debian-policy/ch-archive.html
policy::3::Binary packages::http://www.debian.org/doc/debian-policy/ch-binary.html
policy::4::Source packages::http://www.debian.org/doc/debian-policy/ch-source.html
policy::5::Control files and their fields::http://www.debian.org/doc/debian-policy/ch-controlfields.html
policy::6::Package maintainer scripts and installation procedure::http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html
policy::7::Declaring relationships between packages::http://www.debian.org/doc/debian-policy/ch-relationships.html
policy::8::Shared libraries::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html
policy::9::The Operating System::http://www.debian.org/doc/debian-policy/ch-opersys.html
policy::10::Files::http://www.debian.org/doc/debian-policy/ch-files.html
policy::11::Customized programs::http://www.debian.org/doc/debian-policy/ch-customized-programs.html
policy::12::Documentation::http://www.debian.org/doc/debian-policy/ch-docs.html
policy::A::Introduction and scope of these appendices::http://www.debian.org/doc/debian-policy/ap-pkg-scope.html
policy::B::Binary packages (from old Packaging Manual)::http://www.debian.org/doc/debian-policy/ap-pkg-binarypkg.html
policy::C::Source packages (from old Packaging Manual)::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html
policy::D::Control files and their fields (from old Packaging Manual)::http://www.debian.org/doc/debian-policy/ap-pkg-controlfields.html
policy::E::Configuration file handling (from old Packaging Manual)::http://www.debian.org/doc/debian-policy/ap-pkg-conffiles.html
policy::F::Alternative versions of an interface - update-alternatives (from old Packaging Manual)::http://www.debian.org/doc/debian-policy/ap-pkg-alternatives.html
policy::G::Diversions - overriding a package's version of a file (from old Packaging Manual)::http://www.debian.org/doc/debian-policy/ap-pkg-diversions.html
policy::1.1::Scope::http://www.debian.org/doc/debian-policy/ch-scope.html#s1.1
policy::1.2::New versions of this document::http://www.debian.org/doc/debian-policy/ch-scope.html#s1.2
policy::1.3::Authors and Maintainers::http://www.debian.org/doc/debian-policy/ch-scope.html#s-authors
policy::1.4::Related documents::http://www.debian.org/doc/debian-policy/ch-scope.html#s-related
policy::1.5::Definitions::http://www.debian.org/doc/debian-policy/ch-scope.html#s-definitions
policy::2.1::The Debian Free Software Guidelines::http://www.debian.org/doc/debian-policy/ch-archive.html#s-dfsg
policy::2.2::Archive areas::http://www.debian.org/doc/debian-policy/ch-archive.html#s-sections
policy::2.3::Copyright considerations::http://www.debian.org/doc/debian-policy/ch-archive.html#s-pkgcopyright
policy::2.4::Sections::http://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections
policy::2.5::Priorities::http://www.debian.org/doc/debian-policy/ch-archive.html#s-priorities
policy::3.1::The package name::http://www.debian.org/doc/debian-policy/ch-binary.html#s3.1
policy::3.2::The version of a package::http://www.debian.org/doc/debian-policy/ch-binary.html#s-versions
policy::3.3::The maintainer of a package::http://www.debian.org/doc/debian-policy/ch-binary.html#s-maintainer
policy::3.4::The description of a package::http://www.debian.org/doc/debian-policy/ch-binary.html#s-descriptions
policy::3.5::Dependencies::http://www.debian.org/doc/debian-policy/ch-binary.html#s-dependencies
policy::3.6::Virtual packages::http://www.debian.org/doc/debian-policy/ch-binary.html#s-virtual_pkg
policy::3.7::Base system::http://www.debian.org/doc/debian-policy/ch-binary.html#s3.7
policy::3.8::Essential packages::http://www.debian.org/doc/debian-policy/ch-binary.html#s3.8
policy::3.9::Maintainer Scripts::http://www.debian.org/doc/debian-policy/ch-binary.html#s-maintscripts
policy::4.1::Standards conformance::http://www.debian.org/doc/debian-policy/ch-source.html#s-standardsversion
policy::4.2::Package relationships::http://www.debian.org/doc/debian-policy/ch-source.html#s-pkg-relations
policy::4.3::Changes to the upstream sources::http://www.debian.org/doc/debian-policy/ch-source.html#s4.3
policy::4.4::Debian changelog: debian/changelog::http://www.debian.org/doc/debian-policy/ch-source.html#s-dpkgchangelog
policy::4.5::Copyright: debian/copyright::http://www.debian.org/doc/debian-policy/ch-source.html#s-dpkgcopyright
policy::4.6::Error trapping in makefiles::http://www.debian.org/doc/debian-policy/ch-source.html#s4.6
policy::4.7::Time Stamps::http://www.debian.org/doc/debian-policy/ch-source.html#s-timestamps
policy::4.8::Restrictions on objects in source packages::http://www.debian.org/doc/debian-policy/ch-source.html#s-restrictions
policy::4.9::Main building script: debian/rules::http://www.debian.org/doc/debian-policy/ch-source.html#s-debianrules
policy::4.10::Variable substitutions: debian/substvars::http://www.debian.org/doc/debian-policy/ch-source.html#s-substvars
policy::4.11::Optional upstream source location: debian/watch::http://www.debian.org/doc/debian-policy/ch-source.html#s-debianwatch
policy::4.12::Generated files list: debian/files::http://www.debian.org/doc/debian-policy/ch-source.html#s-debianfiles
policy::4.13::Convenience copies of code::http://www.debian.org/doc/debian-policy/ch-source.html#s-embeddedfiles
policy::4.14::Source package handling: debian/README.source::http://www.debian.org/doc/debian-policy/ch-source.html#s-readmesource
policy::5.1::Syntax of control files::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-controlsyntax
policy::5.2::Source package control files -- debian/control::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-sourcecontrolfiles
policy::5.3::Binary package control files -- DEBIAN/control::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-binarycontrolfiles
policy::5.4::Debian source control files -- .dsc::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-debiansourcecontrolfiles
policy::5.5::Debian changes files -- .changes::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-debianchangesfiles
policy::5.6::List of fields::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-controlfieldslist
policy::5.7::User-defined fields::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s5.7
policy::5.8::Obsolete fields::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-obsolete-control-data-fields
policy::6.1::Introduction to package maintainer scripts::http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s6.1
policy::6.2::Maintainer scripts idempotency::http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s-idempotency
policy::6.3::Controlling terminal for maintainer scripts::http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s-controllingterminal
policy::6.4::Exit status::http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s-exitstatus
policy::6.5::Summary of ways maintainer scripts are called::http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s-mscriptsinstact
policy::6.6::Details of unpack phase of installation or upgrade::http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s-unpackphase
policy::6.7::Details of configuration::http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s-configdetails
policy::6.8::Details of removal and/or configuration purging::http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s-removedetails
policy::7.1::Syntax of relationship fields::http://www.debian.org/doc/debian-policy/ch-relationships.html#s-depsyntax
policy::7.2::Binary Dependencies - Depends, Recommends, Suggests, Enhances, Pre-Depends::http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
policy::7.3::Packages which break other packages - Breaks::http://www.debian.org/doc/debian-policy/ch-relationships.html#s-breaks
policy::7.4::Conflicting binary packages - Conflicts::http://www.debian.org/doc/debian-policy/ch-relationships.html#s-conflicts
policy::7.5::Virtual packages - Provides::http://www.debian.org/doc/debian-policy/ch-relationships.html#s-virtual
policy::7.6::Overwriting files and replacing packages - Replaces::http://www.debian.org/doc/debian-policy/ch-relationships.html#s-replaces
policy::7.7::Relationships between source and binary packages - Build-Depends, Build-Depends-Indep, Build-Conflicts, Build-Conflicts-Indep::http://www.debian.org/doc/debian-policy/ch-relationships.html#s-sourcebinarydeps
policy::7.8::Additional source packages used to build the binary - Built-Using::http://www.debian.org/doc/debian-policy/ch-relationships.html#s-built-using
policy::8.1::Run-time shared libraries::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-sharedlibs-runtime
policy::8.2::Shared library support files::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-sharedlibs-support-files
policy::8.3::Static libraries::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-sharedlibs-static
policy::8.4::Development files::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-sharedlibs-dev
policy::8.5::Dependencies between the packages of the same library::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-sharedlibs-intradeps
policy::8.6::Dependencies between the library and other packages::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-sharedlibs-depends
policy::9.1::File system hierarchy::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.1
policy::9.2::Users and groups::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.2
policy::9.3::System run levels and init.d scripts::http://www.debian.org/doc/debian-policy/ch-opersys.html#s-sysvinit
policy::9.4::Console messages from init.d scripts::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.4
policy::9.5::Cron jobs::http://www.debian.org/doc/debian-policy/ch-opersys.html#s-cron-jobs
policy::9.6::Menus::http://www.debian.org/doc/debian-policy/ch-opersys.html#s-menus
policy::9.7::Multimedia handlers::http://www.debian.org/doc/debian-policy/ch-opersys.html#s-mime
policy::9.8::Keyboard configuration::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.8
policy::9.9::Environment variables::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.9
policy::9.10::Registering Documents using doc-base::http://www.debian.org/doc/debian-policy/ch-opersys.html#s-doc-base
policy::9.11::Alternate init systems::http://www.debian.org/doc/debian-policy/ch-opersys.html#s-alternateinit
policy::10.1::Binaries::http://www.debian.org/doc/debian-policy/ch-files.html#s-binaries
policy::10.2::Libraries::http://www.debian.org/doc/debian-policy/ch-files.html#s-libraries
policy::10.3::Shared libraries::http://www.debian.org/doc/debian-policy/ch-files.html#s10.3
policy::10.4::Scripts::http://www.debian.org/doc/debian-policy/ch-files.html#s-scripts
policy::10.5::Symbolic links::http://www.debian.org/doc/debian-policy/ch-files.html#s10.5
policy::10.6::Device files::http://www.debian.org/doc/debian-policy/ch-files.html#s10.6
policy::10.7::Configuration files::http://www.debian.org/doc/debian-policy/ch-files.html#s-config-files
policy::10.8::Log files::http://www.debian.org/doc/debian-policy/ch-files.html#s10.8
policy::10.9::Permissions and owners::http://www.debian.org/doc/debian-policy/ch-files.html#s-permissions-owners
policy::10.10::File names::http://www.debian.org/doc/debian-policy/ch-files.html#s-filenames
policy::11.1::Architecture specification strings::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s-arch-spec
policy::11.2::Daemons::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s11.2
policy::11.3::Using pseudo-ttys and modifying wtmp, utmp and lastlog::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s11.3
policy::11.4::Editors and pagers::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s11.4
policy::11.5::Web servers and applications::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s-web-appl
policy::11.6::Mail transport, delivery and user agents::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s-mail-transport-agents
policy::11.7::News system configuration::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s11.7
policy::11.8::Programs for the X Window System::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s11.8
policy::11.9::Perl programs and modules::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s-perl
policy::11.10::Emacs lisp programs::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s-emacs
policy::11.11::Games::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s11.11
policy::12.1::Manual pages::http://www.debian.org/doc/debian-policy/ch-docs.html#s12.1
policy::12.2::Info documents::http://www.debian.org/doc/debian-policy/ch-docs.html#s12.2
policy::12.3::Additional documentation::http://www.debian.org/doc/debian-policy/ch-docs.html#s12.3
policy::12.4::Preferred documentation formats::http://www.debian.org/doc/debian-policy/ch-docs.html#s12.4
policy::12.5::Copyright information::http://www.debian.org/doc/debian-policy/ch-docs.html#s-copyrightfile
policy::12.6::Examples::http://www.debian.org/doc/debian-policy/ch-docs.html#s12.6
policy::12.7::Changelog files::http://www.debian.org/doc/debian-policy/ch-docs.html#s-changelogs
policy::B.1::Creating package files - dpkg-deb::http://www.debian.org/doc/debian-policy/ap-pkg-binarypkg.html#s-pkg-bincreating
policy::B.2::Package control information files::http://www.debian.org/doc/debian-policy/ap-pkg-binarypkg.html#s-pkg-controlarea
policy::B.3::The main control information file: control::http://www.debian.org/doc/debian-policy/ap-pkg-binarypkg.html#s-pkg-controlfile
policy::B.4::Time Stamps::http://www.debian.org/doc/debian-policy/ap-pkg-binarypkg.html#sB.4
policy::C.1::Tools for processing source packages::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-sourcetools
policy::C.2::The Debian package source tree::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-sourcetree
policy::C.3::Source packages as archives::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-sourcearchives
policy::C.4::Unpacking a Debian source package without dpkg-source::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#sC.4
policy::D.1::Syntax of control files::http://www.debian.org/doc/debian-policy/ap-pkg-controlfields.html#sD.1
policy::D.2::List of fields::http://www.debian.org/doc/debian-policy/ap-pkg-controlfields.html#sD.2
policy::E.1::Automatic handling of configuration files by dpkg::http://www.debian.org/doc/debian-policy/ap-pkg-conffiles.html#sE.1
policy::E.2::Fully-featured maintainer script configuration handling::http://www.debian.org/doc/debian-policy/ap-pkg-conffiles.html#sE.2
policy::2.2.1::The main archive area::http://www.debian.org/doc/debian-policy/ch-archive.html#s-main
policy::2.2.2::The contrib archive area::http://www.debian.org/doc/debian-policy/ch-archive.html#s-contrib
policy::2.2.3::The non-free archive area::http://www.debian.org/doc/debian-policy/ch-archive.html#s-non-free
policy::3.2.1::Version numbers based on dates::http://www.debian.org/doc/debian-policy/ch-binary.html#s3.2.1
policy::3.4.1::The single line synopsis::http://www.debian.org/doc/debian-policy/ch-binary.html#s-synopsis
policy::3.4.2::The extended description::http://www.debian.org/doc/debian-policy/ch-binary.html#s-extendeddesc
policy::3.9.1::Prompting in maintainer scripts::http://www.debian.org/doc/debian-policy/ch-binary.html#s-maintscriptprompt
policy::4.9.1::debian/rules and DEB_BUILD_OPTIONS::http://www.debian.org/doc/debian-policy/ch-source.html#s-debianrules-options
policy::5.6.1::Source::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Source
policy::5.6.2::Maintainer::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Maintainer
policy::5.6.3::Uploaders::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Uploaders
policy::5.6.4::Changed-By::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Changed-By
policy::5.6.5::Section::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Section
policy::5.6.6::Priority::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Priority
policy::5.6.7::Package::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Package
policy::5.6.8::Architecture::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Architecture
policy::5.6.9::Essential::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Essential
policy::5.6.10::Package interrelationship fields: Depends, Pre-Depends, Recommends, Suggests, Breaks, Conflicts, Provides, Replaces, Enhances::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s5.6.10
policy::5.6.11::Standards-Version::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Standards-Version
policy::5.6.12::Version::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version
policy::5.6.13::Description::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description
policy::5.6.14::Distribution::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Distribution
policy::5.6.15::Date::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Date
policy::5.6.16::Format::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Format
policy::5.6.17::Urgency::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Urgency
policy::5.6.18::Changes::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Changes
policy::5.6.19::Binary::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Binary
policy::5.6.20::Installed-Size::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Installed-Size
policy::5.6.21::Files::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Files
policy::5.6.22::Closes::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Closes
policy::5.6.23::Homepage::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Homepage
policy::5.6.24::Checksums-Sha1 and Checksums-Sha256::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Checksums
policy::5.6.25::DM-Upload-Allowed::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s5.6.25
policy::5.6.26::Version Control System (VCS) fields::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-VCS-fields
policy::5.6.27::Package-List::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Package-List
policy::5.6.28::Package-Type::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Package-Type
policy::5.6.29::Dgit::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Dgit
policy::5.8.1::DM-Upload-Allowed::http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-DM-Upload-Allowed
policy::7.6.1::Overwriting files in other packages::http://www.debian.org/doc/debian-policy/ch-relationships.html#s7.6.1
policy::7.6.2::Replacing whole packages, forcing their removal::http://www.debian.org/doc/debian-policy/ch-relationships.html#s7.6.2
policy::8.1.1::ldconfig::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-ldconfig
policy::8.6.1::Generating dependencies on shared libraries::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-dpkg-shlibdeps
policy::8.6.2::Shared library ABI changes::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-sharedlibs-updates
policy::8.6.3::The symbols system::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-sharedlibs-symbols
policy::8.6.3.1::The symbols files present on the system::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-symbols-paths
policy::8.6.3.2::The symbols File Format::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-symbols
policy::8.6.3.3::Providing a symbols file::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-providing-symbols
policy::8.6.4::The shlibs system::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-sharedlibs-shlibdeps
policy::8.6.4.1::The shlibs files present on the system::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-shlibs-paths
policy::8.6.4.2::The shlibs File Format::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-shlibs
policy::8.6.4.3::Providing a shlibs file::http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s8.6.4.3
policy::9.1.1::File System Structure::http://www.debian.org/doc/debian-policy/ch-opersys.html#s-fhs
policy::9.1.2::Site-specific programs::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.1.2
policy::9.1.3::The system-wide mail directory::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.1.3
policy::9.1.4::/run and /run/lock::http://www.debian.org/doc/debian-policy/ch-opersys.html#s-fhs-run
policy::9.2.1::Introduction::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.2.1
policy::9.2.2::UID and GID classes::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.2.2
policy::9.3.1::Introduction::http://www.debian.org/doc/debian-policy/ch-opersys.html#s-/etc/init.d
policy::9.3.2::Writing the scripts::http://www.debian.org/doc/debian-policy/ch-opersys.html#s-writing-init
policy::9.3.3::Interfacing with the initscript system::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.3.3
policy::9.3.3.1::Managing the links::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.3.3.1
policy::9.3.3.2::Running initscripts::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.3.3.2
policy::9.3.4::Boot-time initialization::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.3.4
policy::9.3.5::Example::http://www.debian.org/doc/debian-policy/ch-opersys.html#s9.3.5
policy::9.5.1::Cron job file names::http://www.debian.org/doc/debian-policy/ch-opersys.html#s-cron-files
policy::9.11.1::Event-based boot with upstart::http://www.debian.org/doc/debian-policy/ch-opersys.html#s-upstart
policy::10.7.1::Definitions::http://www.debian.org/doc/debian-policy/ch-files.html#s10.7.1
policy::10.7.2::Location::http://www.debian.org/doc/debian-policy/ch-files.html#s10.7.2
policy::10.7.3::Behavior::http://www.debian.org/doc/debian-policy/ch-files.html#s10.7.3
policy::10.7.4::Sharing configuration files::http://www.debian.org/doc/debian-policy/ch-files.html#s10.7.4
policy::10.7.5::User configuration files ("dotfiles")::http://www.debian.org/doc/debian-policy/ch-files.html#s10.7.5
policy::10.9.1::The use of dpkg-statoverride::http://www.debian.org/doc/debian-policy/ch-files.html#s10.9.1
policy::11.1.1::Architecture wildcards::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s-arch-wildcard-spec
policy::11.8.1::Providing X support and package priorities::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s11.8.1
policy::11.8.2::Packages providing an X server::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s11.8.2
policy::11.8.3::Packages providing a terminal emulator::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s11.8.3
policy::11.8.4::Packages providing a window manager::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s11.8.4
policy::11.8.5::Packages providing fonts::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s11.8.5
policy::11.8.6::Application defaults files::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s-appdefaults
policy::11.8.7::Installation directory issues::http://www.debian.org/doc/debian-policy/ch-customized-programs.html#s11.8.7
policy::12.5.1::Machine-readable copyright information::http://www.debian.org/doc/debian-policy/ch-docs.html#s-copyrightformat
policy::C.1.1::dpkg-source - packs and unpacks Debian source packages::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-dpkg-source
policy::C.1.2::dpkg-buildpackage - overall package-building control script::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-dpkg-buildpackage
policy::C.1.3::dpkg-gencontrol - generates binary package control files::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-dpkg-gencontrol
policy::C.1.4::dpkg-shlibdeps - calculates shared library dependencies::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-dpkg-shlibdeps
policy::C.1.5::dpkg-distaddfile - adds a file to debian/files::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-dpkg-distaddfile
policy::C.1.6::dpkg-genchanges - generates a .changes upload control file::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-dpkg-genchanges
policy::C.1.7::dpkg-parsechangelog - produces parsed representation of a changelog::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-dpkg-parsechangelog
policy::C.1.8::dpkg-architecture - information about the build and host system::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-dpkg-architecture
policy::C.2.1::debian/rules - the main building script::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-debianrules
policy::C.2.2::debian/substvars and variable substitutions::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#s-pkg-srcsubstvars
policy::C.2.3::debian/files::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#sC.2.3
policy::C.2.4::debian/tmp::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#sC.2.4
policy::C.4.1::Restrictions on objects in source packages::http://www.debian.org/doc/debian-policy/ap-pkg-sourcepkg.html#sC.4.1
policy::D.2.1::Filename and MSDOS-Filename::http://www.debian.org/doc/debian-policy/ap-pkg-controlfields.html#s-pkg-f-Filename
policy::D.2.2::Size and MD5sum::http://www.debian.org/doc/debian-policy/ap-pkg-controlfields.html#s-pkg-f-Size
policy::D.2.3::Status::http://www.debian.org/doc/debian-policy/ap-pkg-controlfields.html#s-pkg-f-Status
policy::D.2.4::Config-Version::http://www.debian.org/doc/debian-policy/ap-pkg-controlfields.html#s-pkg-f-Config-Version
policy::D.2.5::Conffiles::http://www.debian.org/doc/debian-policy/ap-pkg-controlfields.html#s-pkg-f-Conffiles
policy::D.2.6::Obsolete fields::http://www.debian.org/doc/debian-policy/ap-pkg-controlfields.html#sD.2.6
python-policy::::Debian Python Policy::http://www.debian.org/doc/packaging-manuals/python-policy/
python-policy::1::Python Packaging::http://www.debian.org/doc/packaging-manuals/python-policy/ch-python.html
python-policy::2::Packaged Modules::http://www.debian.org/doc/packaging-manuals/python-policy/ch-module_packages.html
python-policy::3::Python Programs::http://www.debian.org/doc/packaging-manuals/python-policy/ch-programs.html
python-policy::4::Programs Embedding Python::http://www.debian.org/doc/packaging-manuals/python-policy/ch-embed.html
python-policy::5::Interaction with Locally Installed Python Versions::http://www.debian.org/doc/packaging-manuals/python-policy/ch-other.html
python-policy::A::Build Dependencies::http://www.debian.org/doc/packaging-manuals/python-policy/ap-build_dependencies.html
python-policy::B::Packaging Tools::http://www.debian.org/doc/packaging-manuals/python-policy/ap-packaging_tools.html
python-policy::C::Upgrade Procedure::http://www.debian.org/doc/packaging-manuals/python-policy/ap-upgrade.html
python-policy::1.1::Versions::http://www.debian.org/doc/packaging-manuals/python-policy/ch-python.html#s-versions
python-policy::1.2::Main packages::http://www.debian.org/doc/packaging-manuals/python-policy/ch-python.html#s-base
python-policy::1.3::Minimal packages::http://www.debian.org/doc/packaging-manuals/python-policy/ch-python.html#s-minimal
python-policy::1.4::Python Interpreter::http://www.debian.org/doc/packaging-manuals/python-policy/ch-python.html#s-interpreter
python-policy::1.5::Module Path::http://www.debian.org/doc/packaging-manuals/python-policy/ch-python.html#s-paths
python-policy::1.6::Hooks for updates to installed runtimes::http://www.debian.org/doc/packaging-manuals/python-policy/ch-python.html#s-runtimes_hooks
python-policy::1.7::Documentation::http://www.debian.org/doc/packaging-manuals/python-policy/ch-python.html#s-docs
python-policy::2.1::Types of Python Modules::http://www.debian.org/doc/packaging-manuals/python-policy/ch-module_packages.html#s2.1
python-policy::2.2::Module Package Names::http://www.debian.org/doc/packaging-manuals/python-policy/ch-module_packages.html#s-package_names
python-policy::2.3::Specifying Supported Versions::http://www.debian.org/doc/packaging-manuals/python-policy/ch-module_packages.html#s-specifying_versions
python-policy::2.4::Dependencies::http://www.debian.org/doc/packaging-manuals/python-policy/ch-module_packages.html#s-dependencies
python-policy::2.5::Provides::http://www.debian.org/doc/packaging-manuals/python-policy/ch-module_packages.html#s-provides
python-policy::2.6::Modules Byte-Compilation::http://www.debian.org/doc/packaging-manuals/python-policy/ch-module_packages.html#s-byte_compilation
python-policy::3.1::Programs using the default python::http://www.debian.org/doc/packaging-manuals/python-policy/ch-programs.html#s-version_indep_progs
python-policy::3.2::Programs Using a Particular Python Version::http://www.debian.org/doc/packaging-manuals/python-policy/ch-programs.html#s-version_dep_progs
python-policy::4.1::Building Embedded Programs::http://www.debian.org/doc/packaging-manuals/python-policy/ch-embed.html#s-build_embedded
python-policy::4.2::Embedded Python Dependencies::http://www.debian.org/doc/packaging-manuals/python-policy/ch-embed.html#s-embedded_deps
python-policy::B.1::distutils::http://www.debian.org/doc/packaging-manuals/python-policy/ap-packaging_tools.html#s-distutils
python-policy::B.2::python-support (deprecated)::http://www.debian.org/doc/packaging-manuals/python-policy/ap-packaging_tools.html#s-pysupport
python-policy::B.3::python-central (deprecated)::http://www.debian.org/doc/packaging-manuals/python-policy/ap-packaging_tools.html#s-pycentral
python-policy::B.4::CDBS::http://www.debian.org/doc/packaging-manuals/python-policy/ap-packaging_tools.html#s-cdbs
python-policy::B.5::dh_python2 and dh_python3::http://www.debian.org/doc/packaging-manuals/python-policy/ap-packaging_tools.html#s-dh_python2_3
python-policy::1.4.1::Interpreter Name::http://www.debian.org/doc/packaging-manuals/python-policy/ch-python.html#s-interpreter_name
python-policy::1.4.2::Interpreter Location::http://www.debian.org/doc/packaging-manuals/python-policy/ch-python.html#s-interpreter_loc
python-policy::3.1.1::Programs Shipping Private Modules::http://www.debian.org/doc/packaging-manuals/python-policy/ch-programs.html#s-current_version_progs
vim-policy::::Debian Packaging Policy for Vim::http://pkg-vim.alioth.debian.org/vim-policy.html/
vim-policy::1::Vim Addon Packaging in a Nutshell::http://pkg-vim.alioth.debian.org/vim-policy.html/index.html#nutshell
vim-policy::2::Vim Packaging::http://pkg-vim.alioth.debian.org/vim-policy.html/x73.html
vim-policy::3::Packaging of Vim Addons::http://pkg-vim.alioth.debian.org/vim-policy.html/x113.html
vim-policy::3.1::Addon Structure::http://pkg-vim.alioth.debian.org/vim-policy.html/x113.html#addon-structure
vim-policy::3.2::Addon Packages::http://pkg-vim.alioth.debian.org/vim-policy.html/x113.html#addon-packages
vim-policy::3.3::Registry Entries::http://pkg-vim.alioth.debian.org/vim-policy.html/x113.html#registry-entry
vim-policy::4::Tools::http://pkg-vim.alioth.debian.org/vim-policy.html/x221.html
lintian-2.5.22ubuntu1/data/init.d/ 0000775 0000000 0000000 00000000000 12313551044 013550 5 ustar lintian-2.5.22ubuntu1/data/init.d/virtual_facilities 0000664 0000000 0000000 00000000337 12313551044 017360 0 ustar # The list of known virtual facilities that init scripts may depend on.
#
# Last updated: 2012-02-19
$all
$local_fs
$mail-transport-agent
$named
$network
$portmap
$remote_fs
$syslog
$time
$x-display-manager
$x-font-server
lintian-2.5.22ubuntu1/data/common/ 0000775 0000000 0000000 00000000000 12313550275 013660 5 ustar lintian-2.5.22ubuntu1/data/common/architectures 0000664 0000000 0000000 00000025137 12313550275 016460 0 ustar # List of known architectures as provided by dpkg-architecture
# (excluding "all" and "any", which are handled specially)
# Last updated: 2014-01-14
# With: Debian dpkg-architecture version 1.17.5.
# This file was auto-generated by private/refresh-archs
alpha || linux alpha
amd64 || linux amd64
arm || linux arm
arm64 || linux arm64
armeb || linux armeb
armel || linux arm
armhf || linux arm
avr32 || linux avr32
darwin-alpha || darwin alpha
darwin-amd64 || darwin amd64
darwin-arm || darwin arm
darwin-arm64 || darwin arm64
darwin-armeb || darwin armeb
darwin-avr32 || darwin avr32
darwin-hppa || darwin hppa
darwin-i386 || darwin i386
darwin-ia64 || darwin ia64
darwin-m32r || darwin m32r
darwin-m68k || darwin m68k
darwin-mips || darwin mips
darwin-mips64 || darwin mips64
darwin-mips64el || darwin mips64el
darwin-mipsel || darwin mipsel
darwin-powerpc || darwin powerpc
darwin-ppc64 || darwin ppc64
darwin-ppc64el || darwin ppc64el
darwin-s390 || darwin s390
darwin-s390x || darwin s390x
darwin-sh3 || darwin sh3
darwin-sh3eb || darwin sh3eb
darwin-sh4 || darwin sh4
darwin-sh4eb || darwin sh4eb
darwin-sparc || darwin sparc
darwin-sparc64 || darwin sparc64
freebsd-alpha || freebsd alpha
freebsd-amd64 || freebsd amd64
freebsd-arm || freebsd arm
freebsd-arm64 || freebsd arm64
freebsd-armeb || freebsd armeb
freebsd-avr32 || freebsd avr32
freebsd-hppa || freebsd hppa
freebsd-i386 || freebsd i386
freebsd-ia64 || freebsd ia64
freebsd-m32r || freebsd m32r
freebsd-m68k || freebsd m68k
freebsd-mips || freebsd mips
freebsd-mips64 || freebsd mips64
freebsd-mips64el || freebsd mips64el
freebsd-mipsel || freebsd mipsel
freebsd-powerpc || freebsd powerpc
freebsd-ppc64 || freebsd ppc64
freebsd-ppc64el || freebsd ppc64el
freebsd-s390 || freebsd s390
freebsd-s390x || freebsd s390x
freebsd-sh3 || freebsd sh3
freebsd-sh3eb || freebsd sh3eb
freebsd-sh4 || freebsd sh4
freebsd-sh4eb || freebsd sh4eb
freebsd-sparc || freebsd sparc
freebsd-sparc64 || freebsd sparc64
hppa || linux hppa
hurd-alpha || hurd alpha
hurd-amd64 || hurd amd64
hurd-arm || hurd arm
hurd-arm64 || hurd arm64
hurd-armeb || hurd armeb
hurd-avr32 || hurd avr32
hurd-hppa || hurd hppa
hurd-i386 || hurd i386
hurd-ia64 || hurd ia64
hurd-m32r || hurd m32r
hurd-m68k || hurd m68k
hurd-mips || hurd mips
hurd-mips64 || hurd mips64
hurd-mips64el || hurd mips64el
hurd-mipsel || hurd mipsel
hurd-powerpc || hurd powerpc
hurd-ppc64 || hurd ppc64
hurd-ppc64el || hurd ppc64el
hurd-s390 || hurd s390
hurd-s390x || hurd s390x
hurd-sh3 || hurd sh3
hurd-sh3eb || hurd sh3eb
hurd-sh4 || hurd sh4
hurd-sh4eb || hurd sh4eb
hurd-sparc || hurd sparc
hurd-sparc64 || hurd sparc64
i386 || linux i386
ia64 || linux ia64
kfreebsd-alpha || kfreebsd alpha
kfreebsd-amd64 || kfreebsd amd64
kfreebsd-arm || kfreebsd arm
kfreebsd-arm64 || kfreebsd arm64
kfreebsd-armeb || kfreebsd armeb
kfreebsd-avr32 || kfreebsd avr32
kfreebsd-hppa || kfreebsd hppa
kfreebsd-i386 || kfreebsd i386
kfreebsd-ia64 || kfreebsd ia64
kfreebsd-m32r || kfreebsd m32r
kfreebsd-m68k || kfreebsd m68k
kfreebsd-mips || kfreebsd mips
kfreebsd-mips64 || kfreebsd mips64
kfreebsd-mips64el || kfreebsd mips64el
kfreebsd-mipsel || kfreebsd mipsel
kfreebsd-powerpc || kfreebsd powerpc
kfreebsd-ppc64 || kfreebsd ppc64
kfreebsd-ppc64el || kfreebsd ppc64el
kfreebsd-s390 || kfreebsd s390
kfreebsd-s390x || kfreebsd s390x
kfreebsd-sh3 || kfreebsd sh3
kfreebsd-sh3eb || kfreebsd sh3eb
kfreebsd-sh4 || kfreebsd sh4
kfreebsd-sh4eb || kfreebsd sh4eb
kfreebsd-sparc || kfreebsd sparc
kfreebsd-sparc64 || kfreebsd sparc64
knetbsd-alpha || knetbsd alpha
knetbsd-amd64 || knetbsd amd64
knetbsd-arm || knetbsd arm
knetbsd-arm64 || knetbsd arm64
knetbsd-armeb || knetbsd armeb
knetbsd-avr32 || knetbsd avr32
knetbsd-hppa || knetbsd hppa
knetbsd-i386 || knetbsd i386
knetbsd-ia64 || knetbsd ia64
knetbsd-m32r || knetbsd m32r
knetbsd-m68k || knetbsd m68k
knetbsd-mips || knetbsd mips
knetbsd-mips64 || knetbsd mips64
knetbsd-mips64el || knetbsd mips64el
knetbsd-mipsel || knetbsd mipsel
knetbsd-powerpc || knetbsd powerpc
knetbsd-ppc64 || knetbsd ppc64
knetbsd-ppc64el || knetbsd ppc64el
knetbsd-s390 || knetbsd s390
knetbsd-s390x || knetbsd s390x
knetbsd-sh3 || knetbsd sh3
knetbsd-sh3eb || knetbsd sh3eb
knetbsd-sh4 || knetbsd sh4
knetbsd-sh4eb || knetbsd sh4eb
knetbsd-sparc || knetbsd sparc
knetbsd-sparc64 || knetbsd sparc64
kopensolaris-alpha || kopensolaris alpha
kopensolaris-amd64 || kopensolaris amd64
kopensolaris-arm || kopensolaris arm
kopensolaris-arm64 || kopensolaris arm64
kopensolaris-armeb || kopensolaris armeb
kopensolaris-avr32 || kopensolaris avr32
kopensolaris-hppa || kopensolaris hppa
kopensolaris-i386 || kopensolaris i386
kopensolaris-ia64 || kopensolaris ia64
kopensolaris-m32r || kopensolaris m32r
kopensolaris-m68k || kopensolaris m68k
kopensolaris-mips || kopensolaris mips
kopensolaris-mips64 || kopensolaris mips64
kopensolaris-mips64el || kopensolaris mips64el
kopensolaris-mipsel || kopensolaris mipsel
kopensolaris-powerpc || kopensolaris powerpc
kopensolaris-ppc64 || kopensolaris ppc64
kopensolaris-ppc64el || kopensolaris ppc64el
kopensolaris-s390 || kopensolaris s390
kopensolaris-s390x || kopensolaris s390x
kopensolaris-sh3 || kopensolaris sh3
kopensolaris-sh3eb || kopensolaris sh3eb
kopensolaris-sh4 || kopensolaris sh4
kopensolaris-sh4eb || kopensolaris sh4eb
kopensolaris-sparc || kopensolaris sparc
kopensolaris-sparc64 || kopensolaris sparc64
lpia || linux i386
m32r || linux m32r
m68k || linux m68k
mint-m68k || mint m68k
mips || linux mips
mips64 || linux mips64
mips64el || linux mips64el
mipsel || linux mipsel
mipsn32 || linux mips64
mipsn32el || linux mips64el
musl-linux-alpha || linux alpha
musl-linux-amd64 || linux amd64
musl-linux-arm || linux arm
musl-linux-arm64 || linux arm64
musl-linux-armeb || linux armeb
musl-linux-armhf || linux arm
musl-linux-avr32 || linux avr32
musl-linux-hppa || linux hppa
musl-linux-i386 || linux i386
musl-linux-ia64 || linux ia64
musl-linux-m32r || linux m32r
musl-linux-m68k || linux m68k
musl-linux-mips || linux mips
musl-linux-mips64 || linux mips64
musl-linux-mips64el || linux mips64el
musl-linux-mipsel || linux mipsel
musl-linux-powerpc || linux powerpc
musl-linux-ppc64 || linux ppc64
musl-linux-ppc64el || linux ppc64el
musl-linux-s390 || linux s390
musl-linux-s390x || linux s390x
musl-linux-sh3 || linux sh3
musl-linux-sh3eb || linux sh3eb
musl-linux-sh4 || linux sh4
musl-linux-sh4eb || linux sh4eb
musl-linux-sparc || linux sparc
musl-linux-sparc64 || linux sparc64
netbsd-alpha || netbsd alpha
netbsd-amd64 || netbsd amd64
netbsd-arm || netbsd arm
netbsd-arm64 || netbsd arm64
netbsd-armeb || netbsd armeb
netbsd-avr32 || netbsd avr32
netbsd-hppa || netbsd hppa
netbsd-i386 || netbsd i386
netbsd-ia64 || netbsd ia64
netbsd-m32r || netbsd m32r
netbsd-m68k || netbsd m68k
netbsd-mips || netbsd mips
netbsd-mips64 || netbsd mips64
netbsd-mips64el || netbsd mips64el
netbsd-mipsel || netbsd mipsel
netbsd-powerpc || netbsd powerpc
netbsd-ppc64 || netbsd ppc64
netbsd-ppc64el || netbsd ppc64el
netbsd-s390 || netbsd s390
netbsd-s390x || netbsd s390x
netbsd-sh3 || netbsd sh3
netbsd-sh3eb || netbsd sh3eb
netbsd-sh4 || netbsd sh4
netbsd-sh4eb || netbsd sh4eb
netbsd-sparc || netbsd sparc
netbsd-sparc64 || netbsd sparc64
openbsd-alpha || openbsd alpha
openbsd-amd64 || openbsd amd64
openbsd-arm || openbsd arm
openbsd-arm64 || openbsd arm64
openbsd-armeb || openbsd armeb
openbsd-avr32 || openbsd avr32
openbsd-hppa || openbsd hppa
openbsd-i386 || openbsd i386
openbsd-ia64 || openbsd ia64
openbsd-m32r || openbsd m32r
openbsd-m68k || openbsd m68k
openbsd-mips || openbsd mips
openbsd-mips64 || openbsd mips64
openbsd-mips64el || openbsd mips64el
openbsd-mipsel || openbsd mipsel
openbsd-powerpc || openbsd powerpc
openbsd-ppc64 || openbsd ppc64
openbsd-ppc64el || openbsd ppc64el
openbsd-s390 || openbsd s390
openbsd-s390x || openbsd s390x
openbsd-sh3 || openbsd sh3
openbsd-sh3eb || openbsd sh3eb
openbsd-sh4 || openbsd sh4
openbsd-sh4eb || openbsd sh4eb
openbsd-sparc || openbsd sparc
openbsd-sparc64 || openbsd sparc64
powerpc || linux powerpc
powerpcspe || linux powerpc
ppc64 || linux ppc64
ppc64el || linux ppc64el
s390 || linux s390
s390x || linux s390x
sh3 || linux sh3
sh3eb || linux sh3eb
sh4 || linux sh4
sh4eb || linux sh4eb
solaris-alpha || solaris alpha
solaris-amd64 || solaris amd64
solaris-arm || solaris arm
solaris-arm64 || solaris arm64
solaris-armeb || solaris armeb
solaris-avr32 || solaris avr32
solaris-hppa || solaris hppa
solaris-i386 || solaris i386
solaris-ia64 || solaris ia64
solaris-m32r || solaris m32r
solaris-m68k || solaris m68k
solaris-mips || solaris mips
solaris-mips64 || solaris mips64
solaris-mips64el || solaris mips64el
solaris-mipsel || solaris mipsel
solaris-powerpc || solaris powerpc
solaris-ppc64 || solaris ppc64
solaris-ppc64el || solaris ppc64el
solaris-s390 || solaris s390
solaris-s390x || solaris s390x
solaris-sh3 || solaris sh3
solaris-sh3eb || solaris sh3eb
solaris-sh4 || solaris sh4
solaris-sh4eb || solaris sh4eb
solaris-sparc || solaris sparc
solaris-sparc64 || solaris sparc64
sparc || linux sparc
sparc64 || linux sparc64
uclibc-linux-alpha || linux alpha
uclibc-linux-amd64 || linux amd64
uclibc-linux-arm || linux arm
uclibc-linux-arm64 || linux arm64
uclibc-linux-armeb || linux armeb
uclibc-linux-armel || linux arm
uclibc-linux-avr32 || linux avr32
uclibc-linux-hppa || linux hppa
uclibc-linux-i386 || linux i386
uclibc-linux-ia64 || linux ia64
uclibc-linux-m32r || linux m32r
uclibc-linux-m68k || linux m68k
uclibc-linux-mips || linux mips
uclibc-linux-mips64 || linux mips64
uclibc-linux-mips64el || linux mips64el
uclibc-linux-mipsel || linux mipsel
uclibc-linux-powerpc || linux powerpc
uclibc-linux-ppc64 || linux ppc64
uclibc-linux-ppc64el || linux ppc64el
uclibc-linux-s390 || linux s390
uclibc-linux-s390x || linux s390x
uclibc-linux-sh3 || linux sh3
uclibc-linux-sh3eb || linux sh3eb
uclibc-linux-sh4 || linux sh4
uclibc-linux-sh4eb || linux sh4eb
uclibc-linux-sparc || linux sparc
uclibc-linux-sparc64 || linux sparc64
uclinux-alpha || uclinux alpha
uclinux-amd64 || uclinux amd64
uclinux-arm || uclinux arm
uclinux-arm64 || uclinux arm64
uclinux-armeb || uclinux armeb
uclinux-armel || uclinux arm
uclinux-avr32 || uclinux avr32
uclinux-hppa || uclinux hppa
uclinux-i386 || uclinux i386
uclinux-ia64 || uclinux ia64
uclinux-m32r || uclinux m32r
uclinux-m68k || uclinux m68k
uclinux-mips || uclinux mips
uclinux-mips64 || uclinux mips64
uclinux-mips64el || uclinux mips64el
uclinux-mipsel || uclinux mipsel
uclinux-powerpc || uclinux powerpc
uclinux-ppc64 || uclinux ppc64
uclinux-ppc64el || uclinux ppc64el
uclinux-s390 || uclinux s390
uclinux-s390x || uclinux s390x
uclinux-sh3 || uclinux sh3
uclinux-sh3eb || uclinux sh3eb
uclinux-sh4 || uclinux sh4
uclinux-sh4eb || uclinux sh4eb
uclinux-sparc || uclinux sparc
uclinux-sparc64 || uclinux sparc64
x32 || linux amd64
lintian-2.5.22ubuntu1/data/common/priorities 0000664 0000000 0000000 00000000562 12310413144 015765 0 ustar # Manually maintained map of priorities
#
# It is used by checks/fields to validate the priority fields and
# checks/group-checks to check policy §2.5. The numbers are used for
# the latter (allowing a trivial <= comparison)
#
# Do not use a non-integer nor a false-value on the right-hand side.
required = 5
important = 4
standard = 3
optional = 2
extra = 1
lintian-2.5.22ubuntu1/data/common/multiarch-dirs 0000664 0000000 0000000 00000025231 12313550275 016535 0 ustar # List of "Multiarch dirs" relationships as provided by
# dpkg-architecture - arch -> dir mapping
# Last updated: 2014-01-14
# With: Debian dpkg-architecture version 1.17.5.
# This file was auto-generated by private/refresh-archs
alpha alpha-linux-gnu
amd64 x86_64-linux-gnu
arm arm-linux-gnu
arm64 aarch64-linux-gnu
armeb armeb-linux-gnu
armel arm-linux-gnueabi
armhf arm-linux-gnueabihf
avr32 avr32-linux-gnu
darwin-alpha alpha-darwin
darwin-amd64 x86_64-darwin
darwin-arm arm-darwin
darwin-arm64 aarch64-darwin
darwin-armeb armeb-darwin
darwin-avr32 avr32-darwin
darwin-hppa hppa-darwin
darwin-i386 i386-darwin
darwin-ia64 ia64-darwin
darwin-m32r m32r-darwin
darwin-m68k m68k-darwin
darwin-mips mips-darwin
darwin-mips64 mips64-darwin
darwin-mips64el mips64el-darwin
darwin-mipsel mipsel-darwin
darwin-powerpc powerpc-darwin
darwin-ppc64 powerpc64-darwin
darwin-ppc64el powerpc64le-darwin
darwin-s390 s390-darwin
darwin-s390x s390x-darwin
darwin-sh3 sh3-darwin
darwin-sh3eb sh3eb-darwin
darwin-sh4 sh4-darwin
darwin-sh4eb sh4eb-darwin
darwin-sparc sparc-darwin
darwin-sparc64 sparc64-darwin
freebsd-alpha alpha-freebsd
freebsd-amd64 x86_64-freebsd
freebsd-arm arm-freebsd
freebsd-arm64 aarch64-freebsd
freebsd-armeb armeb-freebsd
freebsd-avr32 avr32-freebsd
freebsd-hppa hppa-freebsd
freebsd-i386 i386-freebsd
freebsd-ia64 ia64-freebsd
freebsd-m32r m32r-freebsd
freebsd-m68k m68k-freebsd
freebsd-mips mips-freebsd
freebsd-mips64 mips64-freebsd
freebsd-mips64el mips64el-freebsd
freebsd-mipsel mipsel-freebsd
freebsd-powerpc powerpc-freebsd
freebsd-ppc64 powerpc64-freebsd
freebsd-ppc64el powerpc64le-freebsd
freebsd-s390 s390-freebsd
freebsd-s390x s390x-freebsd
freebsd-sh3 sh3-freebsd
freebsd-sh3eb sh3eb-freebsd
freebsd-sh4 sh4-freebsd
freebsd-sh4eb sh4eb-freebsd
freebsd-sparc sparc-freebsd
freebsd-sparc64 sparc64-freebsd
hppa hppa-linux-gnu
hurd-alpha alpha-gnu
hurd-amd64 x86_64-gnu
hurd-arm arm-gnu
hurd-arm64 aarch64-gnu
hurd-armeb armeb-gnu
hurd-avr32 avr32-gnu
hurd-hppa hppa-gnu
hurd-i386 i386-gnu
hurd-ia64 ia64-gnu
hurd-m32r m32r-gnu
hurd-m68k m68k-gnu
hurd-mips mips-gnu
hurd-mips64 mips64-gnu
hurd-mips64el mips64el-gnu
hurd-mipsel mipsel-gnu
hurd-powerpc powerpc-gnu
hurd-ppc64 powerpc64-gnu
hurd-ppc64el powerpc64le-gnu
hurd-s390 s390-gnu
hurd-s390x s390x-gnu
hurd-sh3 sh3-gnu
hurd-sh3eb sh3eb-gnu
hurd-sh4 sh4-gnu
hurd-sh4eb sh4eb-gnu
hurd-sparc sparc-gnu
hurd-sparc64 sparc64-gnu
i386 i386-linux-gnu
ia64 ia64-linux-gnu
kfreebsd-alpha alpha-kfreebsd-gnu
kfreebsd-amd64 x86_64-kfreebsd-gnu
kfreebsd-arm arm-kfreebsd-gnu
kfreebsd-arm64 aarch64-kfreebsd-gnu
kfreebsd-armeb armeb-kfreebsd-gnu
kfreebsd-avr32 avr32-kfreebsd-gnu
kfreebsd-hppa hppa-kfreebsd-gnu
kfreebsd-i386 i386-kfreebsd-gnu
kfreebsd-ia64 ia64-kfreebsd-gnu
kfreebsd-m32r m32r-kfreebsd-gnu
kfreebsd-m68k m68k-kfreebsd-gnu
kfreebsd-mips mips-kfreebsd-gnu
kfreebsd-mips64 mips64-kfreebsd-gnu
kfreebsd-mips64el mips64el-kfreebsd-gnu
kfreebsd-mipsel mipsel-kfreebsd-gnu
kfreebsd-powerpc powerpc-kfreebsd-gnu
kfreebsd-ppc64 powerpc64-kfreebsd-gnu
kfreebsd-ppc64el powerpc64le-kfreebsd-gnu
kfreebsd-s390 s390-kfreebsd-gnu
kfreebsd-s390x s390x-kfreebsd-gnu
kfreebsd-sh3 sh3-kfreebsd-gnu
kfreebsd-sh3eb sh3eb-kfreebsd-gnu
kfreebsd-sh4 sh4-kfreebsd-gnu
kfreebsd-sh4eb sh4eb-kfreebsd-gnu
kfreebsd-sparc sparc-kfreebsd-gnu
kfreebsd-sparc64 sparc64-kfreebsd-gnu
knetbsd-alpha alpha-knetbsd-gnu
knetbsd-amd64 x86_64-knetbsd-gnu
knetbsd-arm arm-knetbsd-gnu
knetbsd-arm64 aarch64-knetbsd-gnu
knetbsd-armeb armeb-knetbsd-gnu
knetbsd-avr32 avr32-knetbsd-gnu
knetbsd-hppa hppa-knetbsd-gnu
knetbsd-i386 i386-knetbsd-gnu
knetbsd-ia64 ia64-knetbsd-gnu
knetbsd-m32r m32r-knetbsd-gnu
knetbsd-m68k m68k-knetbsd-gnu
knetbsd-mips mips-knetbsd-gnu
knetbsd-mips64 mips64-knetbsd-gnu
knetbsd-mips64el mips64el-knetbsd-gnu
knetbsd-mipsel mipsel-knetbsd-gnu
knetbsd-powerpc powerpc-knetbsd-gnu
knetbsd-ppc64 powerpc64-knetbsd-gnu
knetbsd-ppc64el powerpc64le-knetbsd-gnu
knetbsd-s390 s390-knetbsd-gnu
knetbsd-s390x s390x-knetbsd-gnu
knetbsd-sh3 sh3-knetbsd-gnu
knetbsd-sh3eb sh3eb-knetbsd-gnu
knetbsd-sh4 sh4-knetbsd-gnu
knetbsd-sh4eb sh4eb-knetbsd-gnu
knetbsd-sparc sparc-knetbsd-gnu
knetbsd-sparc64 sparc64-knetbsd-gnu
kopensolaris-alpha alpha-kopensolaris-gnu
kopensolaris-amd64 x86_64-kopensolaris-gnu
kopensolaris-arm arm-kopensolaris-gnu
kopensolaris-arm64 aarch64-kopensolaris-gnu
kopensolaris-armeb armeb-kopensolaris-gnu
kopensolaris-avr32 avr32-kopensolaris-gnu
kopensolaris-hppa hppa-kopensolaris-gnu
kopensolaris-i386 i386-kopensolaris-gnu
kopensolaris-ia64 ia64-kopensolaris-gnu
kopensolaris-m32r m32r-kopensolaris-gnu
kopensolaris-m68k m68k-kopensolaris-gnu
kopensolaris-mips mips-kopensolaris-gnu
kopensolaris-mips64 mips64-kopensolaris-gnu
kopensolaris-mips64el mips64el-kopensolaris-gnu
kopensolaris-mipsel mipsel-kopensolaris-gnu
kopensolaris-powerpc powerpc-kopensolaris-gnu
kopensolaris-ppc64 powerpc64-kopensolaris-gnu
kopensolaris-ppc64el powerpc64le-kopensolaris-gnu
kopensolaris-s390 s390-kopensolaris-gnu
kopensolaris-s390x s390x-kopensolaris-gnu
kopensolaris-sh3 sh3-kopensolaris-gnu
kopensolaris-sh3eb sh3eb-kopensolaris-gnu
kopensolaris-sh4 sh4-kopensolaris-gnu
kopensolaris-sh4eb sh4eb-kopensolaris-gnu
kopensolaris-sparc sparc-kopensolaris-gnu
kopensolaris-sparc64 sparc64-kopensolaris-gnu
lpia i386-linux-gnulp
m32r m32r-linux-gnu
m68k m68k-linux-gnu
mint-m68k m68k-mint
mips mips-linux-gnu
mips64 mips64-linux-gnuabi64
mips64el mips64el-linux-gnuabi64
mipsel mipsel-linux-gnu
mipsn32 mips64-linux-gnuabin32
mipsn32el mips64el-linux-gnuabin32
musl-linux-alpha alpha-linux-musl
musl-linux-amd64 x86_64-linux-musl
musl-linux-arm arm-linux-musl
musl-linux-arm64 aarch64-linux-musl
musl-linux-armeb armeb-linux-musl
musl-linux-armhf arm-linux-musleabihf
musl-linux-avr32 avr32-linux-musl
musl-linux-hppa hppa-linux-musl
musl-linux-i386 i386-linux-musl
musl-linux-ia64 ia64-linux-musl
musl-linux-m32r m32r-linux-musl
musl-linux-m68k m68k-linux-musl
musl-linux-mips mips-linux-musl
musl-linux-mips64 mips64-linux-musl
musl-linux-mips64el mips64el-linux-musl
musl-linux-mipsel mipsel-linux-musl
musl-linux-powerpc powerpc-linux-musl
musl-linux-ppc64 powerpc64-linux-musl
musl-linux-ppc64el powerpc64le-linux-musl
musl-linux-s390 s390-linux-musl
musl-linux-s390x s390x-linux-musl
musl-linux-sh3 sh3-linux-musl
musl-linux-sh3eb sh3eb-linux-musl
musl-linux-sh4 sh4-linux-musl
musl-linux-sh4eb sh4eb-linux-musl
musl-linux-sparc sparc-linux-musl
musl-linux-sparc64 sparc64-linux-musl
netbsd-alpha alpha-netbsd
netbsd-amd64 x86_64-netbsd
netbsd-arm arm-netbsd
netbsd-arm64 aarch64-netbsd
netbsd-armeb armeb-netbsd
netbsd-avr32 avr32-netbsd
netbsd-hppa hppa-netbsd
netbsd-i386 i386-netbsd
netbsd-ia64 ia64-netbsd
netbsd-m32r m32r-netbsd
netbsd-m68k m68k-netbsd
netbsd-mips mips-netbsd
netbsd-mips64 mips64-netbsd
netbsd-mips64el mips64el-netbsd
netbsd-mipsel mipsel-netbsd
netbsd-powerpc powerpc-netbsd
netbsd-ppc64 powerpc64-netbsd
netbsd-ppc64el powerpc64le-netbsd
netbsd-s390 s390-netbsd
netbsd-s390x s390x-netbsd
netbsd-sh3 sh3-netbsd
netbsd-sh3eb sh3eb-netbsd
netbsd-sh4 sh4-netbsd
netbsd-sh4eb sh4eb-netbsd
netbsd-sparc sparc-netbsd
netbsd-sparc64 sparc64-netbsd
openbsd-alpha alpha-openbsd
openbsd-amd64 x86_64-openbsd
openbsd-arm arm-openbsd
openbsd-arm64 aarch64-openbsd
openbsd-armeb armeb-openbsd
openbsd-avr32 avr32-openbsd
openbsd-hppa hppa-openbsd
openbsd-i386 i386-openbsd
openbsd-ia64 ia64-openbsd
openbsd-m32r m32r-openbsd
openbsd-m68k m68k-openbsd
openbsd-mips mips-openbsd
openbsd-mips64 mips64-openbsd
openbsd-mips64el mips64el-openbsd
openbsd-mipsel mipsel-openbsd
openbsd-powerpc powerpc-openbsd
openbsd-ppc64 powerpc64-openbsd
openbsd-ppc64el powerpc64le-openbsd
openbsd-s390 s390-openbsd
openbsd-s390x s390x-openbsd
openbsd-sh3 sh3-openbsd
openbsd-sh3eb sh3eb-openbsd
openbsd-sh4 sh4-openbsd
openbsd-sh4eb sh4eb-openbsd
openbsd-sparc sparc-openbsd
openbsd-sparc64 sparc64-openbsd
powerpc powerpc-linux-gnu
powerpcspe powerpc-linux-gnuspe
ppc64 powerpc64-linux-gnu
ppc64el powerpc64le-linux-gnu
s390 s390-linux-gnu
s390x s390x-linux-gnu
sh3 sh3-linux-gnu
sh3eb sh3eb-linux-gnu
sh4 sh4-linux-gnu
sh4eb sh4eb-linux-gnu
solaris-alpha alpha-solaris
solaris-amd64 x86_64-solaris
solaris-arm arm-solaris
solaris-arm64 aarch64-solaris
solaris-armeb armeb-solaris
solaris-avr32 avr32-solaris
solaris-hppa hppa-solaris
solaris-i386 i386-solaris
solaris-ia64 ia64-solaris
solaris-m32r m32r-solaris
solaris-m68k m68k-solaris
solaris-mips mips-solaris
solaris-mips64 mips64-solaris
solaris-mips64el mips64el-solaris
solaris-mipsel mipsel-solaris
solaris-powerpc powerpc-solaris
solaris-ppc64 powerpc64-solaris
solaris-ppc64el powerpc64le-solaris
solaris-s390 s390-solaris
solaris-s390x s390x-solaris
solaris-sh3 sh3-solaris
solaris-sh3eb sh3eb-solaris
solaris-sh4 sh4-solaris
solaris-sh4eb sh4eb-solaris
solaris-sparc sparc-solaris
solaris-sparc64 sparc64-solaris
sparc sparc-linux-gnu
sparc64 sparc64-linux-gnu
uclibc-linux-alpha alpha-linux-uclibc
uclibc-linux-amd64 x86_64-linux-uclibc
uclibc-linux-arm arm-linux-uclibc
uclibc-linux-arm64 aarch64-linux-uclibc
uclibc-linux-armeb armeb-linux-uclibc
uclibc-linux-armel arm-linux-uclibceabi
uclibc-linux-avr32 avr32-linux-uclibc
uclibc-linux-hppa hppa-linux-uclibc
uclibc-linux-i386 i386-linux-uclibc
uclibc-linux-ia64 ia64-linux-uclibc
uclibc-linux-m32r m32r-linux-uclibc
uclibc-linux-m68k m68k-linux-uclibc
uclibc-linux-mips mips-linux-uclibc
uclibc-linux-mips64 mips64-linux-uclibc
uclibc-linux-mips64el mips64el-linux-uclibc
uclibc-linux-mipsel mipsel-linux-uclibc
uclibc-linux-powerpc powerpc-linux-uclibc
uclibc-linux-ppc64 powerpc64-linux-uclibc
uclibc-linux-ppc64el powerpc64le-linux-uclibc
uclibc-linux-s390 s390-linux-uclibc
uclibc-linux-s390x s390x-linux-uclibc
uclibc-linux-sh3 sh3-linux-uclibc
uclibc-linux-sh3eb sh3eb-linux-uclibc
uclibc-linux-sh4 sh4-linux-uclibc
uclibc-linux-sh4eb sh4eb-linux-uclibc
uclibc-linux-sparc sparc-linux-uclibc
uclibc-linux-sparc64 sparc64-linux-uclibc
uclinux-alpha alpha-uclinux-uclibc
uclinux-amd64 x86_64-uclinux-uclibc
uclinux-arm arm-uclinux-uclibc
uclinux-arm64 aarch64-uclinux-uclibc
uclinux-armeb armeb-uclinux-uclibc
uclinux-armel arm-uclinux-uclibceabi
uclinux-avr32 avr32-uclinux-uclibc
uclinux-hppa hppa-uclinux-uclibc
uclinux-i386 i386-uclinux-uclibc
uclinux-ia64 ia64-uclinux-uclibc
uclinux-m32r m32r-uclinux-uclibc
uclinux-m68k m68k-uclinux-uclibc
uclinux-mips mips-uclinux-uclibc
uclinux-mips64 mips64-uclinux-uclibc
uclinux-mips64el mips64el-uclinux-uclibc
uclinux-mipsel mipsel-uclinux-uclibc
uclinux-powerpc powerpc-uclinux-uclibc
uclinux-ppc64 powerpc64-uclinux-uclibc
uclinux-ppc64el powerpc64le-uclinux-uclibc
uclinux-s390 s390-uclinux-uclibc
uclinux-s390x s390x-uclinux-uclibc
uclinux-sh3 sh3-uclinux-uclibc
uclinux-sh3eb sh3eb-uclinux-uclibc
uclinux-sh4 sh4-uclinux-uclibc
uclinux-sh4eb sh4eb-uclinux-uclibc
uclinux-sparc sparc-uclinux-uclibc
uclinux-sparc64 sparc64-uclinux-uclibc
x32 x86_64-linux-gnux32
lintian-2.5.22ubuntu1/data/common/source-fields 0000664 0000000 0000000 00000001322 12310413206 016332 0 ustar # Manually maintained list of known source fields
# - please keep it sorted
architecture
autobuild
binary
bugs
build-conflicts
build-conflicts-indep
build-depends
build-depends-indep
checksums-md5
checksums-sha1
checksums-sha256
dgit
dm-upload-allowed
files
format
homepage
maintainer
origin
# Special-case, original-maintainer is not ok in Debian, but we allow
# it in any non-Debian profile by default.
#
# NB: Do not rely on @if-vendor-is-not in your data files; it may
# disappear without notice
@if-vendor-is-not debian original-maintainer
package-list
python-version
ruby-versions
source
standards-version
testsuite
uploaders
vcs-arch
vcs-browser
vcs-bzr
vcs-cvs
vcs-darcs
vcs-git
vcs-hg
vcs-mtn
vcs-svn
version
lintian-2.5.22ubuntu1/data/binaries/ 0000775 0000000 0000000 00000000000 12313550312 014154 5 ustar lintian-2.5.22ubuntu1/data/binaries/arch-64bit-equivs 0000664 0000000 0000000 00000000534 12310413144 017254 0 ustar # Manually maintained table mapping 32bit archs to the
# name of their 64bit counter part.
#
# Please keep this sorted by "key" (i.e. 32bit arch)
hppa => hppa64
i386 => amd64
kfreebsd-i386 => kfreebsd-amd64
mips => mips64
mipsel => mipsel64
powerpc => ppc64
s390 => s390x
sparc => sparc64
lintian-2.5.22ubuntu1/data/binaries/lfs-symbols 0000664 0000000 0000000 00000001322 12310413144 016345 0 ustar # Manually maintained list of non-lfs symbols
#
# List was found by grepping around in /usr/include on an i386 system
# with build-essential installed
#
# Please keep this sorted by key.
__fxstat
__fxstatat
__lxstat
__xstat
aio_cancel
aio_error
aio_fsync
aio_read
aio_return
aio_suspend
aio_write
alphasort
creat
fallocate
fgetpos
fopen
freopen
fseeko
fsetpos
fstatfs
fstatvfs
ftello
ftruncate
fts_open
fts_read
fts_children
fts_set
fts_close
ftw
getdirentries
getrlimit
glob
globfree
lio_listio
lockf
lseek
mkostemp
mkostemps
mkstemp
mkstemps
mmap
nftw
open
openat
posix_fadvise
posix_fallocate
pread
preadv
prlimit
pwrite
pwritev
readdir
readdir_r
scandir
sendfile
setrlimit
statfs
statvfs
tmpfile
truncate
versionsort
lintian-2.5.22ubuntu1/data/binaries/hardening-tags 0000664 0000000 0000000 00000074375 12313550312 017012 0 ustar # Map of architectures to enabled hardening tags.
#
# NB: Keep this in sync with checks/binaries.desc
# Last updated: 2014-01-14
# With: Debian dpkg-architecture version 1.17.5.
# This file was auto-generated by private/refresh-archs
alpha || hardening-no-fortify-functions, hardening-no-relro
amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
arm || hardening-no-fortify-functions, hardening-no-relro
arm64 || hardening-no-fortify-functions, hardening-no-relro
armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
armel || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
armhf || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
darwin-alpha || hardening-no-fortify-functions, hardening-no-relro
darwin-amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-arm || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-arm64 || hardening-no-fortify-functions, hardening-no-relro
darwin-armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
darwin-hppa || hardening-no-fortify-functions
darwin-i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-ia64 || hardening-no-fortify-functions
darwin-m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-mips || hardening-no-fortify-functions, hardening-no-relro
darwin-mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-mipsel || hardening-no-fortify-functions, hardening-no-relro
darwin-powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
darwin-sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-alpha || hardening-no-fortify-functions, hardening-no-relro
freebsd-amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-arm || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-arm64 || hardening-no-fortify-functions, hardening-no-relro
freebsd-armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
freebsd-hppa || hardening-no-fortify-functions
freebsd-i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-ia64 || hardening-no-fortify-functions
freebsd-m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-mips || hardening-no-fortify-functions, hardening-no-relro
freebsd-mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-mipsel || hardening-no-fortify-functions, hardening-no-relro
freebsd-powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
freebsd-sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hppa || hardening-no-fortify-functions
hurd-alpha || hardening-no-fortify-functions, hardening-no-relro
hurd-amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-arm || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-arm64 || hardening-no-fortify-functions, hardening-no-relro
hurd-armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
hurd-hppa || hardening-no-fortify-functions
hurd-i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-ia64 || hardening-no-fortify-functions
hurd-m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-mips || hardening-no-fortify-functions, hardening-no-relro
hurd-mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-mipsel || hardening-no-fortify-functions, hardening-no-relro
hurd-powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
hurd-sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
ia64 || hardening-no-fortify-functions
kfreebsd-alpha || hardening-no-fortify-functions, hardening-no-relro
kfreebsd-amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-arm || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-arm64 || hardening-no-fortify-functions, hardening-no-relro
kfreebsd-armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
kfreebsd-hppa || hardening-no-fortify-functions
kfreebsd-i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-ia64 || hardening-no-fortify-functions
kfreebsd-m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-mips || hardening-no-fortify-functions, hardening-no-relro
kfreebsd-mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-mipsel || hardening-no-fortify-functions, hardening-no-relro
kfreebsd-powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kfreebsd-sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-alpha || hardening-no-fortify-functions, hardening-no-relro
knetbsd-amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-arm || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-arm64 || hardening-no-fortify-functions, hardening-no-relro
knetbsd-armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
knetbsd-hppa || hardening-no-fortify-functions
knetbsd-i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-ia64 || hardening-no-fortify-functions
knetbsd-m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-mips || hardening-no-fortify-functions, hardening-no-relro
knetbsd-mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-mipsel || hardening-no-fortify-functions, hardening-no-relro
knetbsd-powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
knetbsd-sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-alpha || hardening-no-fortify-functions, hardening-no-relro
kopensolaris-amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-arm || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-arm64 || hardening-no-fortify-functions, hardening-no-relro
kopensolaris-armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
kopensolaris-hppa || hardening-no-fortify-functions
kopensolaris-i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-ia64 || hardening-no-fortify-functions
kopensolaris-m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-mips || hardening-no-fortify-functions, hardening-no-relro
kopensolaris-mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-mipsel || hardening-no-fortify-functions, hardening-no-relro
kopensolaris-powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
kopensolaris-sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
lpia || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
mint-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
mips || hardening-no-fortify-functions, hardening-no-relro
mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
mipsel || hardening-no-fortify-functions, hardening-no-relro
mipsn32 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
mipsn32el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-alpha || hardening-no-fortify-functions, hardening-no-relro
musl-linux-amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-arm || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-arm64 || hardening-no-fortify-functions, hardening-no-relro
musl-linux-armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-armhf || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
musl-linux-hppa || hardening-no-fortify-functions
musl-linux-i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-ia64 || hardening-no-fortify-functions
musl-linux-m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-mips || hardening-no-fortify-functions, hardening-no-relro
musl-linux-mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-mipsel || hardening-no-fortify-functions, hardening-no-relro
musl-linux-powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
musl-linux-sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-alpha || hardening-no-fortify-functions, hardening-no-relro
netbsd-amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-arm || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-arm64 || hardening-no-fortify-functions, hardening-no-relro
netbsd-armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
netbsd-hppa || hardening-no-fortify-functions
netbsd-i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-ia64 || hardening-no-fortify-functions
netbsd-m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-mips || hardening-no-fortify-functions, hardening-no-relro
netbsd-mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-mipsel || hardening-no-fortify-functions, hardening-no-relro
netbsd-powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
netbsd-sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-alpha || hardening-no-fortify-functions, hardening-no-relro
openbsd-amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-arm || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-arm64 || hardening-no-fortify-functions, hardening-no-relro
openbsd-armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
openbsd-hppa || hardening-no-fortify-functions
openbsd-i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-ia64 || hardening-no-fortify-functions
openbsd-m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-mips || hardening-no-fortify-functions, hardening-no-relro
openbsd-mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-mipsel || hardening-no-fortify-functions, hardening-no-relro
openbsd-powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
openbsd-sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
powerpcspe || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-alpha || hardening-no-fortify-functions, hardening-no-relro
solaris-amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-arm || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-arm64 || hardening-no-fortify-functions, hardening-no-relro
solaris-armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
solaris-hppa || hardening-no-fortify-functions
solaris-i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-ia64 || hardening-no-fortify-functions
solaris-m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-mips || hardening-no-fortify-functions, hardening-no-relro
solaris-mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-mipsel || hardening-no-fortify-functions, hardening-no-relro
solaris-powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
solaris-sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-alpha || hardening-no-fortify-functions, hardening-no-relro
uclibc-linux-amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-arm || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-arm64 || hardening-no-fortify-functions, hardening-no-relro
uclibc-linux-armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-armel || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
uclibc-linux-hppa || hardening-no-fortify-functions
uclibc-linux-i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-ia64 || hardening-no-fortify-functions
uclibc-linux-m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-mips || hardening-no-fortify-functions, hardening-no-relro
uclibc-linux-mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-mipsel || hardening-no-fortify-functions, hardening-no-relro
uclibc-linux-powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclibc-linux-sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-alpha || hardening-no-fortify-functions, hardening-no-relro
uclinux-amd64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-arm || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-arm64 || hardening-no-fortify-functions, hardening-no-relro
uclinux-armeb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-armel || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-avr32 || hardening-no-fortify-functions, hardening-no-stackprotector
uclinux-hppa || hardening-no-fortify-functions
uclinux-i386 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-ia64 || hardening-no-fortify-functions
uclinux-m32r || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-m68k || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-mips || hardening-no-fortify-functions, hardening-no-relro
uclinux-mips64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-mips64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-mipsel || hardening-no-fortify-functions, hardening-no-relro
uclinux-powerpc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-ppc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-ppc64el || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-s390 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-s390x || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-sh3 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-sh3eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-sh4 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-sh4eb || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-sparc || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
uclinux-sparc64 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
x32 || hardening-no-fortify-functions, hardening-no-relro, hardening-no-stackprotector
lintian-2.5.22ubuntu1/data/binaries/embedded-libs 0000664 0000000 0000000 00000010657 12310415177 016576 0 ustar # Manually maintained table of embedded libraries.
#
# Basic syntax:
# key ||
# key || [options] ||
#
# Where [options] is space separated list of:
#
# source=
# - If present, it declares that this library is built from the
# source package
# - If both "source" and "source-regex" are omitted, then
# Lintian will default to using "source" with a value equal
# to the key.
# - Cannot be used with "source-regex"
#
# source-regex=
# - If present, it declares that this library is built from (or
# expected in binaries build from) any source package, which
# name matches .
# - Cannot be used with "source"
#
# libname=
# - Declares the "name" of the library.
# - If omitted, the key will be used.
#
# Note: Avoid unintended leading and trailing whitespace in
# as Lintian will assume such whitespace is a part of the regex.
# If possible, consider using \s or [ ] to mark intended trailing
# whitespace.
#
# If contains the separator (||), then the "options" part is
# not optional.
#
# Please keep it sorted by key.
#
bzip2 ||(?m)^This is a bug in bzip2
curl ||A libcurl function was given a bad argument
expat ||(?m)^requested feature requires XML_DTD support in Expat
file ||(?m)^could not find any (?:valid )?magic files
freetype ||FT_Get_CID_Is_Internally_CID_Keyed
ftgl ||FTGlyphContainer
gl2ps ||\(C\) 1999-2009 C\. Geuzaine
glee ||Extension name exceeds 1023 characters\.
glew ||Missing GL version
libavcodec ||source=libav||insufficient thread locking around avcodec_open/close\(\)\n
libavdevice ||source=libav||Soundcard does not support 16 bit sample format\n
libavfilter ||source=libav||Buffer video frames, and make them accessible to the filterchain\.
libavformat ||source=libav||Format detected only with low score of %d, misdetection possible!\n
libavutil ||source=libav||AVOption type %d of option %s not implemented yet\n
libgd ||source-regex=libgd2? ||gd-(?:png|jpeg:) error:
libgadu ||Gadu-Gadu Client Build
libjpeg ||source-regex=libjpeg.* ||(?m)^Caution: quantization tables are too coarse for baseline JPEG
libjsoncpp ||A valid JSON document must be either an array or an object value\.
liblivemedia||(?:Received incoming RTSP request:|LIVE555 Streaming Media v)
libm ||source=eglibc ||neg\*\*non-integral: DOMAIN error
libmng ||TERM misplaced during creation of MNG stream
libmsn ||The MSN server has terminated the connection with an unknown reason code\.
libmikmod ||APUN \(APlayer\) and UNI \(MikMod\)
libmysqlclient ||source-regex=mysql(?:-\d.*)? ||MySQL client ran out of memory
libpcap ||(?:pcap_activate: The "any" device isn\'t supported|corrupted frame on kernel ring mac offset)
libpng ||(?m)^Potential overflow in png_zalloc
libraw ||Unsupported file format or not RAW file
libpostproc ||source-regex=lib(?:av|postproc)||using npp filters 0x%X/0x%X\n
libssh2 ||Invalid descriptor passed to libssh2_poll
libssh ||Error allocating memory for ssh_scp
libswscale ||source=libav||Exactly one scaler algorithm must be chosen\n
# Trailing whitespace was present when the file was created (see commit: 77fd246)
libtheora ||Xiph.Org libtheora\s
libxml2 ||root and DTD name do not match
ltdl ||source=libtool ||(?m)^library already shutdown
ncurses ||Not enough memory to create terminal structure
nspr ||(?m)^Unable to create nspr log file
nss ||(?m)^My Encrytion Test Data
openjpeg ||tcd_decode: incomplete bistream
openssl ||You need to read the OpenSSL FAQ
pcre3 ||this version of PCRE is not compiled with PCRE_UTF8 support
poppler ||source-regex=(?:poppler|xpdf)||(?:May not be a PDF file \(continuing anyway\)|PDF file is damaged - attempting to reconstruct xref table\.\.\.)
sqlite ||source-regex=sqlite3? ||CREATE TABLE sqlite_master\(
t1lib ||t1lib is copyright \(c\) Rainer Menzner
tiff ||source-regex=tiff\d* ||No space for PixarLog state block
tinyxml ||(?m)^(?:Error when TiXmlDocument added to document|Error null \(0\) or unexpected EOF found in input stream\.)
# We exclude version strings starting with "4 " since that's a mark of the
# Pascal implementation, which is not what this tag is designed to detect.
# (The "4" is actually the string length (52 characters) in the Pascal
# counted string format.)
zlib ||source-regex=(?:zlib|klibc|kfreebsd-kernel-di\w+) ||(?m)(?