| OLD | NEW |
| 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 Loading... |
| 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 |
| OLD | NEW |