On Sun, 4 Oct 2026, 18:51 Andrei Trimbitas, <[email protected]> wrote:
> Control: tags -1 patch > > The attached patch, against 1:3.2.4~rc1-3.5, fixes the check itself rather > than turning Tiger_DPKG_Optimize off. > > Two things went wrong on a merged-/usr system: > > 1. deb_nopackfiles tests "[ ! -L $dir ]" with dirlist entries like > "/bin/". With the trailing slash the test follows the symlink, so /bin, > /sbin and /lib were scanned as well, and /lib brought in all of /usr/lib, > which the check deliberately leaves out. On a Linux Mint 22.3 desktop that > was 33,230 lin001w warnings. > > 2. dpkg records some files under /bin and others under /usr/bin, so a path > found under /usr/bin can be listed under /bin in the .list file. The > optimised lookup now rewrites both the package lists and the diversions to > the /usr form (only when /bin, /sbin, /lib are symlinks), and the dpkg -S > path retries without /usr. > > Tested in fresh debian:sid, debian:stable and ubuntu:24.04 containers with > one binary modified, one deleted and one stray file added to /usr/sbin: > before, 3,210 lin001w warnings; after, two (the stray file and Docker's own > /usr/sbin/policy-rc.d). The patch is for systems/Linux/2; Linux/3 and > Linux/4 are copies of it in the Debian source. > > Andrei Trimbitas > > --- a/systems/Linux/2/deb_nopackfiles > +++ b/systems/Linux/2/deb_nopackfiles > im.not sure if anyone is looking, and upstream looks a bit dead to me. but you would need to submit a patch in a different way for debian to be able to include it. look up dep3, gbp pq or see if this page helps https://optimizedbyotto.com/post/debian-source-package-git/ @@ -17,6 +17,11 @@ > # > # Linux/deb_nopackfiles - 23/08/2001 > # > +# 10/04/2026 - atrimbitas - Support merged-/usr systems (Debian bug > #1111306). > not sure we need to have this kind of comment added really +# Test the directory itself for a symlink, since '/bin/' with > +# a trailing slash resolves the link and /lib then pulled in > +# all of /usr/lib. dpkg may record a file under /bin, /sbin or > +# /lib or under /usr, so both forms count as owned. > # 05/07/2006 - jfs - Skip directories that are symbolic links, this happens > # with /usr/X11R6/bin as the latest Xorg package > # versions just symlink this to /usr/bin/ (Debian bug #367931) > @@ -45,7 +50,7 @@ > # - Consider the use of 'dlocate' which will be faster than DPKG. Notice > # however that it's priority "optional" > # dlocate could be faster > -# DLOCATE=`which dlocate` > +# DLOCATE=`command -v dlocate` > may as well use $(command -v dlocate) if we are changing this (why does it need changing?) # DLOCATE=${DLOCATE:-$DPKG} > # > > #----------------------------------------------------------------------------- > @@ -108,8 +113,8 @@ > haveallcmds DPKG || exit 1 > fi > > -safe_temp $WORKDIR/dpkg-packages.list > -trap 'delete $WORKDIR/dpkg-packages.list ; exit 1' 1 2 3 15 > +safe_temp $WORKDIR/dpkg-packages.list $WORKDIR/dpkg-diversions.list > +trap 'delete $WORKDIR/dpkg-packages.list $WORKDIR/dpkg-diversions.list ; > exit 1' 1 2 3 15 > > # NOTE: /usr/lib cannot be added here since quite a lot of packages > # will compile stuff there on installation which will result in a > @@ -118,7 +123,7 @@ > okdirs="" > # Before using dirlist we are going to determine which values are ok > for dir in $dirlist ; do > - if [ -d $dir ] && [ ! -L $dir ] ; then > + if [ -d $dir ] && [ ! -L "${dir%/}" ] ; then > why is only one use of $dir quoted? if [ -n "$okdirs" ] ; then > okdirs="$dir $okdirs" > else > @@ -141,6 +146,9 @@ > while read file > do > pack=`$DPKG -S $file 2>/dev/null` > + # On merged-/usr systems dpkg may record the file under /bin, /sbin or > /lib > + [ "$pack" = "" ] && [ "${file#/usr/}" != "$file" ] && > + pack=`$DPKG -S ${file#/usr} 2>/dev/null` > this only handles /bin vs /usr/bin ? what about /lib, and other usrmerge paths? [ "$pack" = "" ] && { > message WARN lin001w "" "File \`$file' does not belong to any package." > } > @@ -148,18 +156,25 @@ > else > # Alternative (optimal but not following standard way) > seddirlist=`echo $dirlist | $SED -e 's/ /\\\\\|/g; s/\//\\\\\//g'` > + # On merged-/usr systems /bin, /sbin and /lib link into /usr and dpkg > + # may record a file under either path, so rewrite them to /usr > + usrmerge= > + for dir in bin sbin lib ; do > + [ -L /$dir ] && usrmerge="$usrmerge -e s,^/$dir/,/usr/$dir/," > similarly + done > $FIND /var/lib/dpkg/info -name "*.list" -exec cat {} \; | > - $SED -ne "/^\($seddirlist\)/p" > $WORKDIR/dpkg-packages.list > + $SED -n $usrmerge -e "/^\($seddirlist\)/p" > $WORKDIR/dpkg-packages.list > + $SED -e '' $usrmerge /var/lib/dpkg/diversions > > $WORKDIR/dpkg-diversions.list > $FIND $dirlist -type f 2>/dev/null | > # We are not using -maxdepth here, but we could... > $GREP -x -F -v -f $WORKDIR/dpkg-packages.list | > # To search for diversions > - $GREP -x -F -v -f /var/lib/dpkg/diversions | > + $GREP -x -F -v -f $WORKDIR/dpkg-diversions.list | > while read file > do > message WARN lin001w "" "File \`$file' does not belong to any package." > done > - delete $WORKDIR/dpkg-packages.list > + delete $WORKDIR/dpkg-packages.list $WORKDIR/dpkg-diversions.list > fi > > exit 0 >

