8000 kexec,linux,arm64: test empty memmap · u-root/u-root@c2024e8 · GitHub
[go: up one dir, main page]

Skip to content

Commit c2024e8

Browse files
committed
kexec,linux,arm64: test empty memmap
Signed-off-by: Chris Koch <chrisko@google.com>
1 parent 597d657 commit c2024e8

File tree

4 files changed

+36
-4
lines changed

4 files changed

+36
-4
lines changed

pkg/boot/linux/load_linux_image.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
< 8000 div class="diff-text-inner color-fg-muted">@@ -52,6 +52,8 @@ func sanitizeFDT(fdt *dt.FDT) (*dt.Node, error) {
5252
return chosen, nil
5353
}
5454

55+
var ErrMemmapEmpty = errors.New("memory map is empty or contains no information about system RAM")
56+
5557
func kexecLoadImage(kernel, ramfs *os.File, cmdline string, dtb io.ReaderAt) (*kimage, error) {
5658
fdt, err := dt.LoadFDT(dtb)
5759
if err != nil {
@@ -63,9 +65,12 @@ func kexecLoadImage(kernel, ramfs *os.File, cmdline string, dtb io.ReaderAt) (*k
6365
Debug("Try parsing memory map...")
6466
mm, err := kexec.MemoryMapFromFDT(fdt)
6567
if err != nil {
66-
return nil, fmt.Errorf("MemoryMapFromFDT(%v): %v", fdt, err)
68+
return nil, fmt.Errorf("MemoryMapFromFDT(%v): %w", fdt, err)
6769
}
6870
Debug("Mem map: \n%+v", mm)
71+
if len(mm.RAM()) == 0 {
72+
return nil, ErrMemmapEmpty
73+
}
6974
return kexecLoadImageMM(mm, kernel, ramfs, fdt, cmdline)
7075
}
7176

pkg/boot/linux/load_linux_image_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,33 @@ func TestKexecLoadImage(t *testing.T) {
314314
fdt: closedFile(t),
315315
errs: []error{dt.ErrNoValidReaders},
316316
},
317+
{
318+
name: "invalid-memmap",
319+
kernel: openFile(t, "../image/testdata/Image"),
320+
ramfs: createFile(t, []byte("ramfs")),
321+
fdt: fdtReader(t, &dt.FDT{RootNode: dt.NewNode("/", dt.WithChildren(
322+
dt.NewNode("chosen"),
323+
dt.NewNode("test memory", dt.WithProperty(
324+
dt.PropertyString("device_type", "memory"),
325+
// Too short.
326+
dt.Property{Name: "reg", Value: []byte{0x0}},
327+
)),
328+
))}),
329+
errs: []error{dt.ErrPropertyRegionInvalid},
330+
},
331+
{
332+
name: "no-memmap",
333+
kernel: openFile(t, "../image/testdata/Image"),
334+
fdt: fdtReader(t, &dt.FDT{RootNode: dt.NewNode("/",
335+
dt.WithChildren(
336+
dt.NewNode("chosen", dt.WithProperty(
337+
dt.PropertyU64("linux,initrd-start", 500),
338+
dt.PropertyU64("linux,initrd-end", 500),
339+
)),
340+
),
341+
)}),
342+
errs: []error{ErrMemmapEmpty},
343+
},
317344
} {
318345
t.Run(tt.name, func(t *testing.T) {
319346
got, err := kexecLoadImage(tt.kernel, tt.ramfs, tt.cmdline, tt.fdt)

pkg/dt/node.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ var StandardPropertyTypes = map[string]PropertyType{
5050

5151
var (
5252
errInvalidChildIndex = errors.New("invalid child index")
53-
errPropertyRegionInvalid = errors.New("property value is not <u64x2>")
53+
ErrPropertyRegionInvalid = errors.New("property value is not <u64x2>")
5454
)
5555

5656
// Node is one Node in the Device Tree.
@@ -357,7 +357,7 @@ type Region struct {
357357
// AsRegion converts the property to a Region.
358358
func (p *Property) AsRegion() (*Region, error) {
359359
if len(p.Value) != 16 {
360-
return nil, errPropertyRegionInvalid
360+
return nil, ErrPropertyRegionInvalid
361361
}
362362
var start, size uint64
363363
b := bytes.NewBuffer(p.Value)

pkg/dt/node_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ func TestAsRegion(t *testing.T) {
433433
Value: []byte{},
434434
},
435435
want: &Region{},
436-
wantErr: errPropertyRegionInvalid,
436+
wantErr: ErrPropertyRegionInvalid,
437437
},
438438
{
439439
name: "read start and size, success",

0 commit comments

Comments
 (0)
0