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

Bug#233645: libxpm4: remove/purge hangs postrm



reassign 233645 xfree86
retitle 233645 xfree86: [shell-lib.sh] deregister_x_lib_dir_with_ld_so() calls fgrep with no second arg, causing maintainer scripts to hang forever trying to read from STDIN
thanks

On Thu, Feb 19, 2004 at 09:24:59AM +0100, Filip Van Raemdonck wrote:
> When removing libxpm4 (but I guess that depending on the order in which
> apt removes them, any library from xfree86 could do this) the postrm
> script hangs, waiting on input (observed from the fact that when it is
> backgrounded it immediately goes to STOPPED state).
> 
> A quick look at the postrm script shows a few suspicious *greps, which
> might get called with no file arguments and hence cause the hang.
> Adding a set -x confirms this:
> 
> Removing libxpm4 ...
> + '[' remove = remove ']'
> + deregister_x_lib_dir_with_ld_so
> + local dir ldsoconf
> + dir=/usr/X11R6/lib
> + ldsoconf=/etc/ld.so.conf
> + fgrep -qsx /usr/X11R6/lib /etc/ld.so.conf
> ++ echo '/usr/X11R6/lib/lib*.so.*.*'
> + '[' '/usr/X11R6/lib/lib*.so.*.*' = '/usr/X11R6/lib/lib*.so.*.*' ']'
> + observe 'removing /usr/X11R6/lib directory from /etc/ld.so.conf'
> + '[' -n '' ']'
> + fgrep -qsvx /usr/X11R6/lib
> dpkg: error processing libxpm4 (--purge):
> 
> So, in this case it's the second fgrep in deregister_x_lib_dir_with_ld_so.
> 
> Small note: I have only superficially looked at the postrm, but the
> smoking_guns=$(grep ...) in find_culprits also looks suspicuous; I've
> tried and if any of xbase-clients|xfree86-common|xfs|xlibs is installed
> the possible_culprits variable is empty and so would cause the grep above
> to hang, too, I believe. You may want to check that.

Well, let's tackle deregister_x_lib_dir_with_ld_so() first, since it's
the problem you're having.

Here's the source of the shell function in question:

deregister_x_lib_dir_with_ld_so () {
  # syntax: deregister_x_lib_dir_with_ld_so
  #
  # Configure dynamic loader ld.so to not search /usr/X11R6/lib for shared
  # libraries, if and only if no shared libaries remain there.
  #
  # Call this function from the postrm script of a package that places a shared
  # library in /usr/X11R6/lib, in the event "$1" is "remove", and before
  # invoking ldconfig.

  local dir ldsoconf

  dir="/usr/X11R6/lib"
  ldsoconf="/etc/ld.so.conf"

  # is the line present?
  if fgrep -qsx "$dir" "$ldsoconf"; then
    # are there any shared objects in the directory?
    if [ "$(echo "$dir"/lib*.so.*.*)" = "$dir/lib*.so.*.*" ]; then
      # glob expansion produced nothing, so no shared libraries are present
      observe "removing $dir directory from $ldsoconf"
      fgrep -qsvx "$dir" > "$ldsoconf.dpkg-tmp"
      mv "$ldsoconf.dpkg-tmp" "$ldsoconf"
    fi
  fi
}

Hmm, yup.  I didn't give the second fgrep a second argument.  The first
fgrep will never block waiting on STDIN.

Thanks for catching this.  I'll fix it right away.

-- 
G. Branden Robinson                |     The more ridiculous a belief
Debian GNU/Linux                   |     system, the higher the probability
branden@debian.org                 |     of its success.
http://people.debian.org/~branden/ |     -- Wayne R. Bartz

Attachment: signature.asc
Description: Digital signature


Reply to: