test/integration: Add tests for patching a syscall

Add ".kpatch" to the end of "uname -s".

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
This commit is contained in:
Josh Poimboeuf 2021-04-16 17:23:19 -05:00
parent e9c0b67862
commit 373993ec1c
6 changed files with 82 additions and 0 deletions

View File

@ -0,0 +1,3 @@
#!/bin/bash
uname -s | grep -q kpatch

View File

@ -0,0 +1,21 @@
diff --git a/kernel/sys.c b/kernel/sys.c
index 2e2e3f378d97..05271fe26c89 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -1250,13 +1250,15 @@ static int override_release(char __user *release, size_t len)
return ret;
}
-SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
+#include "kpatch-syscall.h"
+KPATCH_SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
{
struct new_utsname tmp;
down_read(&uts_sem);
memcpy(&tmp, utsname(), sizeof(tmp));
up_read(&uts_sem);
+ strcat(tmp.sysname, ".kpatch");
if (copy_to_user(name, &tmp, sizeof(tmp)))
return -EFAULT;

View File

@ -0,0 +1,3 @@
#!/bin/bash
uname -s | grep -q kpatch

View File

@ -0,0 +1,26 @@
diff --git a/kernel/sys.c b/kernel/sys.c
index 1fbf388279832..b5186aa83adfa 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -1392,14 +1392,18 @@ static int override_release(char __user *release, size_t len)
return ret;
}
-SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
+#include "kpatch-syscall.h"
+KPATCH_SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
{
+ struct new_utsname tmp;
int errno = 0;
down_read(&uts_sem);
- if (copy_to_user(name, utsname(), sizeof *name))
- errno = -EFAULT;
+ memcpy(&tmp, utsname(), sizeof(tmp));
up_read(&uts_sem);
+ strcat(tmp.sysname, ".kpatch");
+ if (copy_to_user(name, &tmp, sizeof(tmp)))
+ errno = -EFAULT;
if (!errno && override_release(name->release, sizeof(name->release)))
errno = -EFAULT;

View File

@ -0,0 +1,3 @@
#!/bin/bash
uname -s | grep -q kpatch

View File

@ -0,0 +1,26 @@
diff --git a/kernel/sys.c b/kernel/sys.c
index 871c0848f05c8..479bf8725d2e6 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -1241,14 +1241,18 @@ static int override_release(char __user *release, size_t len)
return ret;
}
-SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
+#include "kpatch-syscall.h"
+KPATCH_SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
{
+ struct new_utsname tmp;
int errno = 0;
down_read(&uts_sem);
- if (copy_to_user(name, utsname(), sizeof *name))
- errno = -EFAULT;
+ memcpy(&tmp, utsname(), sizeof(tmp));
up_read(&uts_sem);
+ strcat(tmp.sysname, ".kpatch");
+ if (copy_to_user(name, &tmp, sizeof(tmp)))
+ errno = -EFAULT;
if (!errno && override_release(name->release, sizeof(name->release)))
errno = -EFAULT;