Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(609)

Unified Diff: tests/test_patching.cc

Issue 8596009: Add test for patching a system call instruction (Closed) Base URL: https://seccompsandbox.googlecode.com/svn/trunk
Patch Set: Add comment Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « seccomp.gyp ('k') | tests/test_patching_input.S » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/test_patching.cc
diff --git a/tests/test_patching.cc b/tests/test_patching.cc
new file mode 100644
index 0000000000000000000000000000000000000000..bb1babbc65a2a22856953edee5ef307066853dbf
--- /dev/null
+++ b/tests/test_patching.cc
@@ -0,0 +1,51 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <fcntl.h>
+
+#include "library.h"
+#include "sandbox.h"
+#include "test_runner.h"
+
+
+extern "C" int my_getpid(void);
+extern char my_getpid_end[];
+
+void patch_range(char *start, char *end) {
+ int maps_fd;
+ CHECK_SUCCEEDS((maps_fd = open("/proc/self/maps", O_RDONLY, 0)) >= 0);
+ playground::Maps maps(maps_fd);
+ playground::Library library;
+ library.setLibraryInfo(&maps);
+ char *extra_space = NULL;
+ int extra_size = 0;
+ char *page_start = (char *) ((uintptr_t) start & ~(getpagesize() - 1));
Markus (顧孟勤) 2011/11/18 18:16:46 You should probably round "end" up to the next pag
+ CHECK_SUCCEEDS(mprotect(page_start, end - page_start,
+ PROT_READ | PROT_WRITE | PROT_EXEC) == 0);
+ library.patchSystemCallsInRange(start, end, &extra_space, &extra_size);
+ CHECK_SUCCEEDS(close(maps_fd) == 0);
+}
+
+TEST(test_patching_syscall) {
+ int pid = getpid();
+ CHECK(my_getpid() == pid);
+ char *func = (char *) my_getpid;
+ char *func_end = my_getpid_end;
+ patch_range(func, func_end);
+#if defined(__x86_64__)
+ CHECK(func[0] == '\xe9'); // e9 XX XX XX XX jmp X
+ CHECK(func[5] == '\x90'); // 90 nop
+ CHECK(func[6] == '\x90'); // 90 nop
+ CHECK(func[7] == '\xc3'); // c3 ret (unmodified)
+#elif defined(__i386__)
+ CHECK(func[0] == '\x68'); // 68 XX XX XX XX push $X
+ CHECK(func[5] == '\xc3'); // c3 ret
+ CHECK(func[6] == '\x90'); // 90 nop
+ CHECK(func[7] == '\xc3'); // c3 ret (unmodified)
+#else
+# error Unsupported target platform
+#endif
+ StartSeccompSandbox();
+ CHECK(my_getpid() == pid);
+}
« no previous file with comments | « seccomp.gyp ('k') | tests/test_patching_input.S » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698