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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « seccomp.gyp ('k') | tests/test_patching_input.S » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <fcntl.h>
6
7 #include "library.h"
8 #include "sandbox.h"
9 #include "test_runner.h"
10
11
12 extern "C" int my_getpid(void);
13 extern char my_getpid_end[];
14
15 void patch_range(char *start, char *end) {
16 int maps_fd;
17 CHECK_SUCCEEDS((maps_fd = open("/proc/self/maps", O_RDONLY, 0)) >= 0);
18 playground::Maps maps(maps_fd);
19 playground::Library library;
20 library.setLibraryInfo(&maps);
21 char *extra_space = NULL;
22 int extra_size = 0;
23 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
24 CHECK_SUCCEEDS(mprotect(page_start, end - page_start,
25 PROT_READ | PROT_WRITE | PROT_EXEC) == 0);
26 library.patchSystemCallsInRange(start, end, &extra_space, &extra_size);
27 CHECK_SUCCEEDS(close(maps_fd) == 0);
28 }
29
30 TEST(test_patching_syscall) {
31 int pid = getpid();
32 CHECK(my_getpid() == pid);
33 char *func = (char *) my_getpid;
34 char *func_end = my_getpid_end;
35 patch_range(func, func_end);
36 #if defined(__x86_64__)
37 CHECK(func[0] == '\xe9'); // e9 XX XX XX XX jmp X
38 CHECK(func[5] == '\x90'); // 90 nop
39 CHECK(func[6] == '\x90'); // 90 nop
40 CHECK(func[7] == '\xc3'); // c3 ret (unmodified)
41 #elif defined(__i386__)
42 CHECK(func[0] == '\x68'); // 68 XX XX XX XX push $X
43 CHECK(func[5] == '\xc3'); // c3 ret
44 CHECK(func[6] == '\x90'); // 90 nop
45 CHECK(func[7] == '\xc3'); // c3 ret (unmodified)
46 #else
47 # error Unsupported target platform
48 #endif
49 StartSeccompSandbox();
50 CHECK(my_getpid() == pid);
51 }
OLDNEW
« 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