Skip to content

Commit

Permalink
loader: lua: remove the default kernel if it doesn't exist
Browse files Browse the repository at this point in the history
The `kernel` env var provides the default kernel, usually "kernel".  It
may be the case that the user doesn't have a "kernel" kernel, just
"kernel.*" kernels, but have left `kernel` to the default because we
autodetect entries by default anyways.

If we're doing autodetection, take note of whether the default kernel
exists or not and remove it from the list if it doesn't and we had found
any other kernels.  We avoid it in the #kernels == 1 case because
something fishy has likely happened and we should just trust the
configuration.

Reviewed by:	imp, manu
Differential Revision:	https://reviews.freebsd.org/D42967
  • Loading branch information
kevans91 committed Dec 13, 2023
1 parent a206524 commit d04415c
Showing 1 changed file with 24 additions and 4 deletions.
28 changes: 24 additions & 4 deletions stand/lua/core.lua
Original file line number Diff line number Diff line change
Expand Up @@ -201,17 +201,18 @@ function core.kernelList()
return core.cached_kernels
end

local k = loader.getenv("kernel")
local default_kernel = loader.getenv("kernel")
local v = loader.getenv("kernels")
local autodetect = loader.getenv("kernels_autodetect") or ""

local kernels = {}
local unique = {}
local i = 0
if k ~= nil then

if default_kernel then
i = i + 1
kernels[i] = k
unique[k] = true
kernels[i] = default_kernel
unique[default_kernel] = true
end

if v ~= nil then
Expand Down Expand Up @@ -239,6 +240,8 @@ function core.kernelList()
return core.cached_kernels
end

local present = {}

-- Automatically detect other bootable kernel directories using a
-- heuristic. Any directory in /boot that contains an ordinary file
-- named "kernel" is considered eligible.
Expand Down Expand Up @@ -267,8 +270,25 @@ function core.kernelList()
unique[file] = true
end

present[file] = true

::continue::
end

-- If we found more than one kernel, prune the "kernel" specified kernel
-- off of the list if it wasn't found during traversal. If we didn't
-- actually find any kernels, we just assume that they know what they're
-- doing and leave it alone.
if default_kernel and not present[default_kernel] and #kernels > 1 then
for i = 1, #kernels do
if i == #kernels then
kernels[i] = nil
else
kernels[i] = kernels[i + 1]
end
end
end

core.cached_kernels = kernels
return core.cached_kernels
end
Expand Down

0 comments on commit d04415c

Please sign in to comment.