| #!/usr/bin/awk -f |
| |
| #===-- generate_netbsd_syscalls.awk ----------------------------------------===# |
| # |
| # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| # See https://llvm.org/LICENSE.txt for license information. |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| # |
| #===------------------------------------------------------------------------===# |
| # |
| # This file is a generator of: |
| # - include/sanitizer/netbsd_syscall_hooks.h |
| # - lib/sanitizer_common/sanitizer_syscalls_netbsd.inc |
| # |
| # This script accepts on the input syscalls.master by default located in the |
| # /usr/src/sys/kern/syscalls.master path in the NetBSD distribution. |
| # |
| # NetBSD version 8.0. |
| # |
| #===------------------------------------------------------------------------===# |
| |
| BEGIN { |
| # harcode the script name |
| script_name = "generate_netbsd_syscalls.awk" |
| outputh = "../include/sanitizer/netbsd_syscall_hooks.h" |
| outputinc = "../lib/sanitizer_common/sanitizer_syscalls_netbsd.inc" |
| |
| # assert that we are in the directory with scripts |
| in_utils = system("test -f " script_name " && exit 1 || exit 0") |
| if (in_utils == 0) { |
| usage() |
| } |
| |
| # assert 1 argument passed |
| if (ARGC != 2) { |
| usage() |
| } |
| |
| # assert argument is a valid file path to syscall.master |
| if (system("test -f " ARGV[1]) != 0) { |
| usage() |
| } |
| |
| # sanity check that the path ends with "syscall.master" |
| if (ARGV[1] !~ /syscalls\.master$/) { |
| usage() |
| } |
| |
| # accept overloading CLANGFORMAT from environment |
| clangformat = "clang-format" |
| if ("CLANGFORMAT" in ENVIRON) { |
| clangformat = ENVIRON["CLANGFORMAT"] |
| } |
| |
| # parsing specific symbols |
| parsingheader=1 |
| |
| parsedsyscalls=0 |
| |
| # Hardcoded in algorithm |
| SYS_MAXSYSARGS=8 |
| } |
| |
| # Parse the RCS ID from syscall.master |
| parsingheader == 1 && NR == 1 { |
| if (match($0, /\$[^$]+\$/)) { |
| # trim initial 'NetBSD: ' and trailing ' $' |
| syscallmasterversion = substr($0, RSTART + 9, RLENGTH - 11) |
| } else { |
| # wrong file? |
| usage() |
| } |
| } |
| |
| # skip the following lines |
| # - empty |
| NF == 0 { |
| next |
| } |
| # - comment |
| $1 == ";" { |
| next |
| } |
| |
| # separator between the header and table with syscalls |
| $0 == "%%" { |
| parsingheader = 0 |
| next |
| } |
| |
| # preserve 'if/elif/else/endif' C preprocessor as-is |
| parsingheader == 0 && $0 ~ /^#/ { |
| if (parsedsyscalls in ifelifelseendif) { |
| ifelifelseendif[parsedsyscalls] = ifelifelseendif[parsedsyscalls] "\n" $0 |
| } else { |
| ifelifelseendif[parsedsyscalls] = $0 |
| } |
| next |
| } |
| |
| # parsing of syscall definitions |
| parsingheader == 0 && $1 ~ /^[0-9]+$/ { |
| # first join multiple lines into single one |
| while (sub(/\\$/, "")) { |
| getline line |
| $0 = $0 "" line |
| } |
| |
| # Skip unwanted syscalls |
| skip=0 |
| if ($0 ~ /OBSOL/ || $0 ~ /EXCL/ || $0 ~ /UNIMPL/) { |
| skip=1 |
| } |
| |
| # Compose the syscall name |
| # - compat? |
| compat="" |
| if (match($0, /COMPAT_[0-9]+/)) { |
| compat = tolower(substr($0, RSTART, RLENGTH)) |
| } |
| # - alias name? |
| alias="" |
| if ($(NF) != "}" && !skip) { |
| alias = alias "" $(NF) |
| } |
| # - compat version? |
| compatver="" |
| if (match($0, /\|[0-9]+\|/)) { |
| compatver = tolower(substr($0, RSTART + 1, RLENGTH - 2)) |
| } |
| # - basename? |
| basename="" |
| if (skip) { |
| basename = $1 |
| } else { |
| if (match($0, /\|[_a-z0-9]+\(/)) { |
| basename = tolower(substr($0, RSTART + 1, RLENGTH - 2)) |
| } |
| } |
| |
| syscallname="" |
| |
| if (skip) { |
| syscallname= syscallname "$" |
| } |
| |
| if (length(compat) > 0) { |
| syscallname = syscallname "" compat "_" |
| } |
| if (length(alias) > 0) { |
| syscallname = syscallname "" alias |
| } else { |
| if (length(compatver) > 0) { |
| syscallname = syscallname "__" basename "" compatver |
| } else { |
| syscallname = syscallname "" basename |
| } |
| } |
| |
| # Store the syscallname |
| syscalls[parsedsyscalls]=syscallname |
| |
| # Extract syscall arguments |
| if (match($0, /\([^)]+\)/)) { |
| args = substr($0, RSTART + 1, RLENGTH - 2) |
| |
| if (args == "void") { |
| syscallargs[parsedsyscalls] = "void" |
| syscallfullargs[parsedsyscalls] = "void" |
| } else { |
| # Normalize 'type * argument' to 'type *argument' |
| gsub("\\*[ \t]+", "*", args) |
| |
| n = split(args, a, ",") |
| |
| # Handle the first argument |
| match(a[1], /[*_a-z0-9\[\]]+$/) |
| syscallfullargs[parsedsyscalls] = substr(a[1], RSTART) "_" |
| |
| gsub(".+[ *]", "", a[1]) |
| syscallargs[parsedsyscalls] = a[1] |
| |
| # Handle the rest of arguments |
| for (i = 2; i <= n; i++) { |
| match(a[i], /[*_a-zA-Z0-9\[\]]+$/) |
| fs = substr(a[i], RSTART) |
| if (fs ~ /\[/) { |
| sub(/\[/, "_[", fs) |
| } else { |
| fs = fs "_" |
| } |
| syscallfullargs[parsedsyscalls] = syscallfullargs[parsedsyscalls] "$" fs |
| gsub(".+[ *]", "", a[i]) |
| syscallargs[parsedsyscalls] = syscallargs[parsedsyscalls] "$" a[i] |
| } |
| |
| # Handle array arguments for syscall(2) and __syscall(2) |
| nargs = "arg0$arg1$arg2$arg3$arg4$arg5$arg6$arg7" |
| gsub(/args\[SYS_MAXSYSARGS\]/, nargs, syscallargs[parsedsyscalls]) |
| } |
| } |
| |
| parsedsyscalls++ |
| |
| # Done with this line |
| next |
| } |
| |
| |
| END { |
| # empty file? |
| if (NR < 1 && !abnormal_exit) { |
| usage() |
| } |
| |
| # Handle abnormal exit |
| if (abnormal_exit) { |
| exit(abnormal_exit) |
| } |
| |
| # Generate sanitizer_syscalls_netbsd.inc |
| |
| # open pipe |
| cmd = clangformat " > " outputh |
| |
| pcmd("//===-- netbsd_syscall_hooks.h --------------------------------------------===//") |
| pcmd("//") |
| pcmd("// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.") |
| pcmd("// See https://llvm.org/LICENSE.txt for license information.") |
| pcmd("// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception") |
| pcmd("//") |
| pcmd("//===----------------------------------------------------------------------===//") |
| pcmd("//") |
| pcmd("// This file is a part of public sanitizer interface.") |
| pcmd("//") |
| pcmd("// System call handlers.") |
| pcmd("//") |
| pcmd("// Interface methods declared in this header implement pre- and post- syscall") |
| pcmd("// actions for the active sanitizer.") |
| pcmd("// Usage:") |
| pcmd("// __sanitizer_syscall_pre_getfoo(...args...);") |
| pcmd("// long long res = syscall(SYS_getfoo, ...args...);") |
| pcmd("// __sanitizer_syscall_post_getfoo(res, ...args...);") |
| pcmd("//") |
| pcmd("// DO NOT EDIT! THIS FILE HAS BEEN GENERATED!") |
| pcmd("//") |
| pcmd("// Generated with: " script_name) |
| pcmd("// Generated date: " strftime("%F")) |
| pcmd("// Generated from: " syscallmasterversion) |
| pcmd("//") |
| pcmd("//===----------------------------------------------------------------------===//") |
| pcmd("#ifndef SANITIZER_NETBSD_SYSCALL_HOOKS_H") |
| pcmd("#define SANITIZER_NETBSD_SYSCALL_HOOKS_H") |
| pcmd("") |
| |
| for (i = 0; i < parsedsyscalls; i++) { |
| |
| if (i in ifelifelseendif) { |
| pcmd(ifelifelseendif[i]) |
| } |
| |
| sn = syscalls[i] |
| |
| if (sn ~ /^\$/) { |
| pcmd("/* syscall " substr(sn,2) " has been skipped */") |
| continue |
| } |
| |
| inargs = "" |
| |
| if (syscallargs[i] != "void") { |
| inargs = syscallargs[i] |
| gsub(/\$/, ", ", inargs) |
| } |
| |
| outargs = "" |
| |
| if (syscallargs[i] != "void") { |
| outargs = "(long long)(" syscallargs[i] ")" |
| gsub(/\$/, "), (long long)(", outargs) |
| } |
| |
| pcmd("#define __sanitizer_syscall_pre_" sn "(" inargs ") \\") |
| pcmd(" __sanitizer_syscall_pre_impl_" sn "(" outargs ")") |
| |
| if (inargs == "") { |
| inargs = "res" |
| } else { |
| inargs = "res, " inargs |
| } |
| |
| if (outargs == "") { |
| outargs = "res" |
| } else { |
| outargs = "res, " outargs |
| } |
| |
| pcmd("#define __sanitizer_syscall_post_" sn "(" inargs ") \\") |
| pcmd(" __sanitizer_syscall_post_impl_" sn "(" outargs ")") |
| } |
| |
| pcmd("") |
| pcmd("#ifdef __cplusplus") |
| pcmd("extern \"C\" {") |
| pcmd("#endif") |
| pcmd("") |
| pcmd("// Private declarations. Do not call directly from user code. Use macros above.") |
| pcmd("") |
| pcmd("// DO NOT EDIT! THIS FILE HAS BEEN GENERATED!") |
| pcmd("") |
| |
| for (i = 0; i < parsedsyscalls; i++) { |
| |
| if (i in ifelifelseendif) { |
| pcmd(ifelifelseendif[i]) |
| } |
| |
| sn = syscalls[i] |
| |
| if (sn ~ /^\$/) { |
| pcmd("/* syscall " substr(sn,2) " has been skipped */") |
| continue |
| } |
| |
| preargs = syscallargs[i] |
| |
| if (preargs != "void") { |
| preargs = "long long " preargs |
| gsub(/\$/, ", long long ", preargs) |
| } |
| |
| if (preargs == "void") { |
| postargs = "long long res" |
| } else { |
| postargs = "long long res, " preargs |
| } |
| |
| pcmd("void __sanitizer_syscall_pre_impl_" sn "(" preargs ");") |
| pcmd("void __sanitizer_syscall_post_impl_" sn "(" postargs ");") |
| } |
| |
| pcmd("") |
| pcmd("#ifdef __cplusplus") |
| pcmd("} // extern \"C\"") |
| pcmd("#endif") |
| |
| pcmd("") |
| pcmd("// DO NOT EDIT! THIS FILE HAS BEEN GENERATED!") |
| pcmd("") |
| |
| pcmd("#endif // SANITIZER_NETBSD_SYSCALL_HOOKS_H") |
| |
| close(cmd) |
| |
| # Generate sanitizer_syscalls_netbsd.inc |
| |
| # open pipe |
| cmd = clangformat " > " outputinc |
| |
| pcmd("//===-- sanitizer_syscalls_netbsd.inc ---------------------------*- C++ -*-===//") |
| pcmd("//") |
| pcmd("// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.") |
| pcmd("// See https://llvm.org/LICENSE.txt for license information.") |
| pcmd("// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception") |
| pcmd("//") |
| pcmd("//===----------------------------------------------------------------------===//") |
| pcmd("//") |
| pcmd("// Common syscalls handlers for tools like AddressSanitizer,") |
| pcmd("// ThreadSanitizer, MemorySanitizer, etc.") |
| pcmd("//") |
| pcmd("// This file should be included into the tool's interceptor file,") |
| pcmd("// which has to define it's own macros:") |
| pcmd("// COMMON_SYSCALL_PRE_READ_RANGE") |
| pcmd("// Called in prehook for regions that will be read by the kernel and") |
| pcmd("// must be initialized.") |
| pcmd("// COMMON_SYSCALL_PRE_WRITE_RANGE") |
| pcmd("// Called in prehook for regions that will be written to by the kernel") |
| pcmd("// and must be addressable. The actual write range may be smaller than") |
| pcmd("// reported in the prehook. See POST_WRITE_RANGE.") |
| pcmd("// COMMON_SYSCALL_POST_READ_RANGE") |
| pcmd("// Called in posthook for regions that were read by the kernel. Does") |
| pcmd("// not make much sense.") |
| pcmd("// COMMON_SYSCALL_POST_WRITE_RANGE") |
| pcmd("// Called in posthook for regions that were written to by the kernel") |
| pcmd("// and are now initialized.") |
| pcmd("// COMMON_SYSCALL_ACQUIRE(addr)") |
| pcmd("// Acquire memory visibility from addr.") |
| pcmd("// COMMON_SYSCALL_RELEASE(addr)") |
| pcmd("// Release memory visibility to addr.") |
| pcmd("// COMMON_SYSCALL_FD_CLOSE(fd)") |
| pcmd("// Called before closing file descriptor fd.") |
| pcmd("// COMMON_SYSCALL_FD_ACQUIRE(fd)") |
| pcmd("// Acquire memory visibility from fd.") |
| pcmd("// COMMON_SYSCALL_FD_RELEASE(fd)") |
| pcmd("// Release memory visibility to fd.") |
| pcmd("// COMMON_SYSCALL_PRE_FORK()") |
| pcmd("// Called before fork syscall.") |
| pcmd("// COMMON_SYSCALL_POST_FORK(long long res)") |
| pcmd("// Called after fork syscall.") |
| pcmd("//") |
| pcmd("// DO NOT EDIT! THIS FILE HAS BEEN GENERATED!") |
| pcmd("//") |
| pcmd("// Generated with: " script_name) |
| pcmd("// Generated date: " strftime("%F")) |
| pcmd("// Generated from: " syscallmasterversion) |
| pcmd("//") |
| pcmd("//===----------------------------------------------------------------------===//") |
| pcmd("") |
| pcmd("#include \"sanitizer_platform.h\"") |
| pcmd("#if SANITIZER_NETBSD") |
| pcmd("") |
| pcmd("#include \"sanitizer_libc.h\"") |
| pcmd("") |
| pcmd("#define PRE_SYSCALL(name) \\") |
| pcmd(" SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_syscall_pre_impl_##name") |
| pcmd("#define PRE_READ(p, s) COMMON_SYSCALL_PRE_READ_RANGE(p, s)") |
| pcmd("#define PRE_WRITE(p, s) COMMON_SYSCALL_PRE_WRITE_RANGE(p, s)") |
| pcmd("") |
| pcmd("#define POST_SYSCALL(name) \\") |
| pcmd(" SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_syscall_post_impl_##name") |
| pcmd("#define POST_READ(p, s) COMMON_SYSCALL_POST_READ_RANGE(p, s)") |
| pcmd("#define POST_WRITE(p, s) COMMON_SYSCALL_POST_WRITE_RANGE(p, s)") |
| pcmd("") |
| pcmd("#ifndef COMMON_SYSCALL_ACQUIRE") |
| pcmd("# define COMMON_SYSCALL_ACQUIRE(addr) ((void)(addr))") |
| pcmd("#endif") |
| pcmd("") |
| pcmd("#ifndef COMMON_SYSCALL_RELEASE") |
| pcmd("# define COMMON_SYSCALL_RELEASE(addr) ((void)(addr))") |
| pcmd("#endif") |
| pcmd("") |
| pcmd("#ifndef COMMON_SYSCALL_FD_CLOSE") |
| pcmd("# define COMMON_SYSCALL_FD_CLOSE(fd) ((void)(fd))") |
| pcmd("#endif") |
| pcmd("") |
| pcmd("#ifndef COMMON_SYSCALL_FD_ACQUIRE") |
| pcmd("# define COMMON_SYSCALL_FD_ACQUIRE(fd) ((void)(fd))") |
| pcmd("#endif") |
| pcmd("") |
| pcmd("#ifndef COMMON_SYSCALL_FD_RELEASE") |
| pcmd("# define COMMON_SYSCALL_FD_RELEASE(fd) ((void)(fd))") |
| pcmd("#endif") |
| pcmd("") |
| pcmd("#ifndef COMMON_SYSCALL_PRE_FORK") |
| pcmd("# define COMMON_SYSCALL_PRE_FORK() {}") |
| pcmd("#endif") |
| pcmd("") |
| pcmd("#ifndef COMMON_SYSCALL_POST_FORK") |
| pcmd("# define COMMON_SYSCALL_POST_FORK(res) {}") |
| pcmd("#endif") |
| pcmd("") |
| pcmd("// FIXME: do some kind of PRE_READ for all syscall arguments (int(s) and such).") |
| pcmd("") |
| pcmd("extern \"C\" {") |
| pcmd("#define SYS_MAXSYSARGS " SYS_MAXSYSARGS) |
| |
| for (i = 0; i < parsedsyscalls; i++) { |
| |
| if (i in ifelifelseendif) { |
| pcmd(ifelifelseendif[i]) |
| } |
| |
| sn = syscalls[i] |
| |
| if (sn ~ /^\$/) { |
| pcmd("/* syscall " substr(sn,2) " has been skipped */") |
| continue |
| } |
| |
| preargs = syscallfullargs[i] |
| |
| if (preargs != "void") { |
| preargs = "long long " preargs |
| gsub(/\$/, ", long long ", preargs) |
| gsub(/long long \*/, "void *", preargs) |
| } |
| |
| if (preargs == "void") { |
| postargs = "long long res" |
| } else { |
| postargs = "long long res, " preargs |
| } |
| |
| pcmd("PRE_SYSCALL(" sn ")(" preargs ")") |
| pcmd("{") |
| syscall_body(sn, "pre") |
| pcmd("}") |
| |
| pcmd("POST_SYSCALL(" sn ")(" postargs ")") |
| pcmd("{") |
| syscall_body(sn, "post") |
| pcmd("}") |
| } |
| |
| pcmd("#undef SYS_MAXSYSARGS") |
| pcmd("} // extern \"C\"") |
| pcmd("") |
| pcmd("#undef PRE_SYSCALL") |
| pcmd("#undef PRE_READ") |
| pcmd("#undef PRE_WRITE") |
| pcmd("#undef POST_SYSCALL") |
| pcmd("#undef POST_READ") |
| pcmd("#undef POST_WRITE") |
| pcmd("") |
| pcmd("#endif // SANITIZER_NETBSD") |
| |
| close(cmd) |
| |
| # Hack for preprocessed code |
| system("sed -i 's,^ \\([^ ]\\), \\1,' " outputinc) |
| } |
| |
| function usage() |
| { |
| print "Usage: " script_name " syscalls.master" |
| abnormal_exit = 1 |
| exit 1 |
| } |
| |
| function pcmd(string) |
| { |
| print string | cmd |
| } |
| |
| function syscall_body(syscall, mode) |
| { |
| # Hardcode sanitizing rules here |
| # These syscalls don't change often so they are hand coded |
| if (syscall == "syscall") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "exit") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "fork") { |
| if (mode == "pre") { |
| pcmd("COMMON_SYSCALL_PRE_FORK();") |
| } else { |
| pcmd("COMMON_SYSCALL_POST_FORK(res);") |
| } |
| } else if (syscall == "read") { |
| if (mode == "pre") { |
| pcmd("if (buf_) {") |
| pcmd(" PRE_WRITE(buf_, nbyte_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res > 0) {") |
| pcmd(" POST_WRITE(buf_, res);") |
| pcmd("}") |
| } |
| } else if (syscall == "write") { |
| if (mode == "pre") { |
| pcmd("if (buf_) {") |
| pcmd(" PRE_READ(buf_, nbyte_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res > 0) {") |
| pcmd(" POST_READ(buf_, res);") |
| pcmd("}") |
| } |
| } else if (syscall == "open") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res > 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "close") { |
| if (mode == "pre") { |
| pcmd("COMMON_SYSCALL_FD_CLOSE((int)fd_);") |
| } else { |
| pcmd("/* Nothing to do */") |
| } |
| } else if (syscall == "compat_50_wait4") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_ocreat") { |
| pcmd("/* TODO */") |
| } else if (syscall == "link") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("const char *link = (const char *)link_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| pcmd("if (link) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(link) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" const char *link = (const char *)link_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd(" if (link) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(link) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "unlink") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "chdir") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "fchdir") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_50_mknod") { |
| pcmd("/* TODO */") |
| } else if (syscall == "chmod") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "chown") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "break") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_20_getfsstat") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_olseek") { |
| pcmd("/* TODO */") |
| } else if (syscall == "getpid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_40_mount") { |
| pcmd("/* TODO */") |
| } else if (syscall == "unmount") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "setuid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "getuid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "geteuid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "ptrace") { |
| if (mode == "pre") { |
| pcmd("if (req_ == ptrace_pt_io) {") |
| pcmd(" struct __sanitizer_ptrace_io_desc *addr = (struct __sanitizer_ptrace_io_desc *)addr_;") |
| pcmd(" PRE_READ(addr, struct_ptrace_ptrace_io_desc_struct_sz);") |
| pcmd(" if (addr->piod_op == ptrace_piod_write_d || addr->piod_op == ptrace_piod_write_i) {") |
| pcmd(" PRE_READ(addr->piod_addr, addr->piod_len);") |
| pcmd(" }") |
| pcmd(" if (addr->piod_op == ptrace_piod_read_d || addr->piod_op == ptrace_piod_read_i || addr->piod_op == ptrace_piod_read_auxv) {") |
| pcmd(" PRE_WRITE(addr->piod_addr, addr->piod_len);") |
| pcmd(" }") |
| pcmd("} else if (req_ == ptrace_pt_lwpinfo) {") |
| pcmd(" struct __sanitizer_ptrace_lwpinfo *addr = (struct __sanitizer_ptrace_lwpinfo *)addr_;") |
| pcmd(" PRE_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t));") |
| pcmd(" PRE_WRITE(addr, struct_ptrace_ptrace_lwpinfo_struct_sz);") |
| pcmd("} else if (req_ == ptrace_pt_set_event_mask) {") |
| pcmd(" PRE_READ(addr_, struct_ptrace_ptrace_event_struct_sz);") |
| pcmd("} else if (req_ == ptrace_pt_get_event_mask) {") |
| pcmd(" PRE_WRITE(addr_, struct_ptrace_ptrace_event_struct_sz);") |
| pcmd("} else if (req_ == ptrace_pt_set_siginfo) {") |
| pcmd(" PRE_READ(addr_, struct_ptrace_ptrace_siginfo_struct_sz);") |
| pcmd("} else if (req_ == ptrace_pt_get_siginfo) {") |
| pcmd(" PRE_WRITE(addr_, struct_ptrace_ptrace_siginfo_struct_sz);") |
| pcmd("} else if (req_ == ptrace_pt_setregs) {") |
| pcmd(" PRE_READ(addr_, struct_ptrace_reg_struct_sz);") |
| pcmd("} else if (req_ == ptrace_pt_getregs) {") |
| pcmd(" PRE_WRITE(addr_, struct_ptrace_reg_struct_sz);") |
| pcmd("} else if (req_ == ptrace_pt_setfpregs) {") |
| pcmd(" PRE_READ(addr_, struct_ptrace_fpreg_struct_sz);") |
| pcmd("} else if (req_ == ptrace_pt_getfpregs) {") |
| pcmd(" PRE_WRITE(addr_, struct_ptrace_fpreg_struct_sz);") |
| pcmd("} else if (req_ == ptrace_pt_setdbregs) {") |
| pcmd(" PRE_READ(addr_, struct_ptrace_dbreg_struct_sz);") |
| pcmd("} else if (req_ == ptrace_pt_getdbregs) {") |
| pcmd(" PRE_WRITE(addr_, struct_ptrace_dbreg_struct_sz);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" if (req_ == ptrace_pt_io) {") |
| pcmd(" struct __sanitizer_ptrace_io_desc *addr = (struct __sanitizer_ptrace_io_desc *)addr_;") |
| pcmd(" POST_READ(addr, struct_ptrace_ptrace_io_desc_struct_sz);") |
| pcmd(" if (addr->piod_op == ptrace_piod_write_d || addr->piod_op == ptrace_piod_write_i) {") |
| pcmd(" POST_READ(addr->piod_addr, addr->piod_len);") |
| pcmd(" }") |
| pcmd(" if (addr->piod_op == ptrace_piod_read_d || addr->piod_op == ptrace_piod_read_i || addr->piod_op == ptrace_piod_read_auxv) {") |
| pcmd(" POST_WRITE(addr->piod_addr, addr->piod_len);") |
| pcmd(" }") |
| pcmd(" } else if (req_ == ptrace_pt_lwpinfo) {") |
| pcmd(" struct __sanitizer_ptrace_lwpinfo *addr = (struct __sanitizer_ptrace_lwpinfo *)addr_;") |
| pcmd(" POST_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t));") |
| pcmd(" POST_WRITE(addr, struct_ptrace_ptrace_lwpinfo_struct_sz);") |
| pcmd(" } else if (req_ == ptrace_pt_set_event_mask) {") |
| pcmd(" POST_READ(addr_, struct_ptrace_ptrace_event_struct_sz);") |
| pcmd(" } else if (req_ == ptrace_pt_get_event_mask) {") |
| pcmd(" POST_WRITE(addr_, struct_ptrace_ptrace_event_struct_sz);") |
| pcmd(" } else if (req_ == ptrace_pt_set_siginfo) {") |
| pcmd(" POST_READ(addr_, struct_ptrace_ptrace_siginfo_struct_sz);") |
| pcmd(" } else if (req_ == ptrace_pt_get_siginfo) {") |
| pcmd(" POST_WRITE(addr_, struct_ptrace_ptrace_siginfo_struct_sz);") |
| pcmd(" } else if (req_ == ptrace_pt_setregs) {") |
| pcmd(" POST_READ(addr_, struct_ptrace_reg_struct_sz);") |
| pcmd(" } else if (req_ == ptrace_pt_getregs) {") |
| pcmd(" POST_WRITE(addr_, struct_ptrace_reg_struct_sz);") |
| pcmd(" } else if (req_ == ptrace_pt_setfpregs) {") |
| pcmd(" POST_READ(addr_, struct_ptrace_fpreg_struct_sz);") |
| pcmd(" } else if (req_ == ptrace_pt_getfpregs) {") |
| pcmd(" POST_WRITE(addr_, struct_ptrace_fpreg_struct_sz);") |
| pcmd(" } else if (req_ == ptrace_pt_setdbregs) {") |
| pcmd(" POST_READ(addr_, struct_ptrace_dbreg_struct_sz);") |
| pcmd(" } else if (req_ == ptrace_pt_getdbregs) {") |
| pcmd(" POST_WRITE(addr_, struct_ptrace_dbreg_struct_sz);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "recvmsg") { |
| if (mode == "pre") { |
| pcmd("PRE_WRITE(msg_, sizeof(__sanitizer_msghdr));") |
| } else { |
| pcmd("if (res > 0) {") |
| pcmd(" POST_WRITE(msg_, sizeof(__sanitizer_msghdr));") |
| pcmd("}") |
| } |
| } else if (syscall == "sendmsg") { |
| if (mode == "pre") { |
| pcmd("PRE_READ(msg_, sizeof(__sanitizer_msghdr));") |
| } else { |
| pcmd("if (res > 0) {") |
| pcmd(" POST_READ(msg_, sizeof(__sanitizer_msghdr));") |
| pcmd("}") |
| } |
| } else if (syscall == "recvfrom") { |
| if (mode == "pre") { |
| pcmd("PRE_WRITE(buf_, len_);") |
| pcmd("PRE_WRITE(from_, struct_sockaddr_sz);") |
| pcmd("PRE_WRITE(fromlenaddr_, sizeof(__sanitizer_socklen_t));") |
| } else { |
| pcmd("if (res >= 0) {") |
| pcmd(" POST_WRITE(buf_, res);") |
| pcmd(" POST_WRITE(from_, struct_sockaddr_sz);") |
| pcmd(" POST_WRITE(fromlenaddr_, sizeof(__sanitizer_socklen_t));") |
| pcmd("}") |
| } |
| } else if (syscall == "accept") { |
| if (mode == "pre") { |
| pcmd("PRE_WRITE(name_, struct_sockaddr_sz);") |
| pcmd("PRE_WRITE(anamelen_, sizeof(__sanitizer_socklen_t));") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" POST_WRITE(name_, struct_sockaddr_sz);") |
| pcmd(" POST_WRITE(anamelen_, sizeof(__sanitizer_socklen_t));") |
| pcmd("}") |
| } |
| } else if (syscall == "getpeername") { |
| if (mode == "pre") { |
| pcmd("PRE_WRITE(asa_, struct_sockaddr_sz);") |
| pcmd("PRE_WRITE(alen_, sizeof(__sanitizer_socklen_t));") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" POST_WRITE(asa_, struct_sockaddr_sz);") |
| pcmd(" POST_WRITE(alen_, sizeof(__sanitizer_socklen_t));") |
| pcmd("}") |
| } |
| } else if (syscall == "getsockname") { |
| if (mode == "pre") { |
| pcmd("PRE_WRITE(asa_, struct_sockaddr_sz);") |
| pcmd("PRE_WRITE(alen_, sizeof(__sanitizer_socklen_t));") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" POST_WRITE(asa_, struct_sockaddr_sz);") |
| pcmd(" POST_WRITE(alen_, sizeof(__sanitizer_socklen_t));") |
| pcmd("}") |
| } |
| } else if (syscall == "access") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "chflags") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "fchflags") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "sync") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "kill") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_43_stat43") { |
| pcmd("/* TODO */") |
| } else if (syscall == "getppid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_43_lstat43") { |
| pcmd("/* TODO */") |
| } else if (syscall == "dup") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "pipe") { |
| pcmd("/* pipe returns two descriptors through two returned values */") |
| } else if (syscall == "getegid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "profil") { |
| if (mode == "pre") { |
| pcmd("if (samples_) {") |
| pcmd(" PRE_WRITE(samples_, size_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" if (samples_) {") |
| pcmd(" POST_WRITE(samples_, size_);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "ktrace") { |
| if (mode == "pre") { |
| pcmd("const char *fname = (const char *)fname_;") |
| pcmd("if (fname) {") |
| pcmd(" PRE_READ(fname, __sanitizer::internal_strlen(fname) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *fname = (const char *)fname_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (fname) {") |
| pcmd(" POST_READ(fname, __sanitizer::internal_strlen(fname) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_13_sigaction13") { |
| pcmd("/* TODO */") |
| } else if (syscall == "getgid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_13_sigprocmask13") { |
| pcmd("/* TODO */") |
| } else if (syscall == "__getlogin") { |
| if (mode == "pre") { |
| pcmd("if (namebuf_) {") |
| pcmd(" PRE_WRITE(namebuf_, namelen_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" if (namebuf_) {") |
| pcmd(" POST_WRITE(namebuf_, namelen_);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "__setlogin") { |
| if (mode == "pre") { |
| pcmd("const char *namebuf = (const char *)namebuf_;") |
| pcmd("if (namebuf) {") |
| pcmd(" PRE_READ(namebuf, __sanitizer::internal_strlen(namebuf) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *namebuf = (const char *)namebuf_;") |
| pcmd(" if (namebuf) {") |
| pcmd(" POST_READ(namebuf, __sanitizer::internal_strlen(namebuf) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "acct") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_13_sigpending13") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_13_sigaltstack13") { |
| pcmd("/* TODO */") |
| } else if (syscall == "ioctl") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_12_oreboot") { |
| pcmd("/* TODO */") |
| } else if (syscall == "revoke") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "symlink") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("const char *link = (const char *)link_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| pcmd("if (link) {") |
| pcmd(" PRE_READ(link, __sanitizer::internal_strlen(link) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" const char *link = (const char *)link_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd(" if (link) {") |
| pcmd(" POST_READ(link, __sanitizer::internal_strlen(link) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "readlink") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| pcmd("if (buf_) {") |
| pcmd(" PRE_WRITE(buf_, count_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res > 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd(" if (buf_) {") |
| pcmd(" PRE_WRITE(buf_, res);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "execve") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("char **argp = (char **)argp_;") |
| pcmd("char **envp = (char **)envp_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| pcmd("if (argp && argp[0]) {") |
| pcmd(" char *a = argp[0];") |
| pcmd(" while (a++) {") |
| pcmd(" PRE_READ(a, __sanitizer::internal_strlen(a) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| pcmd("if (envp && envp[0]) {") |
| pcmd(" char *e = envp[0];") |
| pcmd(" while (e++) {") |
| pcmd(" PRE_READ(e, __sanitizer::internal_strlen(e) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } else { |
| pcmd("/* If we are here, something went wrong */") |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("char **argp = (char **)argp_;") |
| pcmd("char **envp = (char **)envp_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| pcmd("if (argp && argp[0]) {") |
| pcmd(" char *a = argp[0];") |
| pcmd(" while (a++) {") |
| pcmd(" POST_READ(a, __sanitizer::internal_strlen(a) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| pcmd("if (envp && envp[0]) {") |
| pcmd(" char *e = envp[0];") |
| pcmd(" while (e++) {") |
| pcmd(" POST_READ(e, __sanitizer::internal_strlen(e) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "umask") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "chroot") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_43_fstat43") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_ogetkerninfo") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_ogetpagesize") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_12_msync") { |
| pcmd("/* TODO */") |
| } else if (syscall == "vfork") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_43_ommap") { |
| pcmd("/* TODO */") |
| } else if (syscall == "vadvise") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "munmap") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "mprotect") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "madvise") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "mincore") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "getgroups") { |
| if (mode == "pre") { |
| pcmd("unsigned int *gidset = (unsigned int *)gidset_;") |
| pcmd("if (gidset) {") |
| pcmd(" PRE_WRITE(gidset, sizeof(*gidset) * gidsetsize_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" unsigned int *gidset = (unsigned int *)gidset_;") |
| pcmd(" if (gidset) {") |
| pcmd(" POST_WRITE(gidset, sizeof(*gidset) * gidsetsize_);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "setgroups") { |
| if (mode == "pre") { |
| pcmd("unsigned int *gidset = (unsigned int *)gidset_;") |
| pcmd("if (gidset) {") |
| pcmd(" PRE_READ(gidset, sizeof(*gidset) * gidsetsize_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" unsigned int *gidset = (unsigned int *)gidset_;") |
| pcmd(" if (gidset) {") |
| pcmd(" POST_READ(gidset, sizeof(*gidset) * gidsetsize_);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "getpgrp") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "setpgid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_50_setitimer") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_owait") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_12_oswapon") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50_getitimer") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_ogethostname") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_osethostname") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_ogetdtablesize") { |
| pcmd("/* TODO */") |
| } else if (syscall == "dup2") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "fcntl") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_50_select") { |
| pcmd("/* TODO */") |
| } else if (syscall == "fsync") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "setpriority") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_30_socket") { |
| pcmd("/* TODO */") |
| } else if (syscall == "connect") { |
| if (mode == "pre") { |
| pcmd("PRE_READ(name_, namelen_);") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" POST_READ(name_, namelen_);") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_43_oaccept") { |
| pcmd("/* TODO */") |
| } else if (syscall == "getpriority") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_43_osend") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_orecv") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_13_sigreturn13") { |
| pcmd("/* TODO */") |
| } else if (syscall == "bind") { |
| if (mode == "pre") { |
| pcmd("PRE_READ(name_, namelen_);") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" PRE_READ(name_, namelen_);") |
| pcmd("}") |
| } |
| } else if (syscall == "setsockopt") { |
| if (mode == "pre") { |
| pcmd("if (val_) {") |
| pcmd(" PRE_READ(val_, valsize_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" if (val_) {") |
| pcmd(" POST_READ(val_, valsize_);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "listen") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_43_osigvec") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_osigblock") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_osigsetmask") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_13_sigsuspend13") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_osigstack") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_orecvmsg") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_osendmsg") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50_gettimeofday") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50_getrusage") { |
| pcmd("/* TODO */") |
| } else if (syscall == "getsockopt") { |
| pcmd("/* TODO */") |
| } else if (syscall == "readv") { |
| if (mode == "pre") { |
| pcmd("struct __sanitizer_iovec *iovp = (struct __sanitizer_iovec *)iovp_;") |
| pcmd("int i;") |
| pcmd("if (iovp) {") |
| pcmd(" PRE_READ(iovp, sizeof(struct __sanitizer_iovec) * iovcnt_);") |
| pcmd(" for (i = 0; i < iovcnt_; i++) {") |
| pcmd(" PRE_WRITE(iovp[i].iov_base, iovp[i].iov_len);") |
| pcmd(" }") |
| pcmd("}") |
| } else { |
| pcmd("struct __sanitizer_iovec *iovp = (struct __sanitizer_iovec *)iovp_;") |
| pcmd("int i;") |
| pcmd("uptr m, n = res;") |
| pcmd("if (res > 0) {") |
| pcmd(" if (iovp) {") |
| pcmd(" POST_READ(iovp, sizeof(struct __sanitizer_iovec) * iovcnt_);") |
| pcmd(" for (i = 0; i < iovcnt_ && n > 0; i++) {") |
| pcmd(" m = n > iovp[i].iov_len ? iovp[i].iov_len : n;") |
| pcmd(" POST_WRITE(iovp[i].iov_base, m);") |
| pcmd(" n -= m;") |
| pcmd(" }") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "writev") { |
| if (mode == "pre") { |
| pcmd("struct __sanitizer_iovec *iovp = (struct __sanitizer_iovec *)iovp_;") |
| pcmd("int i;") |
| pcmd("if (iovp) {") |
| pcmd(" PRE_READ(iovp, sizeof(struct __sanitizer_iovec) * iovcnt_);") |
| pcmd(" for (i = 0; i < iovcnt_; i++) {") |
| pcmd(" PRE_READ(iovp[i].iov_base, iovp[i].iov_len);") |
| pcmd(" }") |
| pcmd("}") |
| } else { |
| pcmd("struct __sanitizer_iovec *iovp = (struct __sanitizer_iovec *)iovp_;") |
| pcmd("int i;") |
| pcmd("uptr m, n = res;") |
| pcmd("if (res > 0) {") |
| pcmd(" if (iovp) {") |
| pcmd(" POST_READ(iovp, sizeof(struct __sanitizer_iovec) * iovcnt_);") |
| pcmd(" for (i = 0; i < iovcnt_ && n > 0; i++) {") |
| pcmd(" m = n > iovp[i].iov_len ? iovp[i].iov_len : n;") |
| pcmd(" POST_READ(iovp[i].iov_base, m);") |
| pcmd(" n -= m;") |
| pcmd(" }") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_50_settimeofday") { |
| pcmd("/* TODO */") |
| } else if (syscall == "fchown") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "fchmod") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_43_orecvfrom") { |
| pcmd("/* TODO */") |
| } else if (syscall == "setreuid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "setregid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "rename") { |
| if (mode == "pre") { |
| pcmd("const char *from = (const char *)from_;") |
| pcmd("const char *to = (const char *)to_;") |
| pcmd("if (from) {") |
| pcmd(" PRE_READ(from, __sanitizer::internal_strlen(from) + 1);") |
| pcmd("}") |
| pcmd("if (to) {") |
| pcmd(" PRE_READ(to, __sanitizer::internal_strlen(to) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *from = (const char *)from_;") |
| pcmd(" const char *to = (const char *)to_;") |
| pcmd(" if (from) {") |
| pcmd(" POST_READ(from, __sanitizer::internal_strlen(from) + 1);") |
| pcmd(" }") |
| pcmd(" if (to) {") |
| pcmd(" POST_READ(to, __sanitizer::internal_strlen(to) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_43_otruncate") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_oftruncate") { |
| pcmd("/* TODO */") |
| } else if (syscall == "flock") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "mkfifo") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "sendto") { |
| if (mode == "pre") { |
| pcmd("PRE_READ(buf_, len_);") |
| pcmd("PRE_READ(to_, tolen_);") |
| } else { |
| pcmd("if (res >= 0) {") |
| pcmd(" POST_READ(buf_, len_);") |
| pcmd(" POST_READ(to_, tolen_);") |
| pcmd("}") |
| } |
| } else if (syscall == "shutdown") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "socketpair") { |
| if (mode == "pre") { |
| pcmd("PRE_WRITE(rsv_, 2 * sizeof(int));") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" POST_WRITE(rsv_, 2 * sizeof(int));") |
| pcmd("}") |
| } |
| } else if (syscall == "mkdir") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "rmdir") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_50_utimes") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50_adjtime") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_ogetpeername") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_ogethostid") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_osethostid") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_ogetrlimit") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_osetrlimit") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_okillpg") { |
| pcmd("/* TODO */") |
| } else if (syscall == "setsid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_50_quotactl") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_oquota") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_43_ogetsockname") { |
| pcmd("/* TODO */") |
| } else if (syscall == "nfssvc") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_43_ogetdirentries") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_20_statfs") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_20_fstatfs") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_30_getfh") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_09_ogetdomainname") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_09_osetdomainname") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_09_ouname") { |
| pcmd("/* TODO */") |
| } else if (syscall == "sysarch") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_10_osemsys") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_10_omsgsys") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_10_oshmsys") { |
| pcmd("/* TODO */") |
| } else if (syscall == "pread") { |
| if (mode == "pre") { |
| pcmd("if (buf_) {") |
| pcmd(" PRE_WRITE(buf_, nbyte_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res > 0) {") |
| pcmd(" POST_WRITE(buf_, res);") |
| pcmd("}") |
| } |
| } else if (syscall == "pwrite") { |
| if (mode == "pre") { |
| pcmd("if (buf_) {") |
| pcmd(" PRE_READ(buf_, nbyte_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res > 0) {") |
| pcmd(" POST_READ(buf_, res);") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_30_ntp_gettime") { |
| pcmd("/* TODO */") |
| } else if (syscall == "ntp_adjtime") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "setgid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "setegid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "seteuid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "lfs_bmapv") { |
| pcmd("/* TODO */") |
| } else if (syscall == "lfs_markv") { |
| pcmd("/* TODO */") |
| } else if (syscall == "lfs_segclean") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50_lfs_segwait") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_12_stat12") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_12_fstat12") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_12_lstat12") { |
| pcmd("/* TODO */") |
| } else if (syscall == "pathconf") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res != -1) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "getsockopt2") { |
| pcmd("/* TODO */") |
| } else if (syscall == "fpathconf") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "getrlimit") { |
| if (mode == "pre") { |
| pcmd("PRE_WRITE(rlp_, struct_rlimit_sz);") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" POST_WRITE(rlp_, struct_rlimit_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "setrlimit") { |
| if (mode == "pre") { |
| pcmd("PRE_READ(rlp_, struct_rlimit_sz);") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" POST_READ(rlp_, struct_rlimit_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_12_getdirentries") { |
| pcmd("/* TODO */") |
| } else if (syscall == "mmap") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__syscall") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "lseek") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "truncate") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "ftruncate") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__sysctl") { |
| if (mode == "pre") { |
| pcmd("const int *name = (const int *)name_;") |
| pcmd("if (name) {") |
| pcmd(" PRE_READ(name, namelen_ * sizeof(*name));") |
| pcmd("}") |
| pcmd("if (newv_) {") |
| pcmd(" PRE_READ(name, newlen_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const int *name = (const int *)name_;") |
| pcmd(" if (name) {") |
| pcmd(" POST_READ(name, namelen_ * sizeof(*name));") |
| pcmd(" }") |
| pcmd(" if (newv_) {") |
| pcmd(" POST_READ(name, newlen_);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "mlock") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "munlock") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "undelete") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" const char *path = (const char *)path_;") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_50_futimes") { |
| pcmd("/* TODO */") |
| } else if (syscall == "getpgid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "reboot") { |
| if (mode == "pre") { |
| pcmd("const char *bootstr = (const char *)bootstr_;") |
| pcmd("if (bootstr) {") |
| pcmd(" PRE_READ(bootstr, __sanitizer::internal_strlen(bootstr) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("/* This call should never return */") |
| pcmd("const char *bootstr = (const char *)bootstr_;") |
| pcmd("if (bootstr) {") |
| pcmd(" POST_READ(bootstr, __sanitizer::internal_strlen(bootstr) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "poll") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "afssys") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_14___semctl") { |
| pcmd("/* TODO */") |
| } else if (syscall == "semget") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "semop") { |
| if (mode == "pre") { |
| pcmd("if (sops_) {") |
| pcmd(" PRE_READ(sops_, nsops_ * struct_sembuf_sz);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" if (sops_) {") |
| pcmd(" POST_READ(sops_, nsops_ * struct_sembuf_sz);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "semconfig") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_14_msgctl") { |
| pcmd("/* TODO */") |
| } else if (syscall == "msgget") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "msgsnd") { |
| if (mode == "pre") { |
| pcmd("if (msgp_) {") |
| pcmd(" PRE_READ(msgp_, msgsz_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" if (msgp_) {") |
| pcmd(" POST_READ(msgp_, msgsz_);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "msgrcv") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "shmat") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_14_shmctl") { |
| pcmd("/* TODO */") |
| } else if (syscall == "shmdt") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "shmget") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_50_clock_gettime") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50_clock_settime") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50_clock_getres") { |
| pcmd("/* TODO */") |
| } else if (syscall == "timer_create") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "timer_delete") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_50_timer_settime") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50_timer_gettime") { |
| pcmd("/* TODO */") |
| } else if (syscall == "timer_getoverrun") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_50_nanosleep") { |
| pcmd("/* TODO */") |
| } else if (syscall == "fdatasync") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "mlockall") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "munlockall") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_50___sigtimedwait") { |
| pcmd("/* TODO */") |
| } else if (syscall == "sigqueueinfo") { |
| if (mode == "pre") { |
| pcmd("if (info_) {") |
| pcmd(" PRE_READ(info_, siginfo_t_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "modctl") { |
| pcmd("/* TODO */") |
| } else if (syscall == "_ksem_init") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_ksem_open") { |
| if (mode == "pre") { |
| pcmd("const char *name = (const char *)name_;") |
| pcmd("if (name) {") |
| pcmd(" PRE_READ(name, __sanitizer::internal_strlen(name) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *name = (const char *)name_;") |
| pcmd("if (name) {") |
| pcmd(" POST_READ(name, __sanitizer::internal_strlen(name) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "_ksem_unlink") { |
| if (mode == "pre") { |
| pcmd("const char *name = (const char *)name_;") |
| pcmd("if (name) {") |
| pcmd(" PRE_READ(name, __sanitizer::internal_strlen(name) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *name = (const char *)name_;") |
| pcmd("if (name) {") |
| pcmd(" POST_READ(name, __sanitizer::internal_strlen(name) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "_ksem_close") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_ksem_post") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_ksem_wait") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_ksem_trywait") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_ksem_getvalue") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_ksem_destroy") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_ksem_timedwait") { |
| if (mode == "pre") { |
| pcmd("if (abstime_) {") |
| pcmd(" PRE_READ(abstime_, struct_timespec_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "mq_open") { |
| if (mode == "pre") { |
| pcmd("const char *name = (const char *)name_;") |
| pcmd("if (name) {") |
| pcmd(" PRE_READ(name, __sanitizer::internal_strlen(name) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *name = (const char *)name_;") |
| pcmd("if (name) {") |
| pcmd(" POST_READ(name, __sanitizer::internal_strlen(name) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "mq_close") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "mq_unlink") { |
| if (mode == "pre") { |
| pcmd("const char *name = (const char *)name_;") |
| pcmd("if (name) {") |
| pcmd(" PRE_READ(name, __sanitizer::internal_strlen(name) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *name = (const char *)name_;") |
| pcmd("if (name) {") |
| pcmd(" POST_READ(name, __sanitizer::internal_strlen(name) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "mq_getattr") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "mq_setattr") { |
| if (mode == "pre") { |
| pcmd("if (mqstat_) {") |
| pcmd(" PRE_READ(mqstat_, struct_mq_attr_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "mq_notify") { |
| if (mode == "pre") { |
| pcmd("if (notification_) {") |
| pcmd(" PRE_READ(notification_, struct_sigevent_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "mq_send") { |
| if (mode == "pre") { |
| pcmd("if (msg_ptr_) {") |
| pcmd(" PRE_READ(msg_ptr_, msg_len_);") |
| pcmd("}") |
| } |
| } else if (syscall == "mq_receive") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_50_mq_timedsend") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50_mq_timedreceive") { |
| pcmd("/* TODO */") |
| } else if (syscall == "__posix_rename") { |
| if (mode == "pre") { |
| pcmd("const char *from = (const char *)from_;") |
| pcmd("const char *to = (const char *)to_;") |
| pcmd("if (from_) {") |
| pcmd(" PRE_READ(from, __sanitizer::internal_strlen(from) + 1);") |
| pcmd("}") |
| pcmd("if (to) {") |
| pcmd(" PRE_READ(to, __sanitizer::internal_strlen(to) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *from = (const char *)from_;") |
| pcmd("const char *to = (const char *)to_;") |
| pcmd("if (from) {") |
| pcmd(" POST_READ(from, __sanitizer::internal_strlen(from) + 1);") |
| pcmd("}") |
| pcmd("if (to) {") |
| pcmd(" POST_READ(to, __sanitizer::internal_strlen(to) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "swapctl") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_30_getdents") { |
| pcmd("/* TODO */") |
| } else if (syscall == "minherit") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "lchmod") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "lchown") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_50_lutimes") { |
| pcmd("/* TODO */") |
| } else if (syscall == "__msync13") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_30___stat13") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_30___fstat13") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_30___lstat13") { |
| pcmd("/* TODO */") |
| } else if (syscall == "__sigaltstack14") { |
| if (mode == "pre") { |
| pcmd("if (nss_) {") |
| pcmd(" PRE_READ(nss_, struct_sigaltstack_sz);") |
| pcmd("}") |
| pcmd("if (oss_) {") |
| pcmd(" PRE_READ(oss_, struct_sigaltstack_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "__vfork14") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__posix_chown") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "__posix_fchown") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__posix_lchown") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "getsid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__clone") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "fktrace") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "preadv") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "pwritev") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_16___sigaction14") { |
| pcmd("/* TODO */") |
| } else if (syscall == "__sigpending14") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__sigprocmask14") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__sigsuspend14") { |
| pcmd("if (set_) {") |
| pcmd(" PRE_READ(set_, sizeof(__sanitizer_sigset_t));") |
| pcmd("}") |
| } else if (syscall == "compat_16___sigreturn14") { |
| pcmd("/* TODO */") |
| } else if (syscall == "__getcwd") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "fchroot") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_30_fhopen") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_30_fhstat") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_20_fhstatfs") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50_____semctl13") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50___msgctl13") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50___shmctl13") { |
| pcmd("/* TODO */") |
| } else if (syscall == "lchflags") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "issetugid") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "utrace") { |
| if (mode == "pre") { |
| pcmd("const char *label = (const char *)label_;") |
| pcmd("if (label) {") |
| pcmd(" PRE_READ(label, __sanitizer::internal_strlen(label) + 1);") |
| pcmd("}") |
| pcmd("if (addr_) {") |
| pcmd(" PRE_READ(addr_, len_);") |
| pcmd("}") |
| } else { |
| pcmd("const char *label = (const char *)label_;") |
| pcmd("if (label) {") |
| pcmd(" POST_READ(label, __sanitizer::internal_strlen(label) + 1);") |
| pcmd("}") |
| pcmd("if (addr_) {") |
| pcmd(" POST_READ(addr_, len_);") |
| pcmd("}") |
| } |
| } else if (syscall == "getcontext") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "setcontext") { |
| if (mode == "pre") { |
| pcmd("if (ucp_) {") |
| pcmd(" PRE_READ(ucp_, ucontext_t_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "_lwp_create") { |
| if (mode == "pre") { |
| pcmd("if (ucp_) {") |
| pcmd(" PRE_READ(ucp_, ucontext_t_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "_lwp_exit") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_lwp_self") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_lwp_wait") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_lwp_suspend") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_lwp_continue") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_lwp_wakeup") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_lwp_getprivate") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_lwp_setprivate") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_lwp_kill") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_lwp_detach") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_50__lwp_park") { |
| pcmd("/* TODO */") |
| } else if (syscall == "_lwp_unpark") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_lwp_unpark_all") { |
| if (mode == "pre") { |
| pcmd("if (targets_) {") |
| pcmd(" PRE_READ(targets_, ntargets_ * sizeof(__sanitizer_lwpid_t));") |
| pcmd("}") |
| } |
| } else if (syscall == "_lwp_setname") { |
| if (mode == "pre") { |
| pcmd("const char *name = (const char *)name_;") |
| pcmd("if (name) {") |
| pcmd(" PRE_READ(name, __sanitizer::internal_strlen(name) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *name = (const char *)name_;") |
| pcmd("if (name) {") |
| pcmd(" POST_READ(name, __sanitizer::internal_strlen(name) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "_lwp_getname") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_lwp_ctl") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_60_sa_register") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_60_sa_stacks") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_60_sa_enable") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_60_sa_setconcurrency") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_60_sa_yield") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_60_sa_preempt") { |
| pcmd("/* TODO */") |
| } else if (syscall == "__sigaction_sigtramp") { |
| pcmd("if (nsa_) {") |
| pcmd(" PRE_READ(nsa_, sizeof(__sanitizer_sigaction));") |
| pcmd("}") |
| } else if (syscall == "rasctl") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "kqueue") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_50_kevent") { |
| pcmd("/* TODO */") |
| } else if (syscall == "_sched_setparam") { |
| pcmd("if (params_) {") |
| pcmd(" PRE_READ(params_, struct_sched_param_sz);") |
| pcmd("}") |
| } else if (syscall == "_sched_getparam") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_sched_setaffinity") { |
| pcmd("if (cpuset_) {") |
| pcmd(" PRE_READ(cpuset_, size_);") |
| pcmd("}") |
| } else if (syscall == "_sched_getaffinity") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "sched_yield") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_sched_protect") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "fsync_range") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "uuidgen") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "getvfsstat") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "statvfs1") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "fstatvfs1") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_30_fhstatvfs1") { |
| pcmd("/* TODO */") |
| } else if (syscall == "extattrctl") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "extattr_set_file") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "extattr_get_file") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "extattr_delete_file") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "extattr_set_fd") { |
| pcmd("/* TODO */") |
| } else if (syscall == "extattr_get_fd") { |
| pcmd("/* TODO */") |
| } else if (syscall == "extattr_delete_fd") { |
| pcmd("/* TODO */") |
| } else if (syscall == "extattr_set_link") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "extattr_get_link") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "extattr_delete_link") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "extattr_list_fd") { |
| pcmd("/* TODO */") |
| } else if (syscall == "extattr_list_file") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "extattr_list_link") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_50_pselect") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50_pollts") { |
| pcmd("/* TODO */") |
| } else if (syscall == "setxattr") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "lsetxattr") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "fsetxattr") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "getxattr") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "lgetxattr") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "fgetxattr") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "listxattr") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "llistxattr") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "flistxattr") { |
| pcmd("/* TODO */") |
| } else if (syscall == "removexattr") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "lremovexattr") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } |
| } else if (syscall == "fremovexattr") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50___stat30") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50___fstat30") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50___lstat30") { |
| pcmd("/* TODO */") |
| } else if (syscall == "__getdents30") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "posix_fadvise") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "compat_30___fhstat30") { |
| pcmd("/* TODO */") |
| } else if (syscall == "compat_50___ntp_gettime30") { |
| pcmd("/* TODO */") |
| } else if (syscall == "__socket30") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__getfh30") { |
| if (mode == "pre") { |
| pcmd("const char *fname = (const char *)fname_;") |
| pcmd("if (fname) {") |
| pcmd(" PRE_READ(fname, __sanitizer::internal_strlen(fname) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *fname = (const char *)fname_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (fname) {") |
| pcmd(" POST_READ(fname, __sanitizer::internal_strlen(fname) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "__fhopen40") { |
| if (mode == "pre") { |
| pcmd("if (fhp_) {") |
| pcmd(" PRE_READ(fhp_, fh_size_);") |
| pcmd("}") |
| } |
| } else if (syscall == "__fhstatvfs140") { |
| if (mode == "pre") { |
| pcmd("if (fhp_) {") |
| pcmd(" PRE_READ(fhp_, fh_size_);") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_50___fhstat40") { |
| if (mode == "pre") { |
| pcmd("if (fhp_) {") |
| pcmd(" PRE_READ(fhp_, fh_size_);") |
| pcmd("}") |
| } |
| } else if (syscall == "aio_cancel") { |
| if (mode == "pre") { |
| pcmd("if (aiocbp_) {") |
| pcmd(" PRE_READ(aiocbp_, sizeof(struct __sanitizer_aiocb));") |
| pcmd("}") |
| } |
| } else if (syscall == "aio_error") { |
| if (mode == "pre") { |
| pcmd("if (aiocbp_) {") |
| pcmd(" PRE_READ(aiocbp_, sizeof(struct __sanitizer_aiocb));") |
| pcmd("}") |
| } |
| } else if (syscall == "aio_fsync") { |
| if (mode == "pre") { |
| pcmd("if (aiocbp_) {") |
| pcmd(" PRE_READ(aiocbp_, sizeof(struct __sanitizer_aiocb));") |
| pcmd("}") |
| } |
| } else if (syscall == "aio_read") { |
| if (mode == "pre") { |
| pcmd("if (aiocbp_) {") |
| pcmd(" PRE_READ(aiocbp_, sizeof(struct __sanitizer_aiocb));") |
| pcmd("}") |
| } |
| } else if (syscall == "aio_return") { |
| if (mode == "pre") { |
| pcmd("if (aiocbp_) {") |
| pcmd(" PRE_READ(aiocbp_, sizeof(struct __sanitizer_aiocb));") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_50_aio_suspend") { |
| pcmd("/* TODO */") |
| } else if (syscall == "aio_write") { |
| if (mode == "pre") { |
| pcmd("if (aiocbp_) {") |
| pcmd(" PRE_READ(aiocbp_, sizeof(struct __sanitizer_aiocb));") |
| pcmd("}") |
| } |
| } else if (syscall == "lio_listio") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__mount50") { |
| if (mode == "pre") { |
| pcmd("const char *type = (const char *)type_;") |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (type) {") |
| pcmd(" PRE_READ(type, __sanitizer::internal_strlen(type) + 1);") |
| pcmd("}") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| pcmd("if (data_) {") |
| pcmd(" PRE_READ(data_, data_len_);") |
| pcmd("}") |
| } else { |
| pcmd("const char *type = (const char *)type_;") |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (type) {") |
| pcmd(" POST_READ(type, __sanitizer::internal_strlen(type) + 1);") |
| pcmd("}") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| pcmd("if (data_) {") |
| pcmd(" POST_READ(data_, data_len_);") |
| pcmd("}") |
| } |
| } else if (syscall == "mremap") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "pset_create") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "pset_destroy") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "pset_assign") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "_pset_bind") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__posix_fadvise50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__select50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__gettimeofday50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__settimeofday50") { |
| if (mode == "pre") { |
| pcmd("if (tv_) {") |
| pcmd(" PRE_READ(tv_, timeval_sz);") |
| pcmd("}") |
| pcmd("if (tzp_) {") |
| pcmd(" PRE_READ(tzp_, struct_timezone_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "__utimes50") { |
| if (mode == "pre") { |
| pcmd("struct __sanitizer_timespec **tptr = (struct __sanitizer_timespec **)tptr_;") |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| pcmd("if (tptr) {") |
| pcmd(" PRE_READ(tptr[0], struct_timespec_sz);") |
| pcmd(" PRE_READ(tptr[1], struct_timespec_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "__adjtime50") { |
| if (mode == "pre") { |
| pcmd("if (delta_) {") |
| pcmd(" PRE_READ(delta_, timeval_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "__lfs_segwait50") { |
| pcmd("/* TODO */") |
| } else if (syscall == "__futimes50") { |
| if (mode == "pre") { |
| pcmd("struct __sanitizer_timespec **tptr = (struct __sanitizer_timespec **)tptr_;") |
| pcmd("if (tptr) {") |
| pcmd(" PRE_READ(tptr[0], struct_timespec_sz);") |
| pcmd(" PRE_READ(tptr[1], struct_timespec_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "__lutimes50") { |
| if (mode == "pre") { |
| pcmd("struct __sanitizer_timespec **tptr = (struct __sanitizer_timespec **)tptr_;") |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| pcmd("if (tptr) {") |
| pcmd(" PRE_READ(tptr[0], struct_timespec_sz);") |
| pcmd(" PRE_READ(tptr[1], struct_timespec_sz);") |
| pcmd("}") |
| } else { |
| pcmd("struct __sanitizer_timespec **tptr = (struct __sanitizer_timespec **)tptr_;") |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| pcmd("if (tptr) {") |
| pcmd(" POST_READ(tptr[0], struct_timespec_sz);") |
| pcmd(" POST_READ(tptr[1], struct_timespec_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "__setitimer50") { |
| if (mode == "pre") { |
| pcmd("struct __sanitizer_itimerval *itv = (struct __sanitizer_itimerval *)itv_;") |
| pcmd("if (itv) {") |
| pcmd(" PRE_READ(&itv->it_interval.tv_sec, sizeof(__sanitizer_time_t));") |
| pcmd(" PRE_READ(&itv->it_interval.tv_usec, sizeof(__sanitizer_suseconds_t));") |
| pcmd(" PRE_READ(&itv->it_value.tv_sec, sizeof(__sanitizer_time_t));") |
| pcmd(" PRE_READ(&itv->it_value.tv_usec, sizeof(__sanitizer_suseconds_t));") |
| pcmd("}") |
| } |
| } else if (syscall == "__getitimer50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__clock_gettime50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__clock_settime50") { |
| if (mode == "pre") { |
| pcmd("if (tp_) {") |
| pcmd(" PRE_READ(tp_, struct_timespec_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "__clock_getres50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__nanosleep50") { |
| if (mode == "pre") { |
| pcmd("if (rqtp_) {") |
| pcmd(" PRE_READ(rqtp_, struct_timespec_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "____sigtimedwait50") { |
| if (mode == "pre") { |
| pcmd("if (set_) {") |
| pcmd(" PRE_READ(set_, sizeof(__sanitizer_sigset_t));") |
| pcmd("}") |
| pcmd("if (timeout_) {") |
| pcmd(" PRE_READ(timeout_, struct_timespec_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "__mq_timedsend50") { |
| if (mode == "pre") { |
| pcmd("if (msg_ptr_) {") |
| pcmd(" PRE_READ(msg_ptr_, msg_len_);") |
| pcmd("}") |
| pcmd("if (abs_timeout_) {") |
| pcmd(" PRE_READ(abs_timeout_, struct_timespec_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "__mq_timedreceive50") { |
| if (mode == "pre") { |
| pcmd("if (msg_ptr_) {") |
| pcmd(" PRE_READ(msg_ptr_, msg_len_);") |
| pcmd("}") |
| pcmd("if (abs_timeout_) {") |
| pcmd(" PRE_READ(abs_timeout_, struct_timespec_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "compat_60__lwp_park") { |
| pcmd("/* TODO */") |
| } else if (syscall == "__kevent50") { |
| if (mode == "pre") { |
| pcmd("if (changelist_) {") |
| pcmd(" PRE_READ(changelist_, nchanges_ * struct_kevent_sz);") |
| pcmd("}") |
| pcmd("if (timeout_) {") |
| pcmd(" PRE_READ(timeout_, struct_timespec_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "__pselect50") { |
| if (mode == "pre") { |
| pcmd("if (ts_) {") |
| pcmd(" PRE_READ(ts_, struct_timespec_sz);") |
| pcmd("}") |
| pcmd("if (mask_) {") |
| pcmd(" PRE_READ(mask_, sizeof(struct __sanitizer_sigset_t));") |
| pcmd("}") |
| } |
| } else if (syscall == "__pollts50") { |
| if (mode == "pre") { |
| pcmd("if (ts_) {") |
| pcmd(" PRE_READ(ts_, struct_timespec_sz);") |
| pcmd("}") |
| pcmd("if (mask_) {") |
| pcmd(" PRE_READ(mask_, sizeof(struct __sanitizer_sigset_t));") |
| pcmd("}") |
| } |
| } else if (syscall == "__aio_suspend50") { |
| if (mode == "pre") { |
| pcmd("int i;") |
| pcmd("const struct aiocb * const *list = (const struct aiocb * const *)list_;") |
| pcmd("if (list) {") |
| pcmd(" for (i = 0; i < nent_; i++) {") |
| pcmd(" if (list[i]) {") |
| pcmd(" PRE_READ(list[i], sizeof(struct __sanitizer_aiocb));") |
| pcmd(" }") |
| pcmd(" }") |
| pcmd("}") |
| pcmd("if (timeout_) {") |
| pcmd(" PRE_READ(timeout_, struct_timespec_sz);") |
| pcmd("}") |
| } |
| } else if (syscall == "__stat50") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "__fstat50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__lstat50") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "____semctl50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__shmctl50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__msgctl50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__getrusage50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__timer_settime50") { |
| if (mode == "pre") { |
| pcmd("struct __sanitizer_itimerval *value = (struct __sanitizer_itimerval *)value_;") |
| pcmd("if (value) {") |
| pcmd(" PRE_READ(&value->it_interval.tv_sec, sizeof(__sanitizer_time_t));") |
| pcmd(" PRE_READ(&value->it_interval.tv_usec, sizeof(__sanitizer_suseconds_t));") |
| pcmd(" PRE_READ(&value->it_value.tv_sec, sizeof(__sanitizer_time_t));") |
| pcmd(" PRE_READ(&value->it_value.tv_usec, sizeof(__sanitizer_suseconds_t));") |
| pcmd("}") |
| } else { |
| pcmd("struct __sanitizer_itimerval *value = (struct __sanitizer_itimerval *)value_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (value) {") |
| pcmd(" POST_READ(&value->it_interval.tv_sec, sizeof(__sanitizer_time_t));") |
| pcmd(" POST_READ(&value->it_interval.tv_usec, sizeof(__sanitizer_suseconds_t));") |
| pcmd(" POST_READ(&value->it_value.tv_sec, sizeof(__sanitizer_time_t));") |
| pcmd(" POST_READ(&value->it_value.tv_usec, sizeof(__sanitizer_suseconds_t));") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "__timer_gettime50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__ntp_gettime50") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__wait450") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "__mknod50") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "__fhstat50") { |
| if (mode == "pre") { |
| pcmd("if (fhp_) {") |
| pcmd(" PRE_READ(fhp_, fh_size_);") |
| pcmd("}") |
| } else { |
| pcmd("if (res == 0) {") |
| pcmd(" if (fhp_) {") |
| pcmd(" POST_READ(fhp_, fh_size_);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "pipe2") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "dup3") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "kqueue1") { |
| pcmd("/* Nothing to do */") |
| } else if (syscall == "paccept") { |
| if (mode == "pre") { |
| pcmd("if (mask_) {") |
| pcmd(" PRE_READ(mask_, sizeof(__sanitizer_sigset_t));") |
| pcmd("}") |
| } else { |
| pcmd("if (res >= 0) {") |
| pcmd(" if (mask_) {") |
| pcmd(" PRE_READ(mask_, sizeof(__sanitizer_sigset_t));") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "linkat") { |
| if (mode == "pre") { |
| pcmd("const char *name1 = (const char *)name1_;") |
| pcmd("const char *name2 = (const char *)name2_;") |
| pcmd("if (name1) {") |
| pcmd(" PRE_READ(name1, __sanitizer::internal_strlen(name1) + 1);") |
| pcmd("}") |
| pcmd("if (name2) {") |
| pcmd(" PRE_READ(name2, __sanitizer::internal_strlen(name2) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *name1 = (const char *)name1_;") |
| pcmd("const char *name2 = (const char *)name2_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (name1) {") |
| pcmd(" POST_READ(name1, __sanitizer::internal_strlen(name1) + 1);") |
| pcmd(" }") |
| pcmd(" if (name2) {") |
| pcmd(" POST_READ(name2, __sanitizer::internal_strlen(name2) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "renameat") { |
| if (mode == "pre") { |
| pcmd("const char *from = (const char *)from_;") |
| pcmd("const char *to = (const char *)to_;") |
| pcmd("if (from) {") |
| pcmd(" PRE_READ(from, __sanitizer::internal_strlen(from) + 1);") |
| pcmd("}") |
| pcmd("if (to) {") |
| pcmd(" PRE_READ(to, __sanitizer::internal_strlen(to) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *from = (const char *)from_;") |
| pcmd("const char *to = (const char *)to_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (from) {") |
| pcmd(" POST_READ(from, __sanitizer::internal_strlen(from) + 1);") |
| pcmd(" }") |
| pcmd(" if (to) {") |
| pcmd(" POST_READ(to, __sanitizer::internal_strlen(to) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "mkfifoat") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "mknodat") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "mkdirat") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "faccessat") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
| } else if (syscall == "fchmodat") { |
| if (mode == "pre") { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (path) {") |
| pcmd(" PRE_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd("}") |
| } else { |
| pcmd("const char *path = (const char *)path_;") |
| pcmd("if (res == 0) {") |
| pcmd(" if (path) {") |
| pcmd(" POST_READ(path, __sanitizer::internal_strlen(path) + 1);") |
| pcmd(" }") |
| pcmd("}") |
| } |
|