#601763 debconf: Debconf::ConfModule::communicate hangs on $_=<$r> || return $this->finish

#601763#5
Date:
2010-10-29 11:18:23 UTC
From:
To:
Note: The bug isn't being filed on the machine that has this issue,
but they have the same debconf version.

A dpkg --configure -a invocation of mine hung after I had a rude
shutdown of a system. When I traced it it turned out that debconf was
hanging.

Specifically dpkg would call:

    /bin/sh -x -e /var/lib/dpkg/info/man-db.postinst triggered /usr/share/man

Which would call:

    PERL_DL_NONLAZY=1 && export PERL_DL_NONLAZY
    /usr/share/debconf/frontend /var/lib/dpkg/info/man-db.postinst triggered /usr/share/man

Which when I ran it under the perl debugger hung on:

    Debconf::Log::debug(/usr/share/perl5/Debconf/Log.pm:23):
    23:             if ($log && $type =~ /$log/) {
    Debconf::ConfModule::process_command(/usr/share/perl5/Debconf/ConfModule.pm:134):
    134:            if ($ret=~/\n/) {
    Debconf::ConfModule::process_command(/usr/share/perl5/Debconf/ConfModule.pm:139):
    139:            return $ret;
    Debconf::ConfModule::communicate(/usr/share/perl5/Debconf/ConfModule.pm:75):
    75:             my $w=$this->write_handle;
    Debconf::ConfModule::CODE(0xa0fb678)(/usr/share/perl5/Debconf/ConfModule.pm:648):
    648:                    my $this=shift;
    Debconf::ConfModule::CODE(0xa0fb678)(/usr/share/perl5/Debconf/ConfModule.pm:650):
    650:                    return $this->{$field} unless @_;
    Debconf::ConfModule::communicate(/usr/share/perl5/Debconf/ConfModule.pm:76):
    76:             print $w $ret."\n";
    Debconf::ConfModule::communicate(/usr/share/perl5/Debconf/ConfModule.pm:77):
    77:             return '' unless length $ret;
    Debconf::ConfModule::communicate(/usr/share/perl5/Debconf/ConfModule.pm:78):
    78:             return 1;
    Debconf::ConfModule::communicate(/usr/share/perl5/Debconf/ConfModule.pm:69):
    69:             my $this=shift;
    Debconf::ConfModule::communicate(/usr/share/perl5/Debconf/ConfModule.pm:71):
    71:             my $r=$this->read_handle;
    Debconf::ConfModule::CODE(0xa0fb598)(/usr/share/perl5/Debconf/ConfModule.pm:648):
    648:                    my $this=shift;
    Debconf::ConfModule::CODE(0xa0fb598)(/usr/share/perl5/Debconf/ConfModule.pm:650):
    650:                    return $this->{$field} unless @_;
    Debconf::ConfModule::communicate(/usr/share/perl5/Debconf/ConfModule.pm:72):
    72:             $_=<$r> || return $this->finish;

Looks like something that could be solved by having ->read_handle
return a non-blocking handle, but I haven't looked.