Lintian crashes with "undefined value" if deb lacks intermediate directories

Bug #1351380 reported by Stian Soiland-Reyes on 2014-08-01
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
lintian (Ubuntu)
Undecided
Unassigned

Bug Description

If I create a deb with install4j that installs to /opt/test/ - then lintian crashes:

stain@stain-VirtualBox:~$ lintian lintian-test-intermediate-folders_linux_0_1_0.deb
Can't use an undefined value as an ARRAY reference at /usr/share/perl5/Lintian/Collect/Package.pm line 513, <$_[...]> line 2.
warning: collect info md5sums about package lintian-test-intermediate-folders failed
warning: skipping check of binary package lintian-test-intermediate-folders

If I make it install to /opt instead, lintian is happy (but reports the missing bits as it should):

stain@stain-VirtualBox:~$ lintian lintian-test-intermediate-folders_linux_0_2_0.deb
E: lintian-test-intermediate-folders: changelog-file-missing-in-native-package
W: lintian-test-intermediate-folders: control-file-is-empty md5sums
E: lintian-test-intermediate-folders: no-copyright-file
E: lintian-test-intermediate-folders: description-starts-with-package-name
E: lintian-test-intermediate-folders: extended-description-is-empty
E: lintian-test-intermediate-folders: maintainer-name-missing
E: lintian-test-intermediate-folders: maintainer-address-missing
W: lintian-test-intermediate-folders: no-section-field
W: lintian-test-intermediate-folders: empty-binary-package
E: lintian-test-intermediate-folders: dir-or-file-in-opt opt/test/
W: lintian-test-intermediate-folders: maintainer-script-ignores-errors prerm
W: lintian-test-intermediate-folders: maintainer-script-ignores-errors postinst

This causes install4j debian packages - including install4j to not install in Ubuntu Software Centre, as it will report the equivalent of:

The package is of bad quality.
The installation of a package which violates the quality standards isn't allowed. This could cause serious problems on your computer. Please contact the person or organisation who provided this package file and include the details beneath.
Lintian check results for /home/scmjpg/Desktop/taverna-workbench-biodiversity-2.5.0-linux_amd64.deb:
Can't use an undefined value as an ARRAY reference at /usr/share/perl5/Lintian/Collect/Package.pm line 513, <$_[...]> line 2853.
Can't use an undefined value as an ARRAY reference at /usr/share/perl5/Lintian/Collect/Package.pm line 513, <$_[...]> line 2853.
warning: collect info md5sums about package taverna-workbench-biodiversity failed
warning: skipping check of binary package taverna-workbench-biodiversity
warning: collect info scripts about package taverna-workbench-biodiversity failed
warning: skipping check of binary package taverna-workbench-biodiversity
Can't use an undefined value as an ARRAY reference at /usr/share/perl5/Lintian/Collect/Package.pm line 513, <$_[...]> line 2853.
warning: collect info file-info about package taverna-workbench-biodiversity failed
warning: skipping check of binary package taverna-workbench-biodiversity

Looking at /usr/share/perl5/Lintian/Collect/Package.pm , the bug seems to be caused by the deb from install4j not listing the intermediate directories to the target directory, causing $children{$file} to be unitialized. This is otherwise initialized as a side-effect of

$children{$parent} = [] unless exists $children{$parent};

but lint does also a special case if the root entry is missing:

    if (!exists($idxh{''})) {
        # The index did not include a "root" dir, so fake one.
        # Note we have to do a copy here, since we will eventually
        # add a "children" field.
        my %cpy = %ROOT_INDEX_TEMPLATE;
        if ($num_idx) {
            $cpy{'uid'} = 0;
            $cpy{'gid'} = 0;
        }
        $idxh{''} = \%cpy;
    }

However no special case is done for the missing intermediate directories, and the above does not initialize.

Adding so it ends with:

        $idxh{''} = \%cpy;
        $children{''} = [] unless exists $children{''};
    }

Fixes the problem:

stain@stain-VirtualBox:~$ lintian lintian-test-intermediate-folders_linux_0_1_0.deb
E: lintian-test-intermediate-folders: changelog-file-missing-in-native-package
W: lintian-test-intermediate-folders: control-file-is-empty md5sums
E: lintian-test-intermediate-folders: no-copyright-file
E: lintian-test-intermediate-folders: description-starts-with-package-name
E: lintian-test-intermediate-folders: extended-description-is-empty
E: lintian-test-intermediate-folders: maintainer-name-missing
E: lintian-test-intermediate-folders: maintainer-address-missing
W: lintian-test-intermediate-folders: no-section-field
W: lintian-test-intermediate-folders: empty-binary-package
Use of uninitialized value in exists at /usr/share/lintian/checks/files.pm line 339.
E: lintian-test-intermediate-folders: dir-or-file-in-opt opt/lint-test/
E: lintian-test-intermediate-folders: dir-or-file-in-opt opt/lint-test/test/
W: lintian-test-intermediate-folders: maintainer-script-ignores-errors prerm
W: lintian-test-intermediate-folders: maintainer-script-ignores-errors postinst

and thus after this the deb can be installed in Ubuntu Software Centre.

ProblemType: Bug
DistroRelease: Ubuntu 14.04
Package: lintian 2.5.22ubuntu1
ProcVersionSignature: Ubuntu 3.13.0-32.57-generic 3.13.11.4
Uname: Linux 3.13.0-32-generic x86_64
ApportVersion: 2.14.1-0ubuntu3.2
Architecture: amd64
CurrentDesktop: Unity
Date: Fri Aug 1 17:12:48 2014
InstallationDate: Installed on 2014-08-01 (0 days ago)
InstallationMedia: Ubuntu 14.04.1 LTS "Trusty Tahr" - Release amd64 (20140722.2)
PackageArchitecture: all
SourcePackage: lintian
UpgradeStatus: No upgrade log present (probably fresh install)

