Subject: bug#731: needrestart -b on AMD processors complains of perl uninitialized variable

From: George Robbert <[email-masked]>
Date: Thu, 22 Dec 2022 14:26:34 -0700

Package: needrestart
Version: 3.5-4+deb11u2
Severity: normal

Dear Maintainer,

When running 'needrestart -b' on an AMD system, I get the following
uninitialized variable warning.  It also does not report the expected
microcode version (NEEDRESTART-UCEXP).  See output: section below for
example output of needrestart -b.

Use of uninitialized value $ucode_vars{"AVAIL"} in concatenation (.) or string at /usr/sbin/needrestart line 904.

This perl warning disappears when adding the -v option (needrestart -b -v),
and the correct value is reported for NEEDRESTART-UCEXP.

It looks to me like the problem is that line 182 of
/usr/share/perl5/NeedRestart/uCode/AMD.pm ends in a comma (,) instead
of a semicolon (;).  This means that assignment is subsumed into the
next line which is under if ($debug).

See the attached patch.  The debsum error reported below is due to my
applying this patch.

Thanks,
George Robbert

-- Package-specific info:
needrestart -b output:

NEEDRESTART-VER: 3.5
NEEDRESTART-KCUR: 5.10.0-20-amd64
NEEDRESTART-KEXP: 5.10.0-20-amd64
NEEDRESTART-KSTA: 1
NEEDRESTART-UCSTA: 1
NEEDRESTART-UCCUR: 0x03000027
Use of uninitialized value $ucode_vars{"AVAIL"} in concatenation (.) or string at /usr/sbin/needrestart line 904.
NEEDRESTART-UCEXP: 

-- System Information:
Distributor ID:	Devuan
Description:	Devuan GNU/Linux 4 (chimaera)
Release:	4
Codename:	chimaera
Architecture: x86_64

Kernel: Linux 5.10.0-20-amd64 (SMP w/2 CPU threads)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=ANSI_X3.4-1968) (ignored: LC_ALL set to C), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: sysvinit (via /sbin/init)

Versions of packages needrestart depends on:
ii  binutils                   2.35.2-2
ii  dpkg                       1.20.12
ii  gettext-base               0.21-4
ii  libintl-perl               1.26-3+deb11u1
ii  libmodule-find-perl        0.15-1
ii  libmodule-scandeps-perl    1.30-1
ii  libproc-processtable-perl  0.59-2+b1
ii  libsort-naturally-perl     1.03-2
ii  libterm-readkey-perl       2.38-1+b2
ii  perl                       5.32.1-4+deb11u2
ii  xz-utils                   5.2.5-2.1~deb11u1

Versions of packages needrestart recommends:
ii  libpam-elogind [libpam-systemd]  246.10-2
ii  sysvinit-core                    2.96-7+devuan2

Versions of packages needrestart suggests:
pn  iucode-tool                          <none>
pn  needrestart-session | libnotify-bin  <none>

-- Configuration Files:
/etc/apt/apt.conf.d/99needrestart changed:
DPkg::Post-Invoke {"test -x /usr/lib/needrestart/apt-pinvoke && /usr/lib/needrestart/apt-pinvoke -b || true"; };

/etc/needrestart/hook.d/20-rpm [Errno 2] No such file or directory: '/etc/needrestart/hook.d/20-rpm'

-- no debconf information

-- debsums errors found:
debsums: changed file /usr/share/perl5/NeedRestart/uCode/AMD.pm (from needrestart package)
--- /tmp/AMD.pm	2022-12-22 11:00:14.589106185 -0700
+++ /usr/share/perl5/NeedRestart/uCode/AMD.pm	2022-12-22 11:00:24.329046436 -0700
@@ -179,7 +179,7 @@
     if ( exists( $_ucodes->{cpuid}->{$cpuid} ) ) {
         my $prid = $_ucodes->{cpuid}->{$cpuid};
         if ( exists( $_ucodes->{prid}->{$prid} ) ) {
-            $vars{AVAIL} = sprintf( "0x%08x", $_ucodes->{prid}->{$prid} ),
+            $vars{AVAIL} = sprintf( "0x%08x", $_ucodes->{prid}->{$prid} );
 
               print STDERR "$LOGPREF #$info->{processor} found ucode $vars{AVAIL}\n" if ($debug);
             if ( $_ucodes->{prid}->{$prid} > $ucode ) {