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

Side by Side Diff: sandbox/linux/seccomp/stat.cc

Issue 997009: Compute and pring the time that it takes to execute system calls. This data... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 9 months 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 | « sandbox/linux/seccomp/socketcall.cc ('k') | sandbox/linux/seccomp/syscall.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "debug.h" 5 #include "debug.h"
6 #include "sandbox_impl.h" 6 #include "sandbox_impl.h"
7 7
8 namespace playground { 8 namespace playground {
9 9
10 int Sandbox::sandbox_stat(const char *path, void *buf) { 10 int Sandbox::sandbox_stat(const char *path, void *buf) {
11 Debug::syscall(__NR_stat, "Executing handler"); 11 long long tm;
12 Debug::syscall(&tm, __NR_stat, "Executing handler");
12 size_t len = strlen(path); 13 size_t len = strlen(path);
13 struct Request { 14 struct Request {
14 int sysnum; 15 int sysnum;
15 long long cookie; 16 long long cookie;
16 Stat stat_req; 17 Stat stat_req;
17 char pathname[0]; 18 char pathname[0];
18 } __attribute__((packed)) *request; 19 } __attribute__((packed)) *request;
19 char data[sizeof(struct Request) + len]; 20 char data[sizeof(struct Request) + len];
20 request = reinterpret_cast<struct Request*>(data); 21 request = reinterpret_cast<struct Request*>(data);
21 request->sysnum = __NR_stat; 22 request->sysnum = __NR_stat;
22 request->cookie = cookie(); 23 request->cookie = cookie();
23 request->stat_req.sysnum = __NR_stat; 24 request->stat_req.sysnum = __NR_stat;
24 request->stat_req.path_length = len; 25 request->stat_req.path_length = len;
25 request->stat_req.buf = buf; 26 request->stat_req.buf = buf;
26 memcpy(request->pathname, path, len); 27 memcpy(request->pathname, path, len);
27 28
28 long rc; 29 long rc;
29 SysCalls sys; 30 SysCalls sys;
30 if (write(sys, processFdPub(), request, sizeof(data)) != (int)sizeof(data) || 31 if (write(sys, processFdPub(), request, sizeof(data)) != (int)sizeof(data) ||
31 read(sys, threadFdPub(), &rc, sizeof(rc)) != sizeof(rc)) { 32 read(sys, threadFdPub(), &rc, sizeof(rc)) != sizeof(rc)) {
32 die("Failed to forward stat() request [sandbox]"); 33 die("Failed to forward stat() request [sandbox]");
33 } 34 }
35 Debug::elapsed(tm, __NR_stat);
34 return static_cast<int>(rc); 36 return static_cast<int>(rc);
35 } 37 }
36 38
37 int Sandbox::sandbox_lstat(const char *path, void *buf) { 39 int Sandbox::sandbox_lstat(const char *path, void *buf) {
38 Debug::syscall(__NR_lstat, "Executing handler"); 40 long long tm;
41 Debug::syscall(&tm, __NR_lstat, "Executing handler");
39 size_t len = strlen(path); 42 size_t len = strlen(path);
40 struct Request { 43 struct Request {
41 int sysnum; 44 int sysnum;
42 long long cookie; 45 long long cookie;
43 Stat stat_req; 46 Stat stat_req;
44 char pathname[0]; 47 char pathname[0];
45 } __attribute__((packed)) *request; 48 } __attribute__((packed)) *request;
46 char data[sizeof(struct Request) + len]; 49 char data[sizeof(struct Request) + len];
47 request = reinterpret_cast<struct Request*>(data); 50 request = reinterpret_cast<struct Request*>(data);
48 request->sysnum = __NR_lstat; 51 request->sysnum = __NR_lstat;
49 request->cookie = cookie(); 52 request->cookie = cookie();
50 request->stat_req.sysnum = __NR_lstat; 53 request->stat_req.sysnum = __NR_lstat;
51 request->stat_req.path_length = len; 54 request->stat_req.path_length = len;
52 request->stat_req.buf = buf; 55 request->stat_req.buf = buf;
53 memcpy(request->pathname, path, len); 56 memcpy(request->pathname, path, len);
54 57
55 long rc; 58 long rc;
56 SysCalls sys; 59 SysCalls sys;
57 if (write(sys, processFdPub(), request, sizeof(data)) != (int)sizeof(data) || 60 if (write(sys, processFdPub(), request, sizeof(data)) != (int)sizeof(data) ||
58 read(sys, threadFdPub(), &rc, sizeof(rc)) != sizeof(rc)) { 61 read(sys, threadFdPub(), &rc, sizeof(rc)) != sizeof(rc)) {
59 die("Failed to forward lstat() request [sandbox]"); 62 die("Failed to forward lstat() request [sandbox]");
60 } 63 }
64 Debug::elapsed(tm, __NR_lstat);
61 return static_cast<int>(rc); 65 return static_cast<int>(rc);
62 } 66 }
63 67
64 #if defined(__NR_stat64) 68 #if defined(__NR_stat64)
65 int Sandbox::sandbox_stat64(const char *path, void *buf) { 69 int Sandbox::sandbox_stat64(const char *path, void *buf) {
66 Debug::syscall(__NR_stat64, "Executing handler"); 70 long long tm;
71 Debug::syscall(&tm, __NR_stat64, "Executing handler");
67 size_t len = strlen(path); 72 size_t len = strlen(path);
68 struct Request { 73 struct Request {
69 int sysnum; 74 int sysnum;
70 long long cookie; 75 long long cookie;
71 Stat stat_req; 76 Stat stat_req;
72 char pathname[0]; 77 char pathname[0];
73 } __attribute__((packed)) *request; 78 } __attribute__((packed)) *request;
74 char data[sizeof(struct Request) + len]; 79 char data[sizeof(struct Request) + len];
75 request = reinterpret_cast<struct Request*>(data); 80 request = reinterpret_cast<struct Request*>(data);
76 request->sysnum = __NR_stat64; 81 request->sysnum = __NR_stat64;
77 request->cookie = cookie(); 82 request->cookie = cookie();
78 request->stat_req.sysnum = __NR_stat64; 83 request->stat_req.sysnum = __NR_stat64;
79 request->stat_req.path_length = len; 84 request->stat_req.path_length = len;
80 request->stat_req.buf = buf; 85 request->stat_req.buf = buf;
81 memcpy(request->pathname, path, len); 86 memcpy(request->pathname, path, len);
82 87
83 long rc; 88 long rc;
84 SysCalls sys; 89 SysCalls sys;
85 if (write(sys, processFdPub(), request, sizeof(data)) != (int)sizeof(data) || 90 if (write(sys, processFdPub(), request, sizeof(data)) != (int)sizeof(data) ||
86 read(sys, threadFdPub(), &rc, sizeof(rc)) != sizeof(rc)) { 91 read(sys, threadFdPub(), &rc, sizeof(rc)) != sizeof(rc)) {
87 die("Failed to forward stat64() request [sandbox]"); 92 die("Failed to forward stat64() request [sandbox]");
88 } 93 }
94 Debug::elapsed(tm, __NR_stat64);
89 return static_cast<int>(rc); 95 return static_cast<int>(rc);
90 } 96 }
91 97
92 int Sandbox::sandbox_lstat64(const char *path, void *buf) { 98 int Sandbox::sandbox_lstat64(const char *path, void *buf) {
93 Debug::syscall(__NR_lstat64, "Executing handler"); 99 long long tm;
100 Debug::syscall(&tm, __NR_lstat64, "Executing handler");
94 size_t len = strlen(path); 101 size_t len = strlen(path);
95 struct Request { 102 struct Request {
96 int sysnum; 103 int sysnum;
97 long long cookie; 104 long long cookie;
98 Stat stat_req; 105 Stat stat_req;
99 char pathname[0]; 106 char pathname[0];
100 } __attribute__((packed)) *request; 107 } __attribute__((packed)) *request;
101 char data[sizeof(struct Request) + len]; 108 char data[sizeof(struct Request) + len];
102 request = reinterpret_cast<struct Request*>(data); 109 request = reinterpret_cast<struct Request*>(data);
103 request->sysnum = __NR_lstat64; 110 request->sysnum = __NR_lstat64;
104 request->cookie = cookie(); 111 request->cookie = cookie();
105 request->stat_req.sysnum = __NR_lstat64; 112 request->stat_req.sysnum = __NR_lstat64;
106 request->stat_req.path_length = len; 113 request->stat_req.path_length = len;
107 request->stat_req.buf = buf; 114 request->stat_req.buf = buf;
108 memcpy(request->pathname, path, len); 115 memcpy(request->pathname, path, len);
109 116
110 long rc; 117 long rc;
111 SysCalls sys; 118 SysCalls sys;
112 if (write(sys, processFdPub(), request, sizeof(data)) != (int)sizeof(data) || 119 if (write(sys, processFdPub(), request, sizeof(data)) != (int)sizeof(data) ||
113 read(sys, threadFdPub(), &rc, sizeof(rc)) != sizeof(rc)) { 120 read(sys, threadFdPub(), &rc, sizeof(rc)) != sizeof(rc)) {
114 die("Failed to forward lstat64() request [sandbox]"); 121 die("Failed to forward lstat64() request [sandbox]");
115 } 122 }
123 Debug::elapsed(tm, __NR_lstat64);
116 return static_cast<int>(rc); 124 return static_cast<int>(rc);
117 } 125 }
118 #endif 126 #endif
119 127
120 bool Sandbox::process_stat(int parentMapsFd, int sandboxFd, int threadFdPub, 128 bool Sandbox::process_stat(int parentMapsFd, int sandboxFd, int threadFdPub,
121 int threadFd, SecureMem::Args* mem) { 129 int threadFd, SecureMem::Args* mem) {
122 // Read request 130 // Read request
123 SysCalls sys; 131 SysCalls sys;
124 Stat stat_req; 132 Stat stat_req;
125 if (read(sys, sandboxFd, &stat_req, sizeof(stat_req)) != sizeof(stat_req)) { 133 if (read(sys, sandboxFd, &stat_req, sizeof(stat_req)) != sizeof(stat_req)) {
(...skipping 24 matching lines...) Expand all
150 (ssize_t)stat_req.path_length) { 158 (ssize_t)stat_req.path_length) {
151 goto read_parm_failed; 159 goto read_parm_failed;
152 } 160 }
153 tmp[stat_req.path_length] = '\000'; 161 tmp[stat_req.path_length] = '\000';
154 Debug::message(("Denying access to \"" + std::string(tmp) + "\"").c_str()); 162 Debug::message(("Denying access to \"" + std::string(tmp) + "\"").c_str());
155 SecureMem::abandonSystemCall(threadFd, -EACCES); 163 SecureMem::abandonSystemCall(threadFd, -EACCES);
156 return false; 164 return false;
157 } 165 }
158 166
159 } // namespace 167 } // namespace
OLDNEW
« no previous file with comments | « sandbox/linux/seccomp/socketcall.cc ('k') | sandbox/linux/seccomp/syscall.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698