On 2014-08-01 18:23, Stian Soiland-Reyes wrote:
> Public bug reported:
>
> If I create a deb with install4j that installs to /opt/test/ - then
> lintian crashes:
>
> [...]

Hi,

Thanks for the report and the following analysis of the problem.

Should you run into future crash issues with lintian, please consider
filing the bug against lintian upstream.

I have applied a few patches upstream for this issue:
 * [f89954f] - Fixes the crash
 * [4d6bb4e] - Adds a warning for not having intermediate directories

These are scheduled for inclusion in lintian 2.5.32.

 * I am not maintaining the Ubuntu package, so I /cannot/ comment on
   whether this will be fixed in / backported to your current Ubuntu
   release.

>
> [...]
>
> However no special case is done for the missing intermediate
> directories, and the above does not initialize.
>
> Adding so it ends with:
>
> $idxh{''} = \%cpy;
> $children{''} = [] unless exists $children{''};
> }
>
> Fixes the problem:
>
> [...]

This indeed avoided the crash. However, it would leave the path
structure disconnected causing several checks to report incorrect
results (in particular in Lintian/2.5.28).

Therefore I have solved this differently by constructing all missing
intermediate directories (see [f89954f]), which also trivially allowed
for us to discover/report the missing intermediate directories.

Once again, thanks for the report and the following analysis.

Thanks,
~Niels

[f89954f]:
https://anonscm.debian.org/cgit/lintian/lintian.git/commit/?id=f89954f8e87515c839849c59568261be256c7081
[4d6bb4e]:
https://anonscm.debian.org/cgit/lintian/lintian.git/commit/?id=4d6bb4edd26d74f675fb5bcad853d6e05e7fca3f

Bug handling:
 bug 1351380
 tag patch
 status fixcommitted

Changed in lintian (Ubuntu):
status: New → Fix Committed
Launchpad Janitor (janitor) wrote :
Download full text (8.8 KiB)

This bug was fixed in the package lintian - 2.5.32ubuntu1

---------------
lintian (2.5.32ubuntu1) wily; urgency=low

  * Merge from Debian unstable. Remaining changes:
    - Ship pre-uglified json.js to avoid build-dep on nodejs for the tests.

lintian (2.5.32) unstable; urgency=medium

  * Summary of tag changes:
    + Added:
      - changelog-empty-entry
      - dh-manual-sequence-control-obsolete
      - license-problem-non-free-img-lenna
      - missing-intermediate-directory
      - package-contains-cmake-private-file
      - package-contains-mime-file-outside-package-dir
      - package-install-apt-preferences
      - package-install-apt-sources
      - package-install-ieee-data
      - service-key-has-whitespace
      - source-contains-autogenerated-gperf-data
      - source-contains-data-from-ieee-data-oui-db
      - static-library-has-unneeded-section
    + Removed:
      - hyphen-used-as-minus-sign

  * checks/*.pm:
    + [NT] Rewrite to handle new check_spelling{,_picky}
  * checks/binaries.pm:
    + [NT] Also apply the binary-has-unneeded-section check on
      static libs. (See #662998)
  * checks/cruft.{desc,pm}:
    + [BR] Detect non free lenna file based on filename and filetype.
      (Closes: #771191).
    + [BR] Avoid a false positive for autogenerated index in dx package
      for source-is-missing.
  * checks/changes-file.{desc,pm}:
    + [NT] Downgrade backports-changes-missing to a wishlist (I) tag.
      Thanks to Vincent Cheng for the report. (Closes: #785084)
  * checks/changelog-file.{desc,pm}:
    + [BR] Detect empty changelog entry. (Closes: #763457)
  * checks/debhelper.{desc,pm}:
    + [NT] Warn about using dh --{until,before,after,remaining} as
      these are deprecated and have been since debhelper/8.9.4.
    + [NT] Permit the use of dh-exec-install in ".manpages" as well
      since dh-exec now advertises this as acceptable. Thanks to
      Andreas Henriksson for reporting this. (Closes: #788796)
  * checks/fields.pm:
    + [BR] Detect double comma in uploaders fields.
      (Closes: #783628).
  * checks/files.{desc,pm}:
    + [NT] Apply patch from Tomasz Buchert to avoid false-positive
      package-contains-timestamped-gzip in some cases.
      (Closes: #762105)
    + [BR] Detects // tricks in privacy breach test.
      (Closes: #786362)
    + [BR] Apply patch from Lisandro Damián Nicanor Pérez Meyer
      for detecting private cmake file.
      (Closes: #785329).
    + [BR] Detect package shipping apt_preferences(5) file.
      (Closes: #786533).
    + [BR] Detect package shipping oui or iab ieee database.
      (Closes: #785662).
    + [NT] Add a check for packages without intermediate
      directories.
    + [BR] Avoid a false positive in jsom for defaultpresets.xml
      from openmapstreet.
    + [NT] Tweak the "extra-license-file" check to avoid some
      common false-positives.
    + [BR] Raise severity of package-contains-timestamped-gzip.
      (Closes: #778328).
    + [BR] Detect package shipping apt_sources(5) file.
      (Closes: #646965).
    + [BR] Warn about files installed in /usr/share/mime/ other
      than in packages/. (Closes: #761649).
  * checks/java.pm:
    + [NT] Fix "of...

Read more...

Changed in lintian (Ubuntu):
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  Edit
Everyone can see this information.

Other bug subscribers