Skip to content

Commit e48c770

Browse files
committed
integration: add a function pointer / klp-relocation test
Add an integration test to verify klp-relocation replacement of certain function pointers. In this test, the livepatch's function pointer to uptime_proc_show should resolve to the original found in the kernel and not the instance from the livepatch itself. Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
1 parent 69828ad commit e48c770

6 files changed

Lines changed: 78 additions & 0 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--- src.old/fs/proc/uptime.c 2024-06-13 03:19:08.000000000 -0400
2+
+++ src/fs/proc/uptime.c 2025-03-25 09:08:38.206910364 -0400
3+
@@ -24,11 +24,12 @@ static int uptime_proc_show(struct seq_f
4+
nsec = cputime64_to_jiffies64(idletime) * TICK_NSEC;
5+
idle.tv_sec = div_u64_rem(nsec, NSEC_PER_SEC, &rem);
6+
idle.tv_nsec = rem;
7+
- seq_printf(m, "%lu.%02lu %lu.%02lu\n",
8+
+ seq_printf(m, "%lu.%02lu %lu.%02lu uptime_proc_show=%p\n",
9+
(unsigned long) uptime.tv_sec,
10+
(uptime.tv_nsec / (NSEC_PER_SEC / 100)),
11+
(unsigned long) idle.tv_sec,
12+
- (idle.tv_nsec / (NSEC_PER_SEC / 100)));
13+
+ (idle.tv_nsec / (NSEC_PER_SEC / 100)),
14+
+ uptime_proc_show);
15+
return 0;
16+
}
17+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/bin/bash
2+
3+
kpatch_value=$(cat /proc/uptime | grep -o 'uptime_proc_show=.*' | awk -F= '{print $2}')
4+
kernel_value=$(awk '$NF=="uptime_proc_show" { print $1 }' /proc/kallsyms)
5+
6+
if [[ "$kpatch_value" != "$kernel_value" ]]; then
7+
echo "kpatch_value($kpatch_value) != kernel_value($kernel_value)"
8+
exit 1
9+
fi
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--- src.old/fs/proc/uptime.c 2025-03-20 06:57:19.000000000 -0400
2+
+++ src/fs/proc/uptime.c 2025-03-25 09:35:50.847697946 -0400
3+
@@ -25,11 +25,12 @@ static int uptime_proc_show(struct seq_f
4+
5+
idle.tv_sec = div_u64_rem(nsec, NSEC_PER_SEC, &rem);
6+
idle.tv_nsec = rem;
7+
- seq_printf(m, "%lu.%02lu %lu.%02lu\n",
8+
+ seq_printf(m, "%lu.%02lu %lu.%02lu uptime_proc_show=%pK\n",
9+
(unsigned long) uptime.tv_sec,
10+
(uptime.tv_nsec / (NSEC_PER_SEC / 100)),
11+
(unsigned long) idle.tv_sec,
12+
- (idle.tv_nsec / (NSEC_PER_SEC / 100)));
13+
+ (idle.tv_nsec / (NSEC_PER_SEC / 100)),
14+
+ uptime_proc_show);
15+
return 0;
16+
}
17+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/bin/bash
2+
3+
kpatch_value=$(cat /proc/uptime | grep -o 'uptime_proc_show=.*' | awk -F= '{print $2}')
4+
kernel_value=$(awk '$NF=="uptime_proc_show" { print $1 }' /proc/kallsyms)
5+
6+
if [[ "$kpatch_value" != "$kernel_value" ]]; then
7+
echo "kpatch_value($kpatch_value) != kernel_value($kernel_value)"
8+
exit 1
9+
fi
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--- src.old/fs/proc/uptime.c 2025-03-25 09:35:31.468574086 -0400
2+
+++ src/fs/proc/uptime.c 2025-03-25 09:35:46.848570153 -0400
3+
@@ -29,11 +29,12 @@ static int uptime_proc_show(struct seq_f
4+
5+
idle.tv_sec = div_u64_rem(idle_nsec, NSEC_PER_SEC, &rem);
6+
idle.tv_nsec = rem;
7+
- seq_printf(m, "%lu.%02lu %lu.%02lu\n",
8+
+ seq_printf(m, "%lu.%02lu %lu.%02lu uptime_proc_show=%pK\n",
9+
(unsigned long) uptime.tv_sec,
10+
(uptime.tv_nsec / (NSEC_PER_SEC / 100)),
11+
(unsigned long) idle.tv_sec,
12+
- (idle.tv_nsec / (NSEC_PER_SEC / 100)));
13+
+ (idle.tv_nsec / (NSEC_PER_SEC / 100)),
14+
+ uptime_proc_show);
15+
return 0;
16+
}
17+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/bin/bash
2+
3+
kpatch_value=$(cat /proc/uptime | grep -o 'uptime_proc_show=.*' | awk -F= '{print $2}')
4+
kernel_value=$(awk '$NF=="uptime_proc_show" { print $1 }' /proc/kallsyms)
5+
6+
if [[ "$kpatch_value" != "$kernel_value" ]]; then
7+
echo "kpatch_value($kpatch_value) != kernel_value($kernel_value)"
8+
exit 1
9+
fi

0 commit comments

Comments
 (0)