Index: sandbox/linux/seccomp-bpf/syscall_iterator.cc |
diff --git a/sandbox/linux/seccomp-bpf/syscall_iterator.cc b/sandbox/linux/seccomp-bpf/syscall_iterator.cc |
index 89cc1cb473cc911cd0c1254129624f13d422174c..d1c383b470f48b7fa35431c0dbf7fb219a353bd2 100644 |
--- a/sandbox/linux/seccomp-bpf/syscall_iterator.cc |
+++ b/sandbox/linux/seccomp-bpf/syscall_iterator.cc |
@@ -16,14 +16,25 @@ uint32_t SyscallIterator::Next() { |
uint32_t val; |
do { |
+#if defined(__mips__) && (_MIPS_SIM == _MIPS_SIM_ABI32) |
+ // |num_| has been initialized to 4000, which we assume is also MIN_SYSCALL. |
+ // This is true for Mips O32 ABI. |
+ COMPILE_ASSERT(MIN_SYSCALL == __NR_Linux, min_syscall_should_be_4000); |
+#else |
// |num_| has been initialized to 0, which we assume is also MIN_SYSCALL. |
// This true for supported architectures (Intel and ARM EABI). |
COMPILE_ASSERT(MIN_SYSCALL == 0u, min_syscall_should_always_be_zero); |
+#endif |
val = num_; |
+ // The syscall iterator always starts at zero. |
+ // If zero is not a valid system call, iterator first returns MIN_SYSCALL -1 |
+ // before continuing to iterate. |
+ if (num_ == 0 && MIN_SYSCALL != num_) { |
+ num_ = MIN_SYSCALL - 1; |
// First we iterate up to MAX_PUBLIC_SYSCALL, which is equal to MAX_SYSCALL |
// on Intel architectures, but leaves room for private syscalls on ARM. |
- if (num_ <= MAX_PUBLIC_SYSCALL) { |
+ } else if (num_ <= MAX_PUBLIC_SYSCALL) { |
if (invalid_only_ && num_ < MAX_PUBLIC_SYSCALL) { |
num_ = MAX_PUBLIC_SYSCALL; |
} else { |