Package: getty-run
Version: 2.2.0-2
Severity: critical
Justification: makes console logins all but impossible, thus arguably breaking 
the entire system

Hi,

I have a VPS that's a domU guest, so its console is /dev/hvc0.

I had my own getty service on it, called getty-hvc0.

During a dist-upgrade, the getty-run package was pulled in, and a(n IMO 
misleadingly named) getty-ttyS0 service enabled by default.

This system doesn't have a /dev/ttyS0, but that doesn't stop the getty-ttyS0 
service from doing this:

--- 8< ---

root /etc/sv/getty-ttyS0 # sh -xveu ./run
#!/usr/bin/env /lib/runit/invoke-run

# get device from kernel command line, override ./env/SGETTY
if grep  'console=' /proc/cmdline ; then
        kconsole=$(grep -o  '\bconsole=[^ ]*' /proc/cmdline)
        #TODO: only a subset of this parameter is supported: no uart[8250]/brl, 
no options
        #full format: see 
https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html
        kconsole=${kconsole##*=}  #only the last one matches, the kernel writes 
there
        SGETTY=${kconsole%,*}  #discard options if any
        [ "$SGETTY" = 'null' ] && SGETTY=""    #discard null
fi
+ grep console= /proc/cmdline
root=[...] root=/dev/xvda1 console=hvc0 [...]
+ grep -o \bconsole=[^ ]* /proc/cmdline
+ kconsole=console=hvc0
console=hvc0
+ kconsole=hvc0
+ SGETTY=hvc0
+ [ hvc0 = null ]

#don't change here, edit ./env/SGETTY instead
#example: echo ttyS1 > /etc/sv/getty-ttyS0/env/SGETTY
[ -z "$SGETTY" ] && SGETTY=ttyS0
+ [ -z hvc0 ]

if ! test -c /dev/"$SGETTY" ; then
        sv d getty-ttyS0
        echo "/dev/$SGETTY not found: stopping getty-ttyS0"
fi
+ test -c /dev/hvc0
if pgrep -x agetty -t "$SGETTY" || pgrep -x fgetty -t "$SGETTY"; then
    sv d getty-ttyS0
    echo "already another getty on $SGETTY: stopping getty-ttyS0"
fi
+ pgrep -x agetty -t hvc0
+ pgrep -x fgetty -t hvc0

exec 1>&2
+ exec

if [ -e /sbin/fgetty ]; then
    exec chpst -P fgetty /dev/"$SGETTY"
else
    exec /sbin/getty -L "$SGETTY" 9600 vt100
fi
+ [ -e /sbin/fgetty ]
+ exec /sbin/getty -L hvc0 9600 vt100

--- >8 ---

Since I already had a getty on hvc0, the two gettys ended up fighting over the 
console input, making it *very tricky* to log in successfully.

If you think you must go and enable services unconditionally by default, please 
somehow make sure this doesn't happen; for example, add something like this:

if fuser -v "$SGETTY" 2>&1 | grep -q getty; then exec sleep 3600; fi

(Not perfect, but it would have helped me at least.)

(Also, unrelated, but not worth its own bugreport:

1. if /dev/$SGETTY is not found, you stop the service; but maybe the getty will 
appear later, for example when a module is loaded, or a device is (re)connected 
to the system.

2. you hardwired the name of the service into the script. I think it would be 
better to do "exec sv d ." to stop the service, whatever it may be called, as 
the last action, similar how you'd use "exit" in a plain shell script.)

AndrĂ¡s

-- System Information:
Debian Release: trixie/sid
  APT prefers stable-security
  APT policy: (500, 'stable-security'), (350, 'unstable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 6.12.20-amd64 (SMP w/8 CPU threads; PREEMPT)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_OOT_MODULE, 
TAINT_UNSIGNED_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=hu_HU.UTF-8 (charmap=UTF-8), 
LANGUAGE=en_US.UTF-8
Shell: /bin/sh linked to /usr/bin/dash
Init: runit (via /run/runit.stopit)
LSM: AppArmor: enabled

Versions of packages getty-run depends on:
ii  runit-helper  2.16.4

getty-run recommends no packages.

Versions of packages getty-run suggests:
ii  fgetty  0.7-11

-- no debconf information

-- 
            I'd like to live like a poor person with lots of money.

Reply via email to