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

Side by Side Diff: sandbox/linux/seccomp-bpf/codegen.cc

Issue 576673003: Decouple CodeGen from ErrorCode (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <stdio.h> 5 #include <stdio.h>
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "sandbox/linux/seccomp-bpf/codegen.h" 8 #include "sandbox/linux/seccomp-bpf/codegen.h"
9 9
10 namespace { 10 namespace {
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 instructions_.push_back(insn); 158 instructions_.push_back(insn);
159 return insn; 159 return insn;
160 } else { 160 } else {
161 // Non-jumping instructions do not use any of the branch targets. 161 // Non-jumping instructions do not use any of the branch targets.
162 Instruction* insn = new Instruction(code, k, next); 162 Instruction* insn = new Instruction(code, k, next);
163 instructions_.push_back(insn); 163 instructions_.push_back(insn);
164 return insn; 164 return insn;
165 } 165 }
166 } 166 }
167 167
168 Instruction* CodeGen::MakeInstruction(uint16_t code, const ErrorCode& err) {
169 if (BPF_CLASS(code) != BPF_RET) {
170 SANDBOX_DIE("ErrorCodes can only be used in return expressions");
171 }
172 if (err.error_type_ != ErrorCode::ET_SIMPLE &&
173 err.error_type_ != ErrorCode::ET_TRAP) {
174 SANDBOX_DIE("ErrorCode is not suitable for returning from a BPF program");
175 }
176 return MakeInstruction(code, err.err_);
177 }
178
179 Instruction* CodeGen::MakeInstruction(uint16_t code, 168 Instruction* CodeGen::MakeInstruction(uint16_t code,
180 uint32_t k, 169 uint32_t k,
181 Instruction* jt, 170 Instruction* jt,
182 Instruction* jf) { 171 Instruction* jf) {
183 // We can handle all conditional jumps. They are followed by both a 172 // We can handle all conditional jumps. They are followed by both a
184 // "true" and a "false" branch. 173 // "true" and a "false" branch.
185 if (BPF_CLASS(code) != BPF_JMP || BPF_OP(code) == BPF_JA) { 174 if (BPF_CLASS(code) != BPF_JMP || BPF_OP(code) == BPF_JA) {
186 SANDBOX_DIE("Expected a BPF_JMP instruction"); 175 SANDBOX_DIE("Expected a BPF_JMP instruction");
187 } 176 }
188 if (!jt && !jf) { 177 if (!jt && !jf) {
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 CutGraphIntoBasicBlocks(instructions, branch_targets, &all_blocks); 750 CutGraphIntoBasicBlocks(instructions, branch_targets, &all_blocks);
762 MergeTails(&all_blocks); 751 MergeTails(&all_blocks);
763 BasicBlocks basic_blocks; 752 BasicBlocks basic_blocks;
764 TopoSortBasicBlocks(first_block, all_blocks, &basic_blocks); 753 TopoSortBasicBlocks(first_block, all_blocks, &basic_blocks);
765 ComputeRelativeJumps(&basic_blocks, all_blocks); 754 ComputeRelativeJumps(&basic_blocks, all_blocks);
766 ConcatenateBasicBlocks(basic_blocks, program); 755 ConcatenateBasicBlocks(basic_blocks, program);
767 return; 756 return;
768 } 757 }
769 758
770 } // namespace sandbox 759 } // namespace sandbox
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698