Hey,

Just like with the previous bug (#1026927), it looks like there's more
to this one.  Trying the patch on several more systems I run into the
same symptoms on some.  Again, these have the same symptoms but
differing causes (full patch included).  What I found was:


On an intel system, where uCode/AMD.pm was run before uCode/Intel.pm

    intel_sys1# needrestart -b 
    NEEDRESTART-VER: 3.6
    NEEDRESTART-KCUR: 6.1.0-18-amd64
    NEEDRESTART-KEXP: 6.1.0-18-amd64
    NEEDRESTART-KSTA: 1
    NEEDRESTART-UCSTA: 1
    Use of uninitialized value $ucode_vars{"CURRENT"} in concatenation (.) or 
string at /usr/sbin/needrestart line 940.
    NEEDRESTART-UCCUR: 
    Use of uninitialized value $ucode_vars{"AVAIL"} in concatenation (.) or 
string at /usr/sbin/needrestart line 941.
    NEEDRESTART-UCEXP: 

But we don't get the 'Use of uninitialized value' when run as
`needrestart -b -v`.  The issue here is that nr_ucode_check keeps
going after the "eval ...  ${pkg}::nr_ucode_check_real..." fails
unless $debug is set.  Thus, without $debug, thi saves off the
unintialized values from AMD.pm as "the good ones", so we get the
error.

On a VM running with an AMD processor but without package
amd64-microcode, and also directly on an AMD system with a processor new enough
that it does not have a microcode version lin amd64-microcode, I get
the following identical results.

    amd_vm1# needrestart -b
    NEEDRESTART-VER: 3.6
    NEEDRESTART-KCUR: 6.1.0-18-amd64
    NEEDRESTART-KEXP: 6.1.0-18-amd64
    NEEDRESTART-KSTA: 1
    NEEDRESTART-UCSTA: 1
    NEEDRESTART-UCCUR: 0xa0011d1
    Use of uninitialized value $ucode_vars{"AVAIL"} in concatenation (.) or 
string at /usr/sbin/needrestart line 941.
    NEEDRESTART-UCEXP:


    amd_sys3# needrestart -b
    NEEDRESTART-VER: 3.6
    NEEDRESTART-KCUR: 6.1.0-18-amd64
    NEEDRESTART-KEXP: 6.1.0-18-amd64
    NEEDRESTART-KSTA: 1
    NEEDRESTART-UCSTA: 1
    NEEDRESTART-UCCUR: 0x6006705
    Use of uninitialized value $ucode_vars{"AVAIL"} in concatenation (.) or 
string at /usr/sbin/needrestart line 941.
    NEEDRESTART-UCEXP: 

This comes from AMD.pm not setting $ucode_vars{"AVAIL"} if it doesn't
find any matching available versions.  compare_ucode_versions()
handles, this as expected, but leaves $ucode_vars{"AVAIL"} unset to
cause problems later when run with -b.


The attached patch fixes includes the previous patch and also fixes
these 2 issues.

Hope this helps,
George

--- /tmp/uCode.pm.dist  2024-02-13 09:20:29.236867717 -0700
+++ /usr/share/perl5/NeedRestart/uCode.pm       2024-02-13 09:33:23.099742955 
-0700
@@ -152,10 +152,15 @@
 
         # call ucode modules
         foreach my $pkg (@PKGS) {
+           eval "${pkg}::nr_ucode_init();";
+           if ( $@ ) {
+               print STDERR $@ if ($debug);
+               next;
+           }
             my @nvars;
             eval "\@nvars = ${pkg}::nr_ucode_check_real(\$debug, \$ui, 
\$processors{\$pid});";
-            if ( $@ && $debug ) {
-                print STDERR $@;
+            if ( $@ ) {
+               print STDERR $@ if ($debug);
                 $ui->progress_step;
                 next;
             }
@@ -174,6 +179,10 @@
 
     $ui->progress_fin;
 
+    if ( $state == NRM_CURRENT && ! grep ( ( $_ eq "AVAIL"), @vars ) ) {
+       push(@vars, "AVAIL", "unavailable");
+    }
+
     return ( $state, @vars );
 }
 

Reply via email to