From e8c1ff9ef8a18ec0bd59aab7b02b2be7019b8235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20Hamb=C3=BCchen?= Date: Tue, 7 Jul 2020 00:53:55 +0200 Subject: [PATCH] grub: Fix incorrect upgrade to new `jsonStateLine`. See #85895. (#92520) Fixes error Can't use an undefined value as an ARRAY reference at /nix/store/...-install-grub.pl line 642, line 5. with `/boot/grub/state` being: ``` grub 2.04 no /dev/sda /boot ``` I am not sure where the trailing empty line can come from; the script does not seem to write it. In any case, now we handle that situation as well. Further, ensure that `extraGrubInstallArgs` defaults to the empty array if its key is not present in the `jsonState`. --- nixos/modules/system/boot/loader/grub/install-grub.pl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nixos/modules/system/boot/loader/grub/install-grub.pl b/nixos/modules/system/boot/loader/grub/install-grub.pl index b788e427dff..9af799184b6 100644 --- a/nixos/modules/system/boot/loader/grub/install-grub.pl +++ b/nixos/modules/system/boot/loader/grub/install-grub.pl @@ -638,8 +638,11 @@ sub readGrubState { # guaranteed to be present. $jsonStateLine = defined $jsonStateLine ? $jsonStateLine : '{}'; # empty JSON object chomp($jsonStateLine); + if ($jsonStateLine eq "") { + $jsonStateLine = '{}'; # empty JSON object + } my %jsonState = %{decode_json($jsonStateLine)}; - my @extraGrubInstallArgs = @{$jsonState{'extraGrubInstallArgs'}}; + my @extraGrubInstallArgs = exists($jsonState{'extraGrubInstallArgs'}) ? @{$jsonState{'extraGrubInstallArgs'}} : (); close FILE; my $grubState = GrubState->new(name => $name, version => $version, efi => $efi, devices => $devices, efiMountPoint => $efiMountPoint, extraGrubInstallArgs => \@extraGrubInstallArgs ); return $grubState