Nothing to see here, move along
1use crate::syscall::{MIN_USER_VADDR, USER_ADDR_LIMIT};
2
3crate::kernel_test!(
4 fn elf_segment_in_kernel_space_rejected() {
5 let segments = [lancer_core::elf::LoadSegment {
6 vaddr: 0xFFFF_8000_0000_0000,
7 memsz: 0x1000,
8 filesz: 0x1000,
9 file_offset: 0,
10 writable: false,
11 executable: true,
12 }];
13
14 let all_user_space = segments.iter().all(|seg| {
15 seg.vaddr >= MIN_USER_VADDR
16 && seg
17 .vaddr
18 .checked_add(seg.memsz)
19 .is_some_and(|end| end <= USER_ADDR_LIMIT)
20 });
21
22 assert!(!all_user_space, "segment in kernel-half should be rejected");
23 }
24);
25
26crate::kernel_test!(
27 fn elf_entry_not_in_executable_segment_rejected() {
28 let segments = [lancer_core::elf::LoadSegment {
29 vaddr: 0x40_0000,
30 memsz: 0x1000,
31 filesz: 0x1000,
32 file_offset: 0,
33 writable: true,
34 executable: false,
35 }];
36 let entry = 0x40_0000;
37
38 let entry_in_executable = segments
39 .iter()
40 .any(|seg| seg.executable && entry >= seg.vaddr && entry < seg.vaddr + seg.memsz);
41
42 assert!(
43 !entry_in_executable,
44 "entry in non-executable segment should be rejected"
45 );
46 }
47);
48
49crate::kernel_test!(
50 fn elf_overlapping_segments_rejected() {
51 let segments = [
52 lancer_core::elf::LoadSegment {
53 vaddr: 0x40_0000,
54 memsz: 0x2000,
55 filesz: 0x2000,
56 file_offset: 0,
57 writable: false,
58 executable: true,
59 },
60 lancer_core::elf::LoadSegment {
61 vaddr: 0x40_1000,
62 memsz: 0x1000,
63 filesz: 0x1000,
64 file_offset: 0x2000,
65 writable: true,
66 executable: false,
67 },
68 ];
69
70 let has_overlap = (0..segments.len()).any(|i| {
71 let a = segments[i];
72 let a_base = a.vaddr & !0xFFF;
73 let a_end = (a.vaddr + a.memsz + 0xFFF) & !0xFFF;
74 ((i + 1)..segments.len()).any(|j| {
75 let b = segments[j];
76 let b_base = b.vaddr & !0xFFF;
77 let b_end = (b.vaddr + b.memsz + 0xFFF) & !0xFFF;
78 a_base < b_end && b_base < a_end
79 })
80 });
81
82 assert!(
83 has_overlap,
84 "overlapping page-level segments should be detected"
85 );
86 }
87);