| Index: sandbox/linux/seccomp-bpf/codegen.h
|
| diff --git a/sandbox/linux/seccomp-bpf/codegen.h b/sandbox/linux/seccomp-bpf/codegen.h
|
| deleted file mode 100644
|
| index ef04a5db4c5442fab669057d7c26428e0593e81e..0000000000000000000000000000000000000000
|
| --- a/sandbox/linux/seccomp-bpf/codegen.h
|
| +++ /dev/null
|
| @@ -1,123 +0,0 @@
|
| -// Copyright (c) 2012 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.
|
| -
|
| -#ifndef SANDBOX_LINUX_SECCOMP_BPF_CODEGEN_H__
|
| -#define SANDBOX_LINUX_SECCOMP_BPF_CODEGEN_H__
|
| -
|
| -#include <stddef.h>
|
| -#include <stdint.h>
|
| -
|
| -#include <map>
|
| -#include <vector>
|
| -
|
| -#include "base/macros.h"
|
| -#include "base/tuple.h"
|
| -#include "sandbox/sandbox_export.h"
|
| -
|
| -struct sock_filter;
|
| -
|
| -namespace sandbox {
|
| -
|
| -// The code generator implements a basic assembler that can convert a
|
| -// graph of BPF instructions into a well-formed array of BPF
|
| -// instructions. Most notably, it ensures that jumps are always
|
| -// forward and don't exceed the limit of 255 instructions imposed by
|
| -// the instruction set.
|
| -//
|
| -// Callers would typically create a new CodeGen object and then use it
|
| -// to build a DAG of instruction nodes. They'll eventually call
|
| -// Compile() to convert this DAG to a Program.
|
| -//
|
| -// CodeGen gen;
|
| -// CodeGen::Node allow, branch, dag;
|
| -//
|
| -// allow =
|
| -// gen.MakeInstruction(BPF_RET+BPF_K,
|
| -// ErrorCode(ErrorCode::ERR_ALLOWED).err()));
|
| -// branch =
|
| -// gen.MakeInstruction(BPF_JMP+BPF_EQ+BPF_K, __NR_getpid,
|
| -// Trap(GetPidHandler, NULL), allow);
|
| -// dag =
|
| -// gen.MakeInstruction(BPF_LD+BPF_W+BPF_ABS,
|
| -// offsetof(struct arch_seccomp_data, nr), branch);
|
| -//
|
| -// // Simplified code follows; in practice, it is important to avoid calling
|
| -// // any C++ destructors after starting the sandbox.
|
| -// CodeGen::Program program;
|
| -// gen.Compile(dag, program);
|
| -// const struct sock_fprog prog = {
|
| -// static_cast<unsigned short>(program->size()), &program[0] };
|
| -// prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
|
| -//
|
| -class SANDBOX_EXPORT CodeGen {
|
| - public:
|
| - // A vector of BPF instructions that need to be installed as a filter
|
| - // program in the kernel.
|
| - typedef std::vector<struct sock_filter> Program;
|
| -
|
| - // Node represents a node within the instruction DAG being compiled.
|
| - using Node = Program::size_type;
|
| -
|
| - // kNullNode represents the "null" node; i.e., the reserved node
|
| - // value guaranteed to not equal any actual nodes.
|
| - static const Node kNullNode = -1;
|
| -
|
| - CodeGen();
|
| - ~CodeGen();
|
| -
|
| - // MakeInstruction creates a node representing the specified
|
| - // instruction, or returns and existing equivalent node if one
|
| - // exists. For details on the possible parameters refer to
|
| - // https://www.kernel.org/doc/Documentation/networking/filter.txt.
|
| - // TODO(mdempsky): Reconsider using default arguments here.
|
| - Node MakeInstruction(uint16_t code,
|
| - uint32_t k,
|
| - Node jt = kNullNode,
|
| - Node jf = kNullNode);
|
| -
|
| - // Compile linearizes the instruction DAG rooted at |head| into a
|
| - // program that can be executed by a BPF virtual machine.
|
| - void Compile(Node head, Program* program);
|
| -
|
| - private:
|
| - using MemoKey = Tuple<uint16_t, uint32_t, Node, Node>;
|
| - struct MemoKeyLess {
|
| - bool operator()(const MemoKey& lhs, const MemoKey& rhs) const;
|
| - };
|
| -
|
| - // AppendInstruction adds a new instruction, ensuring that |jt| and
|
| - // |jf| are within range as necessary for |code|.
|
| - Node AppendInstruction(uint16_t code, uint32_t k, Node jt, Node jf);
|
| -
|
| - // WithinRange returns a node equivalent to |next| that is at most
|
| - // |range| instructions away from the (logical) beginning of the
|
| - // program.
|
| - Node WithinRange(Node next, size_t range);
|
| -
|
| - // Append appends a new instruction to the physical end (i.e.,
|
| - // logical beginning) of |program_|.
|
| - Node Append(uint16_t code, uint32_t k, size_t jt, size_t jf);
|
| -
|
| - // Offset returns how many instructions exist in |program_| after |target|.
|
| - size_t Offset(Node target) const;
|
| -
|
| - // NOTE: program_ is the compiled program in *reverse*, so that
|
| - // indices remain stable as we add instructions.
|
| - Program program_;
|
| -
|
| - // equivalent_ stores the most recent semantically-equivalent node for each
|
| - // instruction in program_. A node is defined as semantically-equivalent to N
|
| - // if it has the same instruction code and constant as N and its successor
|
| - // nodes (if any) are semantically-equivalent to N's successor nodes, or
|
| - // if it's an unconditional jump to a node semantically-equivalent to N.
|
| - std::vector<Node> equivalent_;
|
| -
|
| - std::map<MemoKey, Node, MemoKeyLess> memos_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(CodeGen);
|
| -};
|
| -
|
| -} // namespace sandbox
|
| -
|
| -#endif // SANDBOX_LINUX_SECCOMP_BPF_CODEGEN_H__
|
|
|