From 366235c1f6f4ff8e057995a423715fc738ec5d8c Mon Sep 17 00:00:00 2001 From: Lorenz Bauer Date: Tue, 9 Dec 2025 17:30:23 +0000 Subject: [PATCH] make missing -kernel error message less confusing Passing a non-existing local path to -kernel currently gives a confusing error message. For example `-kernel ./foo/bar` causes: Error: exec: retrieve kernel from OCI image: [...] fetch image: get from remote: Get "https://./v2/": dial tcp: lookup . on 127.0.0.53:53: no such host This is because we try to resolve the kernel as an OCI image if a local file doesn't exist. Make this a bit less confusing by returning a better error message in the common case where someone uses a "rooted" path like /foo, ./foo or ../foo. --- main.go | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/main.go b/main.go index 8aa0f45..b4e74ec 100644 --- a/main.go +++ b/main.go @@ -270,31 +270,35 @@ func findBootFiles(kernel string) (_ *bootFiles, err error) { } info, err := os.Stat(kernel) - if errors.Is(err, os.ErrNotExist) { - // Assume that kernel is a reference to an image. - cache, err := newImageCache() - if err != nil { - return nil, fmt.Errorf("image cache: %w", err) - } - - img, err := cache.Acquire(context.Background(), kernel, os.Stdout) - if err != nil { - return nil, fmt.Errorf("retrieve kernel from OCI image: %w", err) + if err == nil { + if info.IsDir() { + return newBootFiles(kernel) } - defer closeOnError(img) - return newBootFilesFromImage(img) - } else if err != nil { + // Kernel is a file on disk. + return &bootFiles{Kernel: kernel}, nil + } else if !errors.Is(err, os.ErrNotExist) { // Unexpected error from stat, maybe not allowed to access it? - return nil, err + return nil, fmt.Errorf("stat kernel: %w", err) + } else if first, _, ok := strings.Cut(kernel, "/"); ok && (first == "" || first == "." || first == "..") { + // This can't be a URL, so we don't fall through to treating it + // as an image. + return nil, fmt.Errorf("kernel %q: %w", kernel, os.ErrNotExist) } - if info.IsDir() { - return newBootFiles(kernel) + // Assume that kernel is a reference to an image. + cache, err := newImageCache() + if err != nil { + return nil, fmt.Errorf("image cache: %w", err) + } + + img, err := cache.Acquire(context.Background(), kernel, os.Stdout) + if err != nil { + return nil, fmt.Errorf("retrieve kernel from OCI image: %w", err) } + defer closeOnError(img) - // Kernel is a file on disk. - return &bootFiles{Kernel: kernel}, nil + return newBootFilesFromImage(img) } func findExecutable() (string, error) {