From 8a6a593eee41bc02c103e7f98047ea9b3c80c4a3 Mon Sep 17 00:00:00 2001 From: Aditya Ramani Date: Wed, 4 Jun 2025 11:28:37 -0700 Subject: [PATCH] Selectively uncompress kernel binary from archive (#7) --- Sources/APIServer/Kernel/KernelService.swift | 16 +++++++++++++--- Sources/CLI/System/SystemStart.swift | 4 ++-- Sources/ContainerClient/XPC+.swift | 1 - 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Sources/APIServer/Kernel/KernelService.swift b/Sources/APIServer/Kernel/KernelService.swift index c85929b1..70b968e5 100644 --- a/Sources/APIServer/Kernel/KernelService.swift +++ b/Sources/APIServer/Kernel/KernelService.swift @@ -77,9 +77,8 @@ actor KernelService { .setDescription("Unpacking kernel") ]) let archiveReader = try ArchiveReader(file: tarFile) - try archiveReader.extractContents(to: tempDir) - let kernelPath = tempDir.appendingPathComponent(kernelFilePath).resolvingSymlinksInPath() - try self.installKernel(kernelFile: kernelPath, platform: platform) + let kernelFile = try archiveReader.extractFile(from: kernelFilePath, to: tempDir) + try self.installKernel(kernelFile: kernelFile, platform: platform) if !FileManager.default.fileExists(atPath: tar.absoluteString) { try FileManager.default.removeItem(at: tarFile) @@ -108,3 +107,14 @@ actor KernelService { return Kernel(path: defaultKernelPath, platform: platform) } } + +extension ArchiveReader { + fileprivate func extractFile(from: String, to directory: URL) throws -> URL { + let (_, data) = try self.extractFile(path: from) + try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil) + let fileName = URL(filePath: from).lastPathComponent + let fileURL = directory.appendingPathComponent(fileName) + try data.write(to: fileURL, options: .atomic) + return fileURL + } +} diff --git a/Sources/CLI/System/SystemStart.swift b/Sources/CLI/System/SystemStart.swift index 757b81ca..f29cb951 100644 --- a/Sources/CLI/System/SystemStart.swift +++ b/Sources/CLI/System/SystemStart.swift @@ -85,13 +85,13 @@ extension Application { ) } - var kernelConfigured: Bool = false + var kernelConfigured: Bool = true var missingDependencies: [Dependencies] = [] if await !initImageExists() { missingDependencies.append(.initFs) } if await !kernelExists() { - kernelConfigured = true + kernelConfigured = false missingDependencies.append(.kernel) } guard missingDependencies.count > 0 else { diff --git a/Sources/ContainerClient/XPC+.swift b/Sources/ContainerClient/XPC+.swift index 80fb95fa..aa06e4a7 100644 --- a/Sources/ContainerClient/XPC+.swift +++ b/Sources/ContainerClient/XPC+.swift @@ -94,7 +94,6 @@ public enum XPCKeys: String { case kernelTarURL case kernelFilePath case setDefault - case installedKernels case systemPlatform case kernelName }