зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1409900 - Handle sandboxed statfs() by replacing it with open+fstatfs. r=gcp
MozReview-Commit-ID: 4Q0XMWcxaAc --HG-- extra : rebase_source : e6065c91ddb271b71b5577ca0d6c39349565724c
This commit is contained in:
Родитель
27d4543313
Коммит
ee247f0d5f
|
@ -539,6 +539,40 @@ private:
|
|||
return ConvertError(socketpair(AF_UNIX, SOCK_SEQPACKET, 0, fds));
|
||||
}
|
||||
|
||||
static intptr_t StatFsTrap(ArgsRef aArgs, void* aux) {
|
||||
// Warning: the kernel interface is not the C interface. The
|
||||
// structs are different (<asm/statfs.h> vs. <sys/statfs.h>), and
|
||||
// the statfs64 version takes an additional size parameter.
|
||||
auto path = reinterpret_cast<const char*>(aArgs.args[0]);
|
||||
int fd = open(path, O_RDONLY | O_LARGEFILE);
|
||||
if (fd < 0) {
|
||||
return -errno;
|
||||
}
|
||||
|
||||
intptr_t rv;
|
||||
switch (aArgs.nr) {
|
||||
case __NR_statfs: {
|
||||
auto buf = reinterpret_cast<void*>(aArgs.args[1]);
|
||||
rv = DoSyscall(__NR_fstatfs, fd, buf);
|
||||
break;
|
||||
}
|
||||
#ifdef __NR_statfs64
|
||||
case __NR_statfs64: {
|
||||
auto sz = static_cast<size_t>(aArgs.args[1]);
|
||||
auto buf = reinterpret_cast<void*>(aArgs.args[2]);
|
||||
rv = DoSyscall(__NR_fstatfs64, fd, sz, buf);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
MOZ_ASSERT(false);
|
||||
rv = -ENOSYS;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return rv;
|
||||
}
|
||||
|
||||
public:
|
||||
explicit ContentSandboxPolicy(SandboxBrokerClient* aBroker,
|
||||
const std::vector<int>& aSyscallWhitelist)
|
||||
|
@ -691,10 +725,12 @@ public:
|
|||
case __NR_getppid:
|
||||
return Trap(GetPPidTrap, nullptr);
|
||||
|
||||
CASES_FOR_statfs:
|
||||
return Trap(StatFsTrap, nullptr);
|
||||
|
||||
// Filesystem syscalls that need more work to determine who's
|
||||
// using them, if they need to be, and what we intend to about it.
|
||||
case __NR_getcwd:
|
||||
CASES_FOR_statfs:
|
||||
CASES_FOR_fstatfs:
|
||||
CASES_FOR_fchown:
|
||||
case __NR_fchmod:
|
||||
|
|
Загрузка…
Ссылка в новой задаче