Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / sandbox / linux / seccomp-bpf-helpers / syscall_sets.cc
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "sandbox/linux/seccomp-bpf-helpers/syscall_sets.h"
6
7 #include "build/build_config.h"
8 #include "sandbox/linux/services/linux_syscalls.h"
9
10 namespace sandbox {
11
12 // The functions below cover all existing i386, x86_64, and ARM system calls;
13 // excluding syscalls made obsolete in ARM EABI.
14 // The implicitly defined sets form a partition of the sets of
15 // system calls.
16
17 bool SyscallSets::IsKill(int sysno) {
18   switch (sysno) {
19     case __NR_kill:
20     case __NR_tgkill:
21     case __NR_tkill:  // Deprecated.
22       return true;
23     default:
24       return false;
25   }
26 }
27
28 bool SyscallSets::IsAllowedGettime(int sysno) {
29   switch (sysno) {
30     case __NR_clock_gettime:
31     case __NR_gettimeofday:
32 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
33     case __NR_time:
34 #endif
35       return true;
36     case __NR_adjtimex:         // Privileged.
37     case __NR_clock_adjtime:    // Privileged.
38     case __NR_clock_getres:     // Could be allowed.
39     case __NR_clock_nanosleep:  // Could be allowed.
40     case __NR_clock_settime:    // Privileged.
41 #if defined(__i386__) || defined(__mips__)
42     case __NR_ftime:  // Obsolete.
43 #endif
44     case __NR_settimeofday:  // Privileged.
45 #if defined(__i386__) || defined(__mips__)
46     case __NR_stime:
47 #endif
48     default:
49       return false;
50   }
51 }
52
53 bool SyscallSets::IsCurrentDirectory(int sysno) {
54   switch (sysno) {
55     case __NR_getcwd:
56     case __NR_chdir:
57     case __NR_fchdir:
58       return true;
59     default:
60       return false;
61   }
62 }
63
64 bool SyscallSets::IsUmask(int sysno) {
65   switch (sysno) {
66     case __NR_umask:
67       return true;
68     default:
69       return false;
70   }
71 }
72
73 // System calls that directly access the file system. They might acquire
74 // a new file descriptor or otherwise perform an operation directly
75 // via a path.
76 // Both EPERM and ENOENT are valid errno unless otherwise noted in comment.
77 bool SyscallSets::IsFileSystem(int sysno) {
78   switch (sysno) {
79     case __NR_access:  // EPERM not a valid errno.
80     case __NR_chmod:
81     case __NR_chown:
82 #if defined(__i386__) || defined(__arm__)
83     case __NR_chown32:
84 #endif
85     case __NR_creat:
86     case __NR_execve:
87     case __NR_faccessat:  // EPERM not a valid errno.
88     case __NR_fchmodat:
89     case __NR_fchownat:  // Should be called chownat ?
90 #if defined(__x86_64__)
91     case __NR_newfstatat:  // fstatat(). EPERM not a valid errno.
92 #elif defined(__i386__) || defined(__arm__) || defined(__mips__)
93     case __NR_fstatat64:
94 #endif
95     case __NR_futimesat:  // Should be called utimesat ?
96     case __NR_lchown:
97 #if defined(__i386__) || defined(__arm__)
98     case __NR_lchown32:
99 #endif
100     case __NR_link:
101     case __NR_linkat:
102     case __NR_lookup_dcookie:  // ENOENT not a valid errno.
103     case __NR_lstat:           // EPERM not a valid errno.
104 #if defined(__i386__)
105     case __NR_oldlstat:
106 #endif
107 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
108     case __NR_lstat64:
109 #endif
110     case __NR_mkdir:
111     case __NR_mkdirat:
112     case __NR_mknod:
113     case __NR_mknodat:
114     case __NR_open:
115     case __NR_openat:
116     case __NR_readlink:  // EPERM not a valid errno.
117     case __NR_readlinkat:
118     case __NR_rename:
119     case __NR_renameat:
120     case __NR_rmdir:
121     case __NR_stat:  // EPERM not a valid errno.
122 #if defined(__i386__)
123     case __NR_oldstat:
124 #endif
125 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
126     case __NR_stat64:
127 #endif
128     case __NR_statfs:  // EPERM not a valid errno.
129 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
130     case __NR_statfs64:
131 #endif
132     case __NR_symlink:
133     case __NR_symlinkat:
134     case __NR_truncate:
135 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
136     case __NR_truncate64:
137 #endif
138     case __NR_unlink:
139     case __NR_unlinkat:
140     case __NR_uselib:  // Neither EPERM, nor ENOENT are valid errno.
141     case __NR_ustat:   // Same as above. Deprecated.
142 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
143     case __NR_utime:
144 #endif
145     case __NR_utimensat:  // New.
146     case __NR_utimes:
147       return true;
148     default:
149       return false;
150   }
151 }
152
153 bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
154   switch (sysno) {
155     case __NR_fstat:
156 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
157     case __NR_fstat64:
158 #endif
159       return true;
160 // TODO(jln): these should be denied gracefully as well (moved below).
161 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
162     case __NR_fadvise64:  // EPERM not a valid errno.
163 #endif
164 #if defined(__i386__)
165     case __NR_fadvise64_64:
166 #endif
167 #if defined(__arm__)
168     case __NR_arm_fadvise64_64:
169 #endif
170     case __NR_fdatasync:  // EPERM not a valid errno.
171     case __NR_flock:      // EPERM not a valid errno.
172     case __NR_fstatfs:    // Give information about the whole filesystem.
173 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
174     case __NR_fstatfs64:
175 #endif
176     case __NR_fsync:  // EPERM not a valid errno.
177 #if defined(__i386__)
178     case __NR_oldfstat:
179 #endif
180 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
181     case __NR_sync_file_range:  // EPERM not a valid errno.
182 #elif defined(__arm__)
183     case __NR_arm_sync_file_range:  // EPERM not a valid errno.
184 #endif
185     default:
186       return false;
187   }
188 }
189
190 // EPERM is a good errno for any of these.
191 bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
192   switch (sysno) {
193     case __NR_fallocate:
194     case __NR_fchmod:
195     case __NR_fchown:
196     case __NR_ftruncate:
197 #if defined(__i386__) || defined(__arm__)
198     case __NR_fchown32:
199 #endif
200 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
201     case __NR_ftruncate64:
202 #endif
203     case __NR_getdents:    // EPERM not a valid errno.
204     case __NR_getdents64:  // EPERM not a valid errno.
205 #if defined(__i386__) || defined(__mips__)
206     case __NR_readdir:
207 #endif
208       return true;
209     default:
210       return false;
211   }
212 }
213
214 bool SyscallSets::IsGetSimpleId(int sysno) {
215   switch (sysno) {
216     case __NR_capget:
217     case __NR_getegid:
218     case __NR_geteuid:
219     case __NR_getgid:
220     case __NR_getgroups:
221     case __NR_getpid:
222     case __NR_getppid:
223     case __NR_getresgid:
224     case __NR_getsid:
225     case __NR_gettid:
226     case __NR_getuid:
227     case __NR_getresuid:
228 #if defined(__i386__) || defined(__arm__)
229     case __NR_getegid32:
230     case __NR_geteuid32:
231     case __NR_getgid32:
232     case __NR_getgroups32:
233     case __NR_getresgid32:
234     case __NR_getresuid32:
235     case __NR_getuid32:
236 #endif
237       return true;
238     default:
239       return false;
240   }
241 }
242
243 bool SyscallSets::IsProcessPrivilegeChange(int sysno) {
244   switch (sysno) {
245     case __NR_capset:
246 #if defined(__i386__) || defined(__x86_64__)
247     case __NR_ioperm:  // Intel privilege.
248     case __NR_iopl:    // Intel privilege.
249 #endif
250     case __NR_setfsgid:
251     case __NR_setfsuid:
252     case __NR_setgid:
253     case __NR_setgroups:
254     case __NR_setregid:
255     case __NR_setresgid:
256     case __NR_setresuid:
257     case __NR_setreuid:
258     case __NR_setuid:
259 #if defined(__i386__) || defined(__arm__)
260     case __NR_setfsgid32:
261     case __NR_setfsuid32:
262     case __NR_setgid32:
263     case __NR_setgroups32:
264     case __NR_setregid32:
265     case __NR_setresgid32:
266     case __NR_setresuid32:
267     case __NR_setreuid32:
268     case __NR_setuid32:
269 #endif
270       return true;
271     default:
272       return false;
273   }
274 }
275
276 bool SyscallSets::IsProcessGroupOrSession(int sysno) {
277   switch (sysno) {
278     case __NR_setpgid:
279     case __NR_getpgrp:
280     case __NR_setsid:
281     case __NR_getpgid:
282       return true;
283     default:
284       return false;
285   }
286 }
287
288 bool SyscallSets::IsAllowedSignalHandling(int sysno) {
289   switch (sysno) {
290     case __NR_rt_sigaction:
291     case __NR_rt_sigprocmask:
292     case __NR_rt_sigreturn:
293 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
294     case __NR_sigaction:
295     case __NR_sigprocmask:
296     case __NR_sigreturn:
297 #endif
298       return true;
299     case __NR_rt_sigpending:
300     case __NR_rt_sigqueueinfo:
301     case __NR_rt_sigsuspend:
302     case __NR_rt_sigtimedwait:
303     case __NR_rt_tgsigqueueinfo:
304     case __NR_sigaltstack:
305     case __NR_signalfd:
306     case __NR_signalfd4:
307 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
308     case __NR_sigpending:
309     case __NR_sigsuspend:
310 #endif
311 #if defined(__i386__) || defined(__mips__)
312     case __NR_signal:
313     case __NR_sgetmask:  // Obsolete.
314     case __NR_ssetmask:
315 #endif
316     default:
317       return false;
318   }
319 }
320
321 bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
322   switch (sysno) {
323     case __NR_close:
324     case __NR_dup:
325     case __NR_dup2:
326     case __NR_dup3:
327 #if defined(__x86_64__) || defined(__arm__) || defined(__mips__)
328     case __NR_shutdown:
329 #endif
330       return true;
331     case __NR_fcntl:
332 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
333     case __NR_fcntl64:
334 #endif
335     default:
336       return false;
337   }
338 }
339
340 bool SyscallSets::IsKernelInternalApi(int sysno) {
341   switch (sysno) {
342     case __NR_restart_syscall:
343 #if defined(__arm__)
344     case __ARM_NR_cmpxchg:
345 #endif
346       return true;
347     default:
348       return false;
349   }
350 }
351
352 // This should be thought through in conjunction with IsFutex().
353 bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
354   switch (sysno) {
355     case __NR_exit:
356     case __NR_exit_group:
357     case __NR_wait4:
358     case __NR_waitid:
359 #if defined(__i386__)
360     case __NR_waitpid:
361 #endif
362       return true;
363     case __NR_clone:  // Should be parameter-restricted.
364     case __NR_setns:  // Privileged.
365     case __NR_fork:
366 #if defined(__i386__) || defined(__x86_64__)
367     case __NR_get_thread_area:
368 #endif
369 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
370     case __NR_set_thread_area:
371 #endif
372     case __NR_set_tid_address:
373     case __NR_unshare:
374 #if !defined(__mips__)
375     case __NR_vfork:
376 #endif
377     default:
378       return false;
379   }
380 }
381
382 // It's difficult to restrict those, but there is attack surface here.
383 bool SyscallSets::IsAllowedFutex(int sysno) {
384   switch (sysno) {
385     case __NR_get_robust_list:
386     case __NR_set_robust_list:
387       return true;
388     case __NR_futex:
389     default:
390       return false;
391   }
392 }
393
394 bool SyscallSets::IsAllowedEpoll(int sysno) {
395   switch (sysno) {
396     case __NR_epoll_create:
397     case __NR_epoll_create1:
398     case __NR_epoll_ctl:
399     case __NR_epoll_wait:
400       return true;
401     default:
402 #if defined(__x86_64__)
403     case __NR_epoll_ctl_old:
404 #endif
405     case __NR_epoll_pwait:
406 #if defined(__x86_64__)
407     case __NR_epoll_wait_old:
408 #endif
409       return false;
410   }
411 }
412
413 bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
414   switch (sysno) {
415     case __NR_pipe:
416     case __NR_pipe2:
417       return true;
418     default:
419 #if defined(__x86_64__) || defined(__arm__) || defined(__mips__)
420     case __NR_socketpair:  // We will want to inspect its argument.
421 #endif
422       return false;
423   }
424 }
425
426 bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
427   switch (sysno) {
428 #if defined(__x86_64__) || defined(__arm__) || defined(__mips__)
429     case __NR_accept:
430     case __NR_accept4:
431     case __NR_bind:
432     case __NR_connect:
433     case __NR_socket:
434     case __NR_listen:
435       return true;
436 #endif
437     default:
438       return false;
439   }
440 }
441
442 #if defined(__i386__) || defined(__mips__)
443 // Big multiplexing system call for sockets.
444 bool SyscallSets::IsSocketCall(int sysno) {
445   switch (sysno) {
446     case __NR_socketcall:
447       return true;
448     default:
449       return false;
450   }
451 }
452 #endif
453
454 #if defined(__x86_64__) || defined(__arm__) || defined(__mips__)
455 bool SyscallSets::IsNetworkSocketInformation(int sysno) {
456   switch (sysno) {
457     case __NR_getpeername:
458     case __NR_getsockname:
459     case __NR_getsockopt:
460     case __NR_setsockopt:
461       return true;
462     default:
463       return false;
464   }
465 }
466 #endif
467
468 bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
469   switch (sysno) {
470     case __NR_brk:
471     case __NR_mlock:
472     case __NR_munlock:
473     case __NR_munmap:
474       return true;
475     case __NR_madvise:
476     case __NR_mincore:
477     case __NR_mlockall:
478 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
479     case __NR_mmap:
480 #endif
481 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
482     case __NR_mmap2:
483 #endif
484 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
485     case __NR_modify_ldt:
486 #endif
487     case __NR_mprotect:
488     case __NR_mremap:
489     case __NR_msync:
490     case __NR_munlockall:
491     case __NR_readahead:
492     case __NR_remap_file_pages:
493 #if defined(__i386__)
494     case __NR_vm86:
495     case __NR_vm86old:
496 #endif
497     default:
498       return false;
499   }
500 }
501
502 bool SyscallSets::IsAllowedGeneralIo(int sysno) {
503   switch (sysno) {
504     case __NR_lseek:
505 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
506     case __NR__llseek:
507 #endif
508     case __NR_poll:
509     case __NR_ppoll:
510     case __NR_pselect6:
511     case __NR_read:
512     case __NR_readv:
513 #if defined(__arm__) || defined(__mips__)
514     case __NR_recv:
515 #endif
516 #if defined(__x86_64__) || defined(__arm__) || defined(__mips__)
517     case __NR_recvfrom:  // Could specify source.
518     case __NR_recvmsg:   // Could specify source.
519 #endif
520 #if defined(__i386__) || defined(__x86_64__)
521     case __NR_select:
522 #endif
523 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
524     case __NR__newselect:
525 #endif
526 #if defined(__arm__)
527     case __NR_send:
528 #endif
529 #if defined(__x86_64__) || defined(__arm__) || defined(__mips__)
530     case __NR_sendmsg:  // Could specify destination.
531     case __NR_sendto:   // Could specify destination.
532 #endif
533     case __NR_write:
534     case __NR_writev:
535       return true;
536     case __NR_ioctl:  // Can be very powerful.
537     case __NR_pread64:
538     case __NR_preadv:
539     case __NR_pwrite64:
540     case __NR_pwritev:
541     case __NR_recvmmsg:  // Could specify source.
542     case __NR_sendfile:
543 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
544     case __NR_sendfile64:
545 #endif
546     case __NR_sendmmsg:  // Could specify destination.
547     case __NR_splice:
548     case __NR_tee:
549     case __NR_vmsplice:
550     default:
551       return false;
552   }
553 }
554
555 bool SyscallSets::IsPrctl(int sysno) {
556   switch (sysno) {
557 #if defined(__x86_64__)
558     case __NR_arch_prctl:
559 #endif
560     case __NR_prctl:
561       return true;
562     default:
563       return false;
564   }
565 }
566
567 bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
568   switch (sysno) {
569     case __NR_sched_yield:
570     case __NR_pause:
571     case __NR_nanosleep:
572       return true;
573     case __NR_getpriority:
574 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
575     case __NR_nice:
576 #endif
577     case __NR_setpriority:
578     default:
579       return false;
580   }
581 }
582
583 bool SyscallSets::IsAdminOperation(int sysno) {
584   switch (sysno) {
585 #if defined(__i386__) || defined(__arm__) || defined(__mips__)
586     case __NR_bdflush:
587 #endif
588     case __NR_kexec_load:
589     case __NR_reboot:
590     case __NR_setdomainname:
591     case __NR_sethostname:
592     case __NR_syslog:
593       return true;
594     default:
595       return false;
596   }
597 }
598
599 bool SyscallSets::IsKernelModule(int sysno) {
600   switch (sysno) {
601 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
602     case __NR_create_module:
603     case __NR_get_kernel_syms:  // Should ENOSYS.
604     case __NR_query_module:
605 #endif
606     case __NR_delete_module:
607     case __NR_init_module:
608       return true;
609     default:
610       return false;
611   }
612 }
613
614 bool SyscallSets::IsGlobalFSViewChange(int sysno) {
615   switch (sysno) {
616     case __NR_pivot_root:
617     case __NR_chroot:
618     case __NR_sync:
619       return true;
620     default:
621       return false;
622   }
623 }
624
625 bool SyscallSets::IsFsControl(int sysno) {
626   switch (sysno) {
627     case __NR_mount:
628     case __NR_nfsservctl:
629     case __NR_quotactl:
630     case __NR_swapoff:
631     case __NR_swapon:
632 #if defined(__i386__) || defined(__mips__)
633     case __NR_umount:
634 #endif
635     case __NR_umount2:
636       return true;
637     default:
638       return false;
639   }
640 }
641
642 bool SyscallSets::IsNuma(int sysno) {
643   switch (sysno) {
644     case __NR_get_mempolicy:
645     case __NR_getcpu:
646     case __NR_mbind:
647 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
648     case __NR_migrate_pages:
649 #endif
650     case __NR_move_pages:
651     case __NR_set_mempolicy:
652       return true;
653     default:
654       return false;
655   }
656 }
657
658 bool SyscallSets::IsMessageQueue(int sysno) {
659   switch (sysno) {
660     case __NR_mq_getsetattr:
661     case __NR_mq_notify:
662     case __NR_mq_open:
663     case __NR_mq_timedreceive:
664     case __NR_mq_timedsend:
665     case __NR_mq_unlink:
666       return true;
667     default:
668       return false;
669   }
670 }
671
672 bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
673   switch (sysno) {
674     case __NR_acct:  // Privileged.
675 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
676     case __NR_getrlimit:
677 #endif
678 #if defined(__i386__) || defined(__arm__)
679     case __NR_ugetrlimit:
680 #endif
681 #if defined(__i386__) || defined(__mips__)
682     case __NR_ulimit:
683 #endif
684     case __NR_getrusage:
685     case __NR_personality:  // Can change its personality as well.
686     case __NR_prlimit64:    // Like setrlimit / getrlimit.
687     case __NR_setrlimit:
688     case __NR_times:
689       return true;
690     default:
691       return false;
692   }
693 }
694
695 bool SyscallSets::IsDebug(int sysno) {
696   switch (sysno) {
697     case __NR_ptrace:
698     case __NR_process_vm_readv:
699     case __NR_process_vm_writev:
700 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
701     case __NR_kcmp:
702 #endif
703       return true;
704     default:
705       return false;
706   }
707 }
708
709 bool SyscallSets::IsGlobalSystemStatus(int sysno) {
710   switch (sysno) {
711     case __NR__sysctl:
712     case __NR_sysfs:
713     case __NR_sysinfo:
714     case __NR_uname:
715 #if defined(__i386__)
716     case __NR_olduname:
717     case __NR_oldolduname:
718 #endif
719       return true;
720     default:
721       return false;
722   }
723 }
724
725 bool SyscallSets::IsEventFd(int sysno) {
726   switch (sysno) {
727     case __NR_eventfd:
728     case __NR_eventfd2:
729       return true;
730     default:
731       return false;
732   }
733 }
734
735 // Asynchronous I/O API.
736 bool SyscallSets::IsAsyncIo(int sysno) {
737   switch (sysno) {
738     case __NR_io_cancel:
739     case __NR_io_destroy:
740     case __NR_io_getevents:
741     case __NR_io_setup:
742     case __NR_io_submit:
743       return true;
744     default:
745       return false;
746   }
747 }
748
749 bool SyscallSets::IsKeyManagement(int sysno) {
750   switch (sysno) {
751     case __NR_add_key:
752     case __NR_keyctl:
753     case __NR_request_key:
754       return true;
755     default:
756       return false;
757   }
758 }
759
760 #if defined(__x86_64__) || defined(__arm__)
761 bool SyscallSets::IsSystemVSemaphores(int sysno) {
762   switch (sysno) {
763     case __NR_semctl:
764     case __NR_semget:
765     case __NR_semop:
766     case __NR_semtimedop:
767       return true;
768     default:
769       return false;
770   }
771 }
772 #endif
773
774 #if defined(__x86_64__) || defined(__arm__)
775 // These give a lot of ambient authority and bypass the setuid sandbox.
776 bool SyscallSets::IsSystemVSharedMemory(int sysno) {
777   switch (sysno) {
778     case __NR_shmat:
779     case __NR_shmctl:
780     case __NR_shmdt:
781     case __NR_shmget:
782       return true;
783     default:
784       return false;
785   }
786 }
787 #endif
788
789 #if defined(__x86_64__) || defined(__arm__)
790 bool SyscallSets::IsSystemVMessageQueue(int sysno) {
791   switch (sysno) {
792     case __NR_msgctl:
793     case __NR_msgget:
794     case __NR_msgrcv:
795     case __NR_msgsnd:
796       return true;
797     default:
798       return false;
799   }
800 }
801 #endif
802
803 #if defined(__i386__) || defined(__mips__)
804 // Big system V multiplexing system call.
805 bool SyscallSets::IsSystemVIpc(int sysno) {
806   switch (sysno) {
807     case __NR_ipc:
808       return true;
809     default:
810       return false;
811   }
812 }
813 #endif
814
815 bool SyscallSets::IsAnySystemV(int sysno) {
816 #if defined(__x86_64__) || defined(__arm__)
817   return IsSystemVMessageQueue(sysno) || IsSystemVSemaphores(sysno) ||
818          IsSystemVSharedMemory(sysno);
819 #elif defined(__i386__) || defined(__mips__)
820   return IsSystemVIpc(sysno);
821 #endif
822 }
823
824 bool SyscallSets::IsAdvancedScheduler(int sysno) {
825   switch (sysno) {
826     case __NR_ioprio_get:  // IO scheduler.
827     case __NR_ioprio_set:
828     case __NR_sched_get_priority_max:
829     case __NR_sched_get_priority_min:
830     case __NR_sched_getaffinity:
831     case __NR_sched_getparam:
832     case __NR_sched_getscheduler:
833     case __NR_sched_rr_get_interval:
834     case __NR_sched_setaffinity:
835     case __NR_sched_setparam:
836     case __NR_sched_setscheduler:
837       return true;
838     default:
839       return false;
840   }
841 }
842
843 bool SyscallSets::IsInotify(int sysno) {
844   switch (sysno) {
845     case __NR_inotify_add_watch:
846     case __NR_inotify_init:
847     case __NR_inotify_init1:
848     case __NR_inotify_rm_watch:
849       return true;
850     default:
851       return false;
852   }
853 }
854
855 bool SyscallSets::IsFaNotify(int sysno) {
856   switch (sysno) {
857     case __NR_fanotify_init:
858     case __NR_fanotify_mark:
859       return true;
860     default:
861       return false;
862   }
863 }
864
865 bool SyscallSets::IsTimer(int sysno) {
866   switch (sysno) {
867     case __NR_getitimer:
868 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
869     case __NR_alarm:
870 #endif
871     case __NR_setitimer:
872       return true;
873     default:
874       return false;
875   }
876 }
877
878 bool SyscallSets::IsAdvancedTimer(int sysno) {
879   switch (sysno) {
880     case __NR_timer_create:
881     case __NR_timer_delete:
882     case __NR_timer_getoverrun:
883     case __NR_timer_gettime:
884     case __NR_timer_settime:
885     case __NR_timerfd_create:
886     case __NR_timerfd_gettime:
887     case __NR_timerfd_settime:
888       return true;
889     default:
890       return false;
891   }
892 }
893
894 bool SyscallSets::IsExtendedAttributes(int sysno) {
895   switch (sysno) {
896     case __NR_fgetxattr:
897     case __NR_flistxattr:
898     case __NR_fremovexattr:
899     case __NR_fsetxattr:
900     case __NR_getxattr:
901     case __NR_lgetxattr:
902     case __NR_listxattr:
903     case __NR_llistxattr:
904     case __NR_lremovexattr:
905     case __NR_lsetxattr:
906     case __NR_removexattr:
907     case __NR_setxattr:
908       return true;
909     default:
910       return false;
911   }
912 }
913
914 // Various system calls that need to be researched.
915 // TODO(jln): classify this better.
916 bool SyscallSets::IsMisc(int sysno) {
917   switch (sysno) {
918     case __NR_name_to_handle_at:
919     case __NR_open_by_handle_at:
920     case __NR_perf_event_open:
921     case __NR_syncfs:
922     case __NR_vhangup:
923 // The system calls below are not implemented.
924 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
925     case __NR_afs_syscall:
926 #endif
927 #if defined(__i386__) || defined(__mips__)
928     case __NR_break:
929 #endif
930 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
931     case __NR_getpmsg:
932 #endif
933 #if defined(__i386__) || defined(__mips__)
934     case __NR_gtty:
935     case __NR_idle:
936     case __NR_lock:
937     case __NR_mpx:
938     case __NR_prof:
939     case __NR_profil:
940 #endif
941 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
942     case __NR_putpmsg:
943 #endif
944 #if defined(__x86_64__)
945     case __NR_security:
946 #endif
947 #if defined(__i386__) || defined(__mips__)
948     case __NR_stty:
949 #endif
950 #if defined(__x86_64__)
951     case __NR_tuxcall:
952 #endif
953     case __NR_vserver:
954       return true;
955     default:
956       return false;
957   }
958 }
959
960 #if defined(__arm__)
961 bool SyscallSets::IsArmPciConfig(int sysno) {
962   switch (sysno) {
963     case __NR_pciconfig_iobase:
964     case __NR_pciconfig_read:
965     case __NR_pciconfig_write:
966       return true;
967     default:
968       return false;
969   }
970 }
971
972 bool SyscallSets::IsArmPrivate(int sysno) {
973   switch (sysno) {
974     case __ARM_NR_breakpoint:
975     case __ARM_NR_cacheflush:
976     case __ARM_NR_set_tls:
977     case __ARM_NR_usr26:
978     case __ARM_NR_usr32:
979       return true;
980     default:
981       return false;
982   }
983 }
984 #endif  // defined(__arm__)
985
986 #if defined(__mips__)
987 bool SyscallSets::IsMipsPrivate(int sysno) {
988   switch (sysno) {
989     case __NR_cacheflush:
990     case __NR_cachectl:
991       return true;
992     default:
993       return false;
994   }
995 }
996
997 bool SyscallSets::IsMipsMisc(int sysno) {
998   switch (sysno) {
999     case __NR_sysmips:
1000     case __NR_unused150:
1001       return true;
1002     default:
1003       return false;
1004   }
1005 }
1006 #endif  // defined(__mips__)
1007 }  // namespace sandbox.