mirror of
https://github.com/siderolabs/talos.git
synced 2026-05-05 20:36:18 +02:00
fix: pe uki extract
The PE UKI extract was returning a reader that reads upto the section `Size` which is the size on disk which could be padded, we need a limit reader reading upto `VirtualSize`. Signed-off-by: Noel Georgi <git@frezbo.dev>
This commit is contained in:
parent
70f72c5b00
commit
edf7c32883
@ -33,13 +33,16 @@ func Extract(ukiPath string) (assetInfo AssetInfo, err error) {
|
||||
assetInfo.fileCloser = peFile
|
||||
|
||||
for _, section := range peFile.Sections {
|
||||
// read upto section.VirtualSize bytes
|
||||
sectionReader := io.NewSectionReader(section, 0, int64(section.VirtualSize))
|
||||
|
||||
switch section.Name {
|
||||
case ".initrd":
|
||||
assetInfo.Initrd = section.Open()
|
||||
assetInfo.Initrd = sectionReader
|
||||
case ".cmdline":
|
||||
assetInfo.Cmdline = section.Open()
|
||||
assetInfo.Cmdline = sectionReader
|
||||
case ".linux":
|
||||
assetInfo.Kernel = section.Open()
|
||||
assetInfo.Kernel = sectionReader
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
74
internal/pkg/uki/internal/pe/extract_test.go
Normal file
74
internal/pkg/uki/internal/pe/extract_test.go
Normal file
@ -0,0 +1,74 @@
|
||||
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
package pe_test
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/siderolabs/talos/internal/pkg/uki/internal/pe"
|
||||
)
|
||||
|
||||
func TestUKIExtract(t *testing.T) {
|
||||
srcFile := "testdata/sd-stub-amd64.efi"
|
||||
|
||||
destDir := t.TempDir()
|
||||
|
||||
destFile := filepath.Join(destDir, "vmlinuz.efi")
|
||||
|
||||
for _, section := range []string{"linux", "initrd", "cmdline"} {
|
||||
assert.NoError(t, os.WriteFile(filepath.Join(destDir, section), []byte(section), 0o644))
|
||||
}
|
||||
|
||||
assert.NoError(t, pe.AssembleNative(srcFile, destFile, []pe.Section{
|
||||
{
|
||||
Name: ".linux",
|
||||
Path: filepath.Join(destDir, "linux"),
|
||||
Measure: false,
|
||||
Append: true,
|
||||
},
|
||||
{
|
||||
Name: ".initrd",
|
||||
Path: filepath.Join(destDir, "initrd"),
|
||||
Measure: false,
|
||||
Append: true,
|
||||
},
|
||||
{
|
||||
Name: ".cmdline",
|
||||
Path: filepath.Join(destDir, "cmdline"),
|
||||
Measure: false,
|
||||
Append: true,
|
||||
},
|
||||
}))
|
||||
|
||||
ukiData, err := pe.Extract(destFile)
|
||||
assert.NoError(t, err)
|
||||
|
||||
t.Cleanup(func() {
|
||||
assert.NoError(t, ukiData.Close())
|
||||
})
|
||||
|
||||
var kernel, initrd, cmdline strings.Builder
|
||||
|
||||
_, err = io.Copy(&kernel, ukiData.Kernel)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, "linux", kernel.String())
|
||||
|
||||
_, err = io.Copy(&initrd, ukiData.Initrd)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, "initrd", initrd.String())
|
||||
|
||||
_, err = io.Copy(&cmdline, ukiData.Cmdline)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, "cmdline", cmdline.String())
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user