master
   1//===-- sanitizer_common_syscalls.inc ---------------------------*- C++ -*-===//
   2//
   3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
   4// See https://llvm.org/LICENSE.txt for license information.
   5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
   6//
   7//===----------------------------------------------------------------------===//
   8//
   9// Common syscalls handlers for tools like AddressSanitizer,
  10// ThreadSanitizer, MemorySanitizer, etc.
  11//
  12// This file should be included into the tool's interceptor file,
  13// which has to define it's own macros:
  14//   COMMON_SYSCALL_PRE_READ_RANGE
  15//          Called in prehook for regions that will be read by the kernel and
  16//          must be initialized.
  17//   COMMON_SYSCALL_PRE_WRITE_RANGE
  18//          Called in prehook for regions that will be written to by the kernel
  19//          and must be addressable. The actual write range may be smaller than
  20//          reported in the prehook. See POST_WRITE_RANGE.
  21//   COMMON_SYSCALL_POST_READ_RANGE
  22//          Called in posthook for regions that were read by the kernel. Does
  23//          not make much sense.
  24//   COMMON_SYSCALL_POST_WRITE_RANGE
  25//          Called in posthook for regions that were written to by the kernel
  26//          and are now initialized.
  27//   COMMON_SYSCALL_ACQUIRE(addr)
  28//          Acquire memory visibility from addr.
  29//   COMMON_SYSCALL_RELEASE(addr)
  30//          Release memory visibility to addr.
  31//   COMMON_SYSCALL_FD_CLOSE(fd)
  32//          Called before closing file descriptor fd.
  33//   COMMON_SYSCALL_FD_ACQUIRE(fd)
  34//          Acquire memory visibility from fd.
  35//   COMMON_SYSCALL_FD_RELEASE(fd)
  36//          Release memory visibility to fd.
  37//   COMMON_SYSCALL_PRE_FORK()
  38//          Called before fork syscall.
  39//   COMMON_SYSCALL_POST_FORK(long res)
  40//          Called after fork syscall.
  41//   COMMON_SYSCALL_BLOCKING_START()
  42//         Called before blocking syscall.
  43//   COMMON_SYSCALL_BLOCKING_END()
  44//         Called after blocking syscall.
  45//===----------------------------------------------------------------------===//
  46
  47#include "sanitizer_platform.h"
  48#if SANITIZER_LINUX
  49
  50#  include "sanitizer_libc.h"
  51#  include "sanitizer_platform_limits_posix.h"
  52
  53#  define PRE_SYSCALL(name) \
  54    SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_syscall_pre_impl_##name
  55#  define PRE_READ(p, s) COMMON_SYSCALL_PRE_READ_RANGE(p, s)
  56#  define PRE_WRITE(p, s) COMMON_SYSCALL_PRE_WRITE_RANGE(p, s)
  57
  58#  define POST_SYSCALL(name) \
  59    SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_syscall_post_impl_##name
  60#  define POST_READ(p, s) COMMON_SYSCALL_POST_READ_RANGE(p, s)
  61#  define POST_WRITE(p, s) COMMON_SYSCALL_POST_WRITE_RANGE(p, s)
  62
  63#  ifndef COMMON_SYSCALL_ACQUIRE
  64#    define COMMON_SYSCALL_ACQUIRE(addr) ((void)(addr))
  65#  endif
  66
  67#  ifndef COMMON_SYSCALL_RELEASE
  68#    define COMMON_SYSCALL_RELEASE(addr) ((void)(addr))
  69#  endif
  70
  71#  ifndef COMMON_SYSCALL_FD_CLOSE
  72#    define COMMON_SYSCALL_FD_CLOSE(fd) ((void)(fd))
  73#  endif
  74
  75#  ifndef COMMON_SYSCALL_FD_ACQUIRE
  76#    define COMMON_SYSCALL_FD_ACQUIRE(fd) ((void)(fd))
  77#  endif
  78
  79#  ifndef COMMON_SYSCALL_FD_RELEASE
  80#    define COMMON_SYSCALL_FD_RELEASE(fd) ((void)(fd))
  81#  endif
  82
  83#  ifndef COMMON_SYSCALL_PRE_FORK
  84#    define COMMON_SYSCALL_PRE_FORK() \
  85      {}
  86#  endif
  87
  88#  ifndef COMMON_SYSCALL_POST_FORK
  89#    define COMMON_SYSCALL_POST_FORK(res) \
  90      {}
  91#  endif
  92
  93#  ifndef COMMON_SYSCALL_BLOCKING_START
  94#    define COMMON_SYSCALL_BLOCKING_START() \
  95      {}
  96#  endif
  97
  98#  ifndef COMMON_SYSCALL_BLOCKING_END
  99#    define COMMON_SYSCALL_BLOCKING_END() \
 100      {}
 101#  endif
 102
 103// FIXME: do some kind of PRE_READ for all syscall arguments (int(s) and such).
 104
 105extern "C" {
 106struct sanitizer_kernel_iovec {
 107  void *iov_base;
 108  unsigned long iov_len;
 109};
 110
 111struct sanitizer_kernel_msghdr {
 112  void *msg_name;
 113  int msg_namelen;
 114  struct sanitizer_kernel_iovec *msg_iov;
 115  unsigned long msg_iovlen;
 116  void *msg_control;
 117  unsigned long msg_controllen;
 118  unsigned msg_flags;
 119};
 120
 121struct sanitizer_kernel_mmsghdr {
 122  struct sanitizer_kernel_msghdr msg_hdr;
 123  unsigned msg_len;
 124};
 125
 126struct sanitizer_kernel_timespec {
 127  long tv_sec;
 128  long tv_nsec;
 129};
 130
 131struct sanitizer_kernel_timeval {
 132  long tv_sec;
 133  long tv_usec;
 134};
 135
 136struct sanitizer_kernel_rusage {
 137  struct sanitizer_kernel_timeval ru_timeval[2];
 138  long ru_long[14];
 139};
 140
 141struct sanitizer_kernel_sockaddr {
 142  unsigned short sa_family;
 143  char sa_data[14];
 144};
 145
 146// Real sigset size is always passed as a syscall argument.
 147// Declare it "void" to catch sizeof(kernel_sigset_t).
 148typedef void kernel_sigset_t;
 149
 150static void kernel_write_iovec(const __sanitizer_iovec *iovec, SIZE_T iovlen,
 151                               SIZE_T maxlen) {
 152  for (SIZE_T i = 0; i < iovlen && maxlen; ++i) {
 153    SSIZE_T sz = Min(iovec[i].iov_len, maxlen);
 154    POST_WRITE(iovec[i].iov_base, sz);
 155    maxlen -= sz;
 156  }
 157}
 158
 159// This functions uses POST_READ, because it needs to run after syscall to know
 160// the real read range.
 161static void kernel_read_iovec(const __sanitizer_iovec *iovec, SIZE_T iovlen,
 162                              SIZE_T maxlen) {
 163  POST_READ(iovec, sizeof(*iovec) * iovlen);
 164  for (SIZE_T i = 0; i < iovlen && maxlen; ++i) {
 165    SSIZE_T sz = Min(iovec[i].iov_len, maxlen);
 166    POST_READ(iovec[i].iov_base, sz);
 167    maxlen -= sz;
 168  }
 169}
 170
 171PRE_SYSCALL(recvmsg)(long sockfd, sanitizer_kernel_msghdr *msg, long flags) {
 172  PRE_READ(msg, sizeof(*msg));
 173}
 174
 175POST_SYSCALL(recvmsg)
 176(long res, long sockfd, sanitizer_kernel_msghdr *msg, long flags) {
 177  if (res >= 0) {
 178    if (msg) {
 179      for (unsigned long i = 0; i < msg->msg_iovlen; ++i) {
 180        POST_WRITE(msg->msg_iov[i].iov_base, msg->msg_iov[i].iov_len);
 181      }
 182      POST_WRITE(msg->msg_control, msg->msg_controllen);
 183    }
 184  }
 185}
 186
 187PRE_SYSCALL(recvmmsg)
 188(long fd, sanitizer_kernel_mmsghdr *msg, long vlen, long flags, void *timeout) {
 189  PRE_READ(msg, vlen * sizeof(*msg));
 190}
 191
 192POST_SYSCALL(recvmmsg)
 193(long res, long fd, sanitizer_kernel_mmsghdr *msg, long vlen, long flags,
 194 void *timeout) {
 195  if (res >= 0) {
 196    if (msg) {
 197      for (unsigned long i = 0; i < msg->msg_hdr.msg_iovlen; ++i) {
 198        POST_WRITE(msg->msg_hdr.msg_iov[i].iov_base,
 199                   msg->msg_hdr.msg_iov[i].iov_len);
 200      }
 201      POST_WRITE(msg->msg_hdr.msg_control, msg->msg_hdr.msg_controllen);
 202      POST_WRITE(&msg->msg_len, sizeof(msg->msg_len));
 203    }
 204    if (timeout)
 205      POST_WRITE(timeout, struct_timespec_sz);
 206  }
 207}
 208
 209PRE_SYSCALL(read)(long fd, void *buf, uptr count) {
 210  if (buf) {
 211    PRE_WRITE(buf, count);
 212  }
 213}
 214
 215POST_SYSCALL(read)(long res, long fd, void *buf, uptr count) {
 216  if (res > 0 && buf) {
 217    POST_WRITE(buf, res);
 218  }
 219}
 220
 221PRE_SYSCALL(time)(void *tloc) {}
 222
 223POST_SYSCALL(time)(long res, void *tloc) {
 224  if (res >= 0) {
 225    if (tloc)
 226      POST_WRITE(tloc, sizeof(long));
 227  }
 228}
 229
 230PRE_SYSCALL(stime)(void *tptr) {}
 231
 232POST_SYSCALL(stime)(long res, void *tptr) {
 233  if (res >= 0) {
 234    if (tptr)
 235      POST_WRITE(tptr, sizeof(long));
 236  }
 237}
 238
 239PRE_SYSCALL(gettimeofday)(void *tv, void *tz) {}
 240
 241POST_SYSCALL(gettimeofday)(long res, void *tv, void *tz) {
 242  if (res >= 0) {
 243    if (tv)
 244      POST_WRITE(tv, timeval_sz);
 245    if (tz)
 246      POST_WRITE(tz, struct_timezone_sz);
 247  }
 248}
 249
 250PRE_SYSCALL(settimeofday)(void *tv, void *tz) {}
 251
 252POST_SYSCALL(settimeofday)(long res, void *tv, void *tz) {
 253  if (res >= 0) {
 254    if (tv)
 255      POST_WRITE(tv, timeval_sz);
 256    if (tz)
 257      POST_WRITE(tz, struct_timezone_sz);
 258  }
 259}
 260
 261#  if !SANITIZER_ANDROID
 262PRE_SYSCALL(adjtimex)(void *txc_p) {}
 263
 264POST_SYSCALL(adjtimex)(long res, void *txc_p) {
 265  if (res >= 0) {
 266    if (txc_p)
 267      POST_WRITE(txc_p, struct_timex_sz);
 268  }
 269}
 270#  endif
 271
 272PRE_SYSCALL(times)(void *tbuf) {}
 273
 274POST_SYSCALL(times)(long res, void *tbuf) {
 275  if (res >= 0) {
 276    if (tbuf)
 277      POST_WRITE(tbuf, struct_tms_sz);
 278  }
 279}
 280
 281PRE_SYSCALL(gettid)() {}
 282
 283POST_SYSCALL(gettid)(long res) {}
 284
 285PRE_SYSCALL(nanosleep)(void *rqtp, void *rmtp) {}
 286
 287POST_SYSCALL(nanosleep)(long res, void *rqtp, void *rmtp) {
 288  if (res >= 0) {
 289    if (rqtp)
 290      POST_WRITE(rqtp, struct_timespec_sz);
 291    if (rmtp)
 292      POST_WRITE(rmtp, struct_timespec_sz);
 293  }
 294}
 295
 296PRE_SYSCALL(alarm)(long seconds) {}
 297
 298POST_SYSCALL(alarm)(long res, long seconds) {}
 299
 300PRE_SYSCALL(getpid)() {}
 301
 302POST_SYSCALL(getpid)(long res) {}
 303
 304PRE_SYSCALL(getppid)() {}
 305
 306POST_SYSCALL(getppid)(long res) {}
 307
 308PRE_SYSCALL(getuid)() {}
 309
 310POST_SYSCALL(getuid)(long res) {}
 311
 312PRE_SYSCALL(geteuid)() {}
 313
 314POST_SYSCALL(geteuid)(long res) {}
 315
 316PRE_SYSCALL(getgid)() {}
 317
 318POST_SYSCALL(getgid)(long res) {}
 319
 320PRE_SYSCALL(getegid)() {}
 321
 322POST_SYSCALL(getegid)(long res) {}
 323
 324PRE_SYSCALL(getresuid)(void *ruid, void *euid, void *suid) {}
 325
 326POST_SYSCALL(getresuid)(long res, void *ruid, void *euid, void *suid) {
 327  if (res >= 0) {
 328    if (ruid)
 329      POST_WRITE(ruid, sizeof(unsigned));
 330    if (euid)
 331      POST_WRITE(euid, sizeof(unsigned));
 332    if (suid)
 333      POST_WRITE(suid, sizeof(unsigned));
 334  }
 335}
 336
 337PRE_SYSCALL(getresgid)(void *rgid, void *egid, void *sgid) {}
 338
 339POST_SYSCALL(getresgid)(long res, void *rgid, void *egid, void *sgid) {
 340  if (res >= 0) {
 341    if (rgid)
 342      POST_WRITE(rgid, sizeof(unsigned));
 343    if (egid)
 344      POST_WRITE(egid, sizeof(unsigned));
 345    if (sgid)
 346      POST_WRITE(sgid, sizeof(unsigned));
 347  }
 348}
 349
 350PRE_SYSCALL(getpgid)(long pid) {}
 351
 352POST_SYSCALL(getpgid)(long res, long pid) {}
 353
 354PRE_SYSCALL(getpgrp)() {}
 355
 356POST_SYSCALL(getpgrp)(long res) {}
 357
 358PRE_SYSCALL(getsid)(long pid) {}
 359
 360POST_SYSCALL(getsid)(long res, long pid) {}
 361
 362PRE_SYSCALL(getgroups)(long gidsetsize, void *grouplist) {}
 363
 364POST_SYSCALL(getgroups)
 365(long res, long gidsetsize, __sanitizer___kernel_gid_t *grouplist) {
 366  if (res >= 0) {
 367    if (grouplist)
 368      POST_WRITE(grouplist, res * sizeof(*grouplist));
 369  }
 370}
 371
 372PRE_SYSCALL(setregid)(long rgid, long egid) {}
 373
 374POST_SYSCALL(setregid)(long res, long rgid, long egid) {}
 375
 376PRE_SYSCALL(setgid)(long gid) {}
 377
 378POST_SYSCALL(setgid)(long res, long gid) {}
 379
 380PRE_SYSCALL(setreuid)(long ruid, long euid) {}
 381
 382POST_SYSCALL(setreuid)(long res, long ruid, long euid) {}
 383
 384PRE_SYSCALL(setuid)(long uid) {}
 385
 386POST_SYSCALL(setuid)(long res, long uid) {}
 387
 388PRE_SYSCALL(setresuid)(long ruid, long euid, long suid) {}
 389
 390POST_SYSCALL(setresuid)(long res, long ruid, long euid, long suid) {}
 391
 392PRE_SYSCALL(setresgid)(long rgid, long egid, long sgid) {}
 393
 394POST_SYSCALL(setresgid)(long res, long rgid, long egid, long sgid) {}
 395
 396PRE_SYSCALL(setfsuid)(long uid) {}
 397
 398POST_SYSCALL(setfsuid)(long res, long uid) {}
 399
 400PRE_SYSCALL(setfsgid)(long gid) {}
 401
 402POST_SYSCALL(setfsgid)(long res, long gid) {}
 403
 404PRE_SYSCALL(setpgid)(long pid, long pgid) {}
 405
 406POST_SYSCALL(setpgid)(long res, long pid, long pgid) {}
 407
 408PRE_SYSCALL(setsid)() {}
 409
 410POST_SYSCALL(setsid)(long res) {}
 411
 412PRE_SYSCALL(setgroups)(long gidsetsize, __sanitizer___kernel_gid_t *grouplist) {
 413  if (grouplist)
 414    POST_WRITE(grouplist, gidsetsize * sizeof(*grouplist));
 415}
 416
 417POST_SYSCALL(setgroups)
 418(long res, long gidsetsize, __sanitizer___kernel_gid_t *grouplist) {}
 419
 420PRE_SYSCALL(acct)(const void *name) {
 421  if (name)
 422    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
 423}
 424
 425POST_SYSCALL(acct)(long res, const void *name) {}
 426
 427PRE_SYSCALL(capget)(void *header, void *dataptr) {
 428  if (header)
 429    PRE_READ(header, __user_cap_header_struct_sz);
 430}
 431
 432POST_SYSCALL(capget)(long res, void *header, void *dataptr) {
 433  if (res >= 0)
 434    if (dataptr)
 435      POST_WRITE(dataptr, __user_cap_data_struct_sz(header));
 436}
 437
 438PRE_SYSCALL(capset)(void *header, const void *data) {
 439  if (header)
 440    PRE_READ(header, __user_cap_header_struct_sz);
 441  if (data)
 442    PRE_READ(data, __user_cap_data_struct_sz(header));
 443}
 444
 445POST_SYSCALL(capset)(long res, void *header, const void *data) {}
 446
 447PRE_SYSCALL(personality)(long personality) {}
 448
 449POST_SYSCALL(personality)(long res, long personality) {}
 450
 451PRE_SYSCALL(sigpending)(void *set) {}
 452
 453POST_SYSCALL(sigpending)(long res, void *set) {
 454  if (res >= 0) {
 455    if (set)
 456      POST_WRITE(set, old_sigset_t_sz);
 457  }
 458}
 459
 460PRE_SYSCALL(sigprocmask)(long how, void *set, void *oset) {}
 461
 462POST_SYSCALL(sigprocmask)(long res, long how, void *set, void *oset) {
 463  if (res >= 0) {
 464    if (set)
 465      POST_WRITE(set, old_sigset_t_sz);
 466    if (oset)
 467      POST_WRITE(oset, old_sigset_t_sz);
 468  }
 469}
 470
 471PRE_SYSCALL(getitimer)(long which, void *value) {}
 472
 473POST_SYSCALL(getitimer)(long res, long which, void *value) {
 474  if (res >= 0) {
 475    if (value)
 476      POST_WRITE(value, struct_itimerval_sz);
 477  }
 478}
 479
 480PRE_SYSCALL(setitimer)(long which, void *value, void *ovalue) {}
 481
 482POST_SYSCALL(setitimer)(long res, long which, void *value, void *ovalue) {
 483  if (res >= 0) {
 484    if (value)
 485      POST_WRITE(value, struct_itimerval_sz);
 486    if (ovalue)
 487      POST_WRITE(ovalue, struct_itimerval_sz);
 488  }
 489}
 490
 491PRE_SYSCALL(timer_create)
 492(long which_clock, void *timer_event_spec, void *created_timer_id) {}
 493
 494POST_SYSCALL(timer_create)
 495(long res, long which_clock, void *timer_event_spec, void *created_timer_id) {
 496  if (res >= 0) {
 497    if (timer_event_spec)
 498      POST_WRITE(timer_event_spec, struct_sigevent_sz);
 499    if (created_timer_id)
 500      POST_WRITE(created_timer_id, sizeof(long));
 501  }
 502}
 503
 504PRE_SYSCALL(timer_gettime)(long timer_id, void *setting) {}
 505
 506POST_SYSCALL(timer_gettime)(long res, long timer_id, void *setting) {
 507  if (res >= 0) {
 508    if (setting)
 509      POST_WRITE(setting, struct_itimerspec_sz);
 510  }
 511}
 512
 513PRE_SYSCALL(timer_getoverrun)(long timer_id) {}
 514
 515POST_SYSCALL(timer_getoverrun)(long res, long timer_id) {}
 516
 517PRE_SYSCALL(timer_settime)
 518(long timer_id, long flags, const void *new_setting, void *old_setting) {
 519  if (new_setting)
 520    PRE_READ(new_setting, struct_itimerspec_sz);
 521}
 522
 523POST_SYSCALL(timer_settime)
 524(long res, long timer_id, long flags, const void *new_setting,
 525 void *old_setting) {
 526  if (res >= 0) {
 527    if (old_setting)
 528      POST_WRITE(old_setting, struct_itimerspec_sz);
 529  }
 530}
 531
 532PRE_SYSCALL(timer_delete)(long timer_id) {}
 533
 534POST_SYSCALL(timer_delete)(long res, long timer_id) {}
 535
 536PRE_SYSCALL(clock_settime)(long which_clock, const void *tp) {
 537  if (tp)
 538    PRE_READ(tp, struct_timespec_sz);
 539}
 540
 541POST_SYSCALL(clock_settime)(long res, long which_clock, const void *tp) {}
 542
 543PRE_SYSCALL(clock_gettime)(long which_clock, void *tp) {}
 544
 545POST_SYSCALL(clock_gettime)(long res, long which_clock, void *tp) {
 546  if (res >= 0) {
 547    if (tp)
 548      POST_WRITE(tp, struct_timespec_sz);
 549  }
 550}
 551
 552#  if !SANITIZER_ANDROID
 553PRE_SYSCALL(clock_adjtime)(long which_clock, void *tx) {}
 554
 555POST_SYSCALL(clock_adjtime)(long res, long which_clock, void *tx) {
 556  if (res >= 0) {
 557    if (tx)
 558      POST_WRITE(tx, struct_timex_sz);
 559  }
 560}
 561#  endif
 562
 563PRE_SYSCALL(clock_getres)(long which_clock, void *tp) {}
 564
 565POST_SYSCALL(clock_getres)(long res, long which_clock, void *tp) {
 566  if (res >= 0) {
 567    if (tp)
 568      POST_WRITE(tp, struct_timespec_sz);
 569  }
 570}
 571
 572PRE_SYSCALL(clock_nanosleep)
 573(long which_clock, long flags, const void *rqtp, void *rmtp) {
 574  if (rqtp)
 575    PRE_READ(rqtp, struct_timespec_sz);
 576}
 577
 578POST_SYSCALL(clock_nanosleep)
 579(long res, long which_clock, long flags, const void *rqtp, void *rmtp) {
 580  if (res >= 0) {
 581    if (rmtp)
 582      POST_WRITE(rmtp, struct_timespec_sz);
 583  }
 584}
 585
 586PRE_SYSCALL(nice)(long increment) {}
 587
 588POST_SYSCALL(nice)(long res, long increment) {}
 589
 590PRE_SYSCALL(sched_setscheduler)(long pid, long policy, void *param) {}
 591
 592POST_SYSCALL(sched_setscheduler)(long res, long pid, long policy, void *param) {
 593  if (res >= 0) {
 594    if (param)
 595      POST_WRITE(param, struct_sched_param_sz);
 596  }
 597}
 598
 599PRE_SYSCALL(sched_setparam)(long pid, void *param) {
 600  if (param)
 601    PRE_READ(param, struct_sched_param_sz);
 602}
 603
 604POST_SYSCALL(sched_setparam)(long res, long pid, void *param) {}
 605
 606PRE_SYSCALL(sched_getscheduler)(long pid) {}
 607
 608POST_SYSCALL(sched_getscheduler)(long res, long pid) {}
 609
 610PRE_SYSCALL(sched_getparam)(long pid, void *param) {}
 611
 612POST_SYSCALL(sched_getparam)(long res, long pid, void *param) {
 613  if (res >= 0) {
 614    if (param)
 615      POST_WRITE(param, struct_sched_param_sz);
 616  }
 617}
 618
 619PRE_SYSCALL(sched_setaffinity)(long pid, long len, void *user_mask_ptr) {
 620  if (user_mask_ptr)
 621    PRE_READ(user_mask_ptr, len);
 622}
 623
 624POST_SYSCALL(sched_setaffinity)
 625(long res, long pid, long len, void *user_mask_ptr) {}
 626
 627PRE_SYSCALL(sched_getaffinity)(long pid, long len, void *user_mask_ptr) {}
 628
 629POST_SYSCALL(sched_getaffinity)
 630(long res, long pid, long len, void *user_mask_ptr) {
 631  if (res >= 0) {
 632    if (user_mask_ptr)
 633      POST_WRITE(user_mask_ptr, len);
 634  }
 635}
 636
 637PRE_SYSCALL(sched_yield)() {}
 638
 639POST_SYSCALL(sched_yield)(long res) {}
 640
 641PRE_SYSCALL(sched_get_priority_max)(long policy) {}
 642
 643POST_SYSCALL(sched_get_priority_max)(long res, long policy) {}
 644
 645PRE_SYSCALL(sched_get_priority_min)(long policy) {}
 646
 647POST_SYSCALL(sched_get_priority_min)(long res, long policy) {}
 648
 649PRE_SYSCALL(sched_rr_get_interval)(long pid, void *interval) {}
 650
 651POST_SYSCALL(sched_rr_get_interval)(long res, long pid, void *interval) {
 652  if (res >= 0) {
 653    if (interval)
 654      POST_WRITE(interval, struct_timespec_sz);
 655  }
 656}
 657
 658PRE_SYSCALL(setpriority)(long which, long who, long niceval) {}
 659
 660POST_SYSCALL(setpriority)(long res, long which, long who, long niceval) {}
 661
 662PRE_SYSCALL(getpriority)(long which, long who) {}
 663
 664POST_SYSCALL(getpriority)(long res, long which, long who) {}
 665
 666PRE_SYSCALL(shutdown)(long arg0, long arg1) {}
 667
 668POST_SYSCALL(shutdown)(long res, long arg0, long arg1) {}
 669
 670PRE_SYSCALL(reboot)(long magic1, long magic2, long cmd, void *arg) {}
 671
 672POST_SYSCALL(reboot)(long res, long magic1, long magic2, long cmd, void *arg) {}
 673
 674PRE_SYSCALL(restart_syscall)() {}
 675
 676POST_SYSCALL(restart_syscall)(long res) {}
 677
 678PRE_SYSCALL(kexec_load)
 679(long entry, long nr_segments, void *segments, long flags) {}
 680
 681POST_SYSCALL(kexec_load)
 682(long res, long entry, long nr_segments, void *segments, long flags) {
 683  if (res >= 0) {
 684    if (segments)
 685      POST_WRITE(segments, struct_kexec_segment_sz);
 686  }
 687}
 688
 689PRE_SYSCALL(exit)(long error_code) {}
 690
 691POST_SYSCALL(exit)(long res, long error_code) {}
 692
 693PRE_SYSCALL(exit_group)(long error_code) {}
 694
 695POST_SYSCALL(exit_group)(long res, long error_code) {}
 696
 697PRE_SYSCALL(wait4)(long pid, void *stat_addr, long options, void *ru) {}
 698
 699POST_SYSCALL(wait4)
 700(long res, long pid, void *stat_addr, long options, void *ru) {
 701  if (res >= 0) {
 702    if (stat_addr)
 703      POST_WRITE(stat_addr, sizeof(int));
 704    if (ru)
 705      POST_WRITE(ru, struct_rusage_sz);
 706  }
 707}
 708
 709PRE_SYSCALL(waitid)
 710(long which, long pid, void *infop, long options, void *ru) {}
 711
 712POST_SYSCALL(waitid)
 713(long res, long which, long pid, void *infop, long options, void *ru) {
 714  if (res >= 0) {
 715    if (infop)
 716      POST_WRITE(infop, siginfo_t_sz);
 717    if (ru)
 718      POST_WRITE(ru, struct_rusage_sz);
 719  }
 720}
 721
 722PRE_SYSCALL(waitpid)(long pid, void *stat_addr, long options) {}
 723
 724POST_SYSCALL(waitpid)(long res, long pid, void *stat_addr, long options) {
 725  if (res >= 0) {
 726    if (stat_addr)
 727      POST_WRITE(stat_addr, sizeof(int));
 728  }
 729}
 730
 731PRE_SYSCALL(set_tid_address)(void *tidptr) {}
 732
 733POST_SYSCALL(set_tid_address)(long res, void *tidptr) {
 734  if (res >= 0) {
 735    if (tidptr)
 736      POST_WRITE(tidptr, sizeof(int));
 737  }
 738}
 739
 740PRE_SYSCALL(init_module)(void *umod, long len, const void *uargs) {
 741  if (uargs)
 742    PRE_READ(uargs, __sanitizer::internal_strlen((const char *)uargs) + 1);
 743}
 744
 745POST_SYSCALL(init_module)(long res, void *umod, long len, const void *uargs) {}
 746
 747PRE_SYSCALL(delete_module)(const void *name_user, long flags) {
 748  if (name_user)
 749    PRE_READ(name_user,
 750             __sanitizer::internal_strlen((const char *)name_user) + 1);
 751}
 752
 753POST_SYSCALL(delete_module)(long res, const void *name_user, long flags) {}
 754
 755PRE_SYSCALL(rt_sigprocmask)(long how, void *set, void *oset, long sigsetsize) {}
 756
 757POST_SYSCALL(rt_sigprocmask)
 758(long res, long how, kernel_sigset_t *set, kernel_sigset_t *oset,
 759 long sigsetsize) {
 760  if (res >= 0) {
 761    if (set)
 762      POST_WRITE(set, sigsetsize);
 763    if (oset)
 764      POST_WRITE(oset, sigsetsize);
 765  }
 766}
 767
 768PRE_SYSCALL(rt_sigpending)(void *set, long sigsetsize) {}
 769
 770POST_SYSCALL(rt_sigpending)(long res, kernel_sigset_t *set, long sigsetsize) {
 771  if (res >= 0) {
 772    if (set)
 773      POST_WRITE(set, sigsetsize);
 774  }
 775}
 776
 777PRE_SYSCALL(rt_sigtimedwait)
 778(const kernel_sigset_t *uthese, void *uinfo, const void *uts, long sigsetsize) {
 779  if (uthese)
 780    PRE_READ(uthese, sigsetsize);
 781  if (uts)
 782    PRE_READ(uts, struct_timespec_sz);
 783}
 784
 785POST_SYSCALL(rt_sigtimedwait)
 786(long res, const void *uthese, void *uinfo, const void *uts, long sigsetsize) {
 787  if (res >= 0) {
 788    if (uinfo)
 789      POST_WRITE(uinfo, siginfo_t_sz);
 790  }
 791}
 792
 793PRE_SYSCALL(rt_tgsigqueueinfo)(long tgid, long pid, long sig, void *uinfo) {}
 794
 795POST_SYSCALL(rt_tgsigqueueinfo)
 796(long res, long tgid, long pid, long sig, void *uinfo) {
 797  if (res >= 0) {
 798    if (uinfo)
 799      POST_WRITE(uinfo, siginfo_t_sz);
 800  }
 801}
 802
 803PRE_SYSCALL(kill)(long pid, long sig) {}
 804
 805POST_SYSCALL(kill)(long res, long pid, long sig) {}
 806
 807PRE_SYSCALL(tgkill)(long tgid, long pid, long sig) {}
 808
 809POST_SYSCALL(tgkill)(long res, long tgid, long pid, long sig) {}
 810
 811PRE_SYSCALL(tkill)(long pid, long sig) {}
 812
 813POST_SYSCALL(tkill)(long res, long pid, long sig) {}
 814
 815PRE_SYSCALL(rt_sigqueueinfo)(long pid, long sig, void *uinfo) {}
 816
 817POST_SYSCALL(rt_sigqueueinfo)(long res, long pid, long sig, void *uinfo) {
 818  if (res >= 0) {
 819    if (uinfo)
 820      POST_WRITE(uinfo, siginfo_t_sz);
 821  }
 822}
 823
 824PRE_SYSCALL(sgetmask)() {}
 825
 826POST_SYSCALL(sgetmask)(long res) {}
 827
 828PRE_SYSCALL(ssetmask)(long newmask) {}
 829
 830POST_SYSCALL(ssetmask)(long res, long newmask) {}
 831
 832PRE_SYSCALL(signal)(long sig, long handler) {}
 833
 834POST_SYSCALL(signal)(long res, long sig, long handler) {}
 835
 836PRE_SYSCALL(pause)() {}
 837
 838POST_SYSCALL(pause)(long res) {}
 839
 840PRE_SYSCALL(sync)() {}
 841
 842POST_SYSCALL(sync)(long res) {}
 843
 844PRE_SYSCALL(fsync)(long fd) {}
 845
 846POST_SYSCALL(fsync)(long res, long fd) {}
 847
 848PRE_SYSCALL(fdatasync)(long fd) {}
 849
 850POST_SYSCALL(fdatasync)(long res, long fd) {}
 851
 852PRE_SYSCALL(bdflush)(long func, long data) {}
 853
 854POST_SYSCALL(bdflush)(long res, long func, long data) {}
 855
 856PRE_SYSCALL(mount)
 857(void *dev_name, void *dir_name, void *type, long flags, void *data) {}
 858
 859POST_SYSCALL(mount)
 860(long res, void *dev_name, void *dir_name, void *type, long flags, void *data) {
 861  if (res >= 0) {
 862    if (dev_name)
 863      POST_WRITE(dev_name,
 864                 __sanitizer::internal_strlen((const char *)dev_name) + 1);
 865    if (dir_name)
 866      POST_WRITE(dir_name,
 867                 __sanitizer::internal_strlen((const char *)dir_name) + 1);
 868    if (type)
 869      POST_WRITE(type, __sanitizer::internal_strlen((const char *)type) + 1);
 870  }
 871}
 872
 873PRE_SYSCALL(umount)(void *name, long flags) {}
 874
 875POST_SYSCALL(umount)(long res, void *name, long flags) {
 876  if (res >= 0) {
 877    if (name)
 878      POST_WRITE(name, __sanitizer::internal_strlen((const char *)name) + 1);
 879  }
 880}
 881
 882PRE_SYSCALL(oldumount)(void *name) {}
 883
 884POST_SYSCALL(oldumount)(long res, void *name) {
 885  if (res >= 0) {
 886    if (name)
 887      POST_WRITE(name, __sanitizer::internal_strlen((const char *)name) + 1);
 888  }
 889}
 890
 891PRE_SYSCALL(truncate)(const void *path, long length) {
 892  if (path)
 893    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
 894}
 895
 896POST_SYSCALL(truncate)(long res, const void *path, long length) {}
 897
 898PRE_SYSCALL(ftruncate)(long fd, long length) {}
 899
 900POST_SYSCALL(ftruncate)(long res, long fd, long length) {}
 901
 902PRE_SYSCALL(stat)(const void *filename, void *statbuf) {
 903  if (filename)
 904    PRE_READ(filename,
 905             __sanitizer::internal_strlen((const char *)filename) + 1);
 906}
 907
 908POST_SYSCALL(stat)(long res, const void *filename, void *statbuf) {
 909  if (res >= 0) {
 910    if (statbuf)
 911      POST_WRITE(statbuf, struct___old_kernel_stat_sz);
 912  }
 913}
 914
 915#  if !SANITIZER_ANDROID
 916PRE_SYSCALL(statfs)(const void *path, void *buf) {
 917  if (path)
 918    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
 919}
 920
 921POST_SYSCALL(statfs)(long res, const void *path, void *buf) {
 922  if (res >= 0) {
 923    if (buf)
 924      POST_WRITE(buf, struct_statfs_sz);
 925  }
 926}
 927
 928PRE_SYSCALL(fstatfs)(long fd, void *buf) {}
 929
 930POST_SYSCALL(fstatfs)(long res, long fd, void *buf) {
 931  if (res >= 0) {
 932    if (buf)
 933      POST_WRITE(buf, struct_statfs_sz);
 934  }
 935}
 936#  endif  // !SANITIZER_ANDROID
 937
 938#  if SANITIZER_GLIBC
 939PRE_SYSCALL(statfs64)(const void *path, long sz, void *buf) {
 940  if (path)
 941    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
 942}
 943
 944POST_SYSCALL(statfs64)(long res, const void *path, long sz, void *buf) {
 945  if (res >= 0) {
 946    if (buf)
 947      POST_WRITE(buf, struct_statfs64_sz);
 948  }
 949}
 950
 951PRE_SYSCALL(fstatfs64)(long fd, long sz, void *buf) {}
 952
 953POST_SYSCALL(fstatfs64)(long res, long fd, long sz, void *buf) {
 954  if (res >= 0) {
 955    if (buf)
 956      POST_WRITE(buf, struct_statfs64_sz);
 957  }
 958}
 959#  endif  // SANITIZER_GLIBC
 960
 961PRE_SYSCALL(lstat)(const void *filename, void *statbuf) {
 962  if (filename)
 963    PRE_READ(filename,
 964             __sanitizer::internal_strlen((const char *)filename) + 1);
 965}
 966
 967POST_SYSCALL(lstat)(long res, const void *filename, void *statbuf) {
 968  if (res >= 0) {
 969    if (statbuf)
 970      POST_WRITE(statbuf, struct___old_kernel_stat_sz);
 971  }
 972}
 973
 974PRE_SYSCALL(fstat)(long fd, void *statbuf) {}
 975
 976POST_SYSCALL(fstat)(long res, long fd, void *statbuf) {
 977  if (res >= 0) {
 978    if (statbuf)
 979      POST_WRITE(statbuf, struct___old_kernel_stat_sz);
 980  }
 981}
 982
 983PRE_SYSCALL(newstat)(const void *filename, void *statbuf) {
 984  if (filename)
 985    PRE_READ(filename,
 986             __sanitizer::internal_strlen((const char *)filename) + 1);
 987}
 988
 989POST_SYSCALL(newstat)(long res, const void *filename, void *statbuf) {
 990  if (res >= 0) {
 991    if (statbuf)
 992      POST_WRITE(statbuf, struct_kernel_stat_sz);
 993  }
 994}
 995
 996PRE_SYSCALL(newlstat)(const void *filename, void *statbuf) {
 997  if (filename)
 998    PRE_READ(filename,
 999             __sanitizer::internal_strlen((const char *)filename) + 1);
1000}
1001
1002POST_SYSCALL(newlstat)(long res, const void *filename, void *statbuf) {
1003  if (res >= 0) {
1004    if (statbuf)
1005      POST_WRITE(statbuf, struct_kernel_stat_sz);
1006  }
1007}
1008
1009PRE_SYSCALL(newfstat)(long fd, void *statbuf) {}
1010
1011POST_SYSCALL(newfstat)(long res, long fd, void *statbuf) {
1012  if (res >= 0) {
1013    if (statbuf)
1014      POST_WRITE(statbuf, struct_kernel_stat_sz);
1015  }
1016}
1017
1018#  if SANITIZER_GLIBC
1019PRE_SYSCALL(ustat)(long dev, void *ubuf) {}
1020
1021POST_SYSCALL(ustat)(long res, long dev, void *ubuf) {
1022  if (res >= 0) {
1023    if (ubuf)
1024      POST_WRITE(ubuf, struct_ustat_sz);
1025  }
1026}
1027#  endif  // SANITIZER_GLIBC
1028
1029PRE_SYSCALL(stat64)(const void *filename, void *statbuf) {
1030  if (filename)
1031    PRE_READ(filename,
1032             __sanitizer::internal_strlen((const char *)filename) + 1);
1033}
1034
1035POST_SYSCALL(stat64)(long res, const void *filename, void *statbuf) {
1036  if (res >= 0) {
1037    if (statbuf)
1038      POST_WRITE(statbuf, struct_kernel_stat64_sz);
1039  }
1040}
1041
1042PRE_SYSCALL(fstat64)(long fd, void *statbuf) {}
1043
1044POST_SYSCALL(fstat64)(long res, long fd, void *statbuf) {
1045  if (res >= 0) {
1046    if (statbuf)
1047      POST_WRITE(statbuf, struct_kernel_stat64_sz);
1048  }
1049}
1050
1051PRE_SYSCALL(lstat64)(const void *filename, void *statbuf) {
1052  if (filename)
1053    PRE_READ(filename,
1054             __sanitizer::internal_strlen((const char *)filename) + 1);
1055}
1056
1057POST_SYSCALL(lstat64)(long res, const void *filename, void *statbuf) {
1058  if (res >= 0) {
1059    if (statbuf)
1060      POST_WRITE(statbuf, struct_kernel_stat64_sz);
1061  }
1062}
1063
1064PRE_SYSCALL(setxattr)
1065(const void *path, const void *name, const void *value, long size, long flags) {
1066  if (path)
1067    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
1068  if (name)
1069    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
1070  if (value)
1071    PRE_READ(value, size);
1072}
1073
1074POST_SYSCALL(setxattr)
1075(long res, const void *path, const void *name, const void *value, long size,
1076 long flags) {}
1077
1078PRE_SYSCALL(lsetxattr)
1079(const void *path, const void *name, const void *value, long size, long flags) {
1080  if (path)
1081    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
1082  if (name)
1083    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
1084  if (value)
1085    PRE_READ(value, size);
1086}
1087
1088POST_SYSCALL(lsetxattr)
1089(long res, const void *path, const void *name, const void *value, long size,
1090 long flags) {}
1091
1092PRE_SYSCALL(fsetxattr)
1093(long fd, const void *name, const void *value, long size, long flags) {
1094  if (name)
1095    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
1096  if (value)
1097    PRE_READ(value, size);
1098}
1099
1100POST_SYSCALL(fsetxattr)
1101(long res, long fd, const void *name, const void *value, long size,
1102 long flags) {}
1103
1104PRE_SYSCALL(getxattr)
1105(const void *path, const void *name, void *value, long size) {
1106  if (path)
1107    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
1108  if (name)
1109    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
1110}
1111
1112POST_SYSCALL(getxattr)
1113(long res, const void *path, const void *name, void *value, long size) {
1114  if (size && res > 0) {
1115    if (value)
1116      POST_WRITE(value, res);
1117  }
1118}
1119
1120PRE_SYSCALL(lgetxattr)
1121(const void *path, const void *name, void *value, long size) {
1122  if (path)
1123    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
1124  if (name)
1125    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
1126}
1127
1128POST_SYSCALL(lgetxattr)
1129(long res, const void *path, const void *name, void *value, long size) {
1130  if (size && res > 0) {
1131    if (value)
1132      POST_WRITE(value, res);
1133  }
1134}
1135
1136PRE_SYSCALL(fgetxattr)(long fd, const void *name, void *value, long size) {
1137  if (name)
1138    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
1139}
1140
1141POST_SYSCALL(fgetxattr)
1142(long res, long fd, const void *name, void *value, long size) {
1143  if (size && res > 0) {
1144    if (value)
1145      POST_WRITE(value, res);
1146  }
1147}
1148
1149PRE_SYSCALL(listxattr)(const void *path, void *list, long size) {
1150  if (path)
1151    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
1152}
1153
1154POST_SYSCALL(listxattr)(long res, const void *path, void *list, long size) {
1155  if (size && res > 0) {
1156    if (list)
1157      POST_WRITE(list, res);
1158  }
1159}
1160
1161PRE_SYSCALL(llistxattr)(const void *path, void *list, long size) {
1162  if (path)
1163    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
1164}
1165
1166POST_SYSCALL(llistxattr)(long res, const void *path, void *list, long size) {
1167  if (size && res > 0) {
1168    if (list)
1169      POST_WRITE(list, res);
1170  }
1171}
1172
1173PRE_SYSCALL(flistxattr)(long fd, void *list, long size) {}
1174
1175POST_SYSCALL(flistxattr)(long res, long fd, void *list, long size) {
1176  if (size && res > 0) {
1177    if (list)
1178      POST_WRITE(list, res);
1179  }
1180}
1181
1182PRE_SYSCALL(removexattr)(const void *path, const void *name) {
1183  if (path)
1184    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
1185  if (name)
1186    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
1187}
1188
1189POST_SYSCALL(removexattr)(long res, const void *path, const void *name) {}
1190
1191PRE_SYSCALL(lremovexattr)(const void *path, const void *name) {
1192  if (path)
1193    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
1194  if (name)
1195    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
1196}
1197
1198POST_SYSCALL(lremovexattr)(long res, const void *path, const void *name) {}
1199
1200PRE_SYSCALL(fremovexattr)(long fd, const void *name) {
1201  if (name)
1202    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
1203}
1204
1205POST_SYSCALL(fremovexattr)(long res, long fd, const void *name) {}
1206
1207PRE_SYSCALL(brk)(long brk) {}
1208
1209POST_SYSCALL(brk)(long res, long brk) {}
1210
1211PRE_SYSCALL(mprotect)(long start, long len, long prot) {}
1212
1213POST_SYSCALL(mprotect)(long res, long start, long len, long prot) {}
1214
1215PRE_SYSCALL(mremap)
1216(long addr, long old_len, long new_len, long flags, long new_addr) {}
1217
1218POST_SYSCALL(mremap)
1219(long res, long addr, long old_len, long new_len, long flags, long new_addr) {}
1220
1221PRE_SYSCALL(remap_file_pages)
1222(long start, long size, long prot, long pgoff, long flags) {}
1223
1224POST_SYSCALL(remap_file_pages)
1225(long res, long start, long size, long prot, long pgoff, long flags) {}
1226
1227PRE_SYSCALL(msync)(long start, long len, long flags) {}
1228
1229POST_SYSCALL(msync)(long res, long start, long len, long flags) {}
1230
1231PRE_SYSCALL(munmap)(long addr, long len) {}
1232
1233POST_SYSCALL(munmap)(long res, long addr, long len) {}
1234
1235PRE_SYSCALL(mlock)(long start, long len) {}
1236
1237POST_SYSCALL(mlock)(long res, long start, long len) {}
1238
1239PRE_SYSCALL(munlock)(long start, long len) {}
1240
1241POST_SYSCALL(munlock)(long res, long start, long len) {}
1242
1243PRE_SYSCALL(mlockall)(long flags) {}
1244
1245POST_SYSCALL(mlockall)(long res, long flags) {}
1246
1247PRE_SYSCALL(munlockall)() {}
1248
1249POST_SYSCALL(munlockall)(long res) {}
1250
1251PRE_SYSCALL(madvise)(long start, long len, long behavior) {}
1252
1253POST_SYSCALL(madvise)(long res, long start, long len, long behavior) {}
1254
1255PRE_SYSCALL(mincore)(long start, long len, void *vec) {}
1256
1257POST_SYSCALL(mincore)(long res, long start, long len, void *vec) {
1258  if (res >= 0) {
1259    if (vec) {
1260      POST_WRITE(vec, (len + GetPageSizeCached() - 1) / GetPageSizeCached());
1261    }
1262  }
1263}
1264
1265PRE_SYSCALL(pivot_root)(const void *new_root, const void *put_old) {
1266  if (new_root)
1267    PRE_READ(new_root,
1268             __sanitizer::internal_strlen((const char *)new_root) + 1);
1269  if (put_old)
1270    PRE_READ(put_old, __sanitizer::internal_strlen((const char *)put_old) + 1);
1271}
1272
1273POST_SYSCALL(pivot_root)(long res, const void *new_root, const void *put_old) {}
1274
1275PRE_SYSCALL(chroot)(const void *filename) {
1276  if (filename)
1277    PRE_READ(filename,
1278             __sanitizer::internal_strlen((const char *)filename) + 1);
1279}
1280
1281POST_SYSCALL(chroot)(long res, const void *filename) {}
1282
1283PRE_SYSCALL(mknod)(const void *filename, long mode, long dev) {
1284  if (filename)
1285    PRE_READ(filename,
1286             __sanitizer::internal_strlen((const char *)filename) + 1);
1287}
1288
1289POST_SYSCALL(mknod)(long res, const void *filename, long mode, long dev) {}
1290
1291PRE_SYSCALL(link)(const void *oldname, const void *newname) {
1292  if (oldname)
1293    PRE_READ(oldname, __sanitizer::internal_strlen((const char *)oldname) + 1);
1294  if (newname)
1295    PRE_READ(newname, __sanitizer::internal_strlen((const char *)newname) + 1);
1296}
1297
1298POST_SYSCALL(link)(long res, const void *oldname, const void *newname) {}
1299
1300PRE_SYSCALL(symlink)(const void *old, const void *new_) {
1301  if (old)
1302    PRE_READ(old, __sanitizer::internal_strlen((const char *)old) + 1);
1303  if (new_)
1304    PRE_READ(new_, __sanitizer::internal_strlen((const char *)new_) + 1);
1305}
1306
1307POST_SYSCALL(symlink)(long res, const void *old, const void *new_) {}
1308
1309PRE_SYSCALL(unlink)(const void *pathname) {
1310  if (pathname)
1311    PRE_READ(pathname,
1312             __sanitizer::internal_strlen((const char *)pathname) + 1);
1313}
1314
1315POST_SYSCALL(unlink)(long res, const void *pathname) {}
1316
1317PRE_SYSCALL(rename)(const void *oldname, const void *newname) {
1318  if (oldname)
1319    PRE_READ(oldname, __sanitizer::internal_strlen((const char *)oldname) + 1);
1320  if (newname)
1321    PRE_READ(newname, __sanitizer::internal_strlen((const char *)newname) + 1);
1322}
1323
1324POST_SYSCALL(rename)(long res, const void *oldname, const void *newname) {}
1325
1326PRE_SYSCALL(chmod)(const void *filename, long mode) {
1327  if (filename)
1328    PRE_READ(filename,
1329             __sanitizer::internal_strlen((const char *)filename) + 1);
1330}
1331
1332POST_SYSCALL(chmod)(long res, const void *filename, long mode) {}
1333
1334PRE_SYSCALL(fchmod)(long fd, long mode) {}
1335
1336POST_SYSCALL(fchmod)(long res, long fd, long mode) {}
1337
1338PRE_SYSCALL(fcntl)(long fd, long cmd, long arg) {}
1339
1340POST_SYSCALL(fcntl)(long res, long fd, long cmd, long arg) {}
1341
1342PRE_SYSCALL(fcntl64)(long fd, long cmd, long arg) {}
1343
1344POST_SYSCALL(fcntl64)(long res, long fd, long cmd, long arg) {}
1345
1346PRE_SYSCALL(pipe)(void *fildes) {}
1347
1348POST_SYSCALL(pipe)(long res, void *fildes) {
1349  if (res >= 0)
1350    if (fildes)
1351      POST_WRITE(fildes, sizeof(int) * 2);
1352}
1353
1354PRE_SYSCALL(pipe2)(void *fildes, long flags) {}
1355
1356POST_SYSCALL(pipe2)(long res, void *fildes, long flags) {
1357  if (res >= 0)
1358    if (fildes)
1359      POST_WRITE(fildes, sizeof(int) * 2);
1360}
1361
1362PRE_SYSCALL(dup)(long fildes) {}
1363
1364POST_SYSCALL(dup)(long res, long fildes) {}
1365
1366PRE_SYSCALL(dup2)(long oldfd, long newfd) {}
1367
1368POST_SYSCALL(dup2)(long res, long oldfd, long newfd) {}
1369
1370PRE_SYSCALL(dup3)(long oldfd, long newfd, long flags) {}
1371
1372POST_SYSCALL(dup3)(long res, long oldfd, long newfd, long flags) {}
1373
1374PRE_SYSCALL(ioperm)(long from, long num, long on) {}
1375
1376POST_SYSCALL(ioperm)(long res, long from, long num, long on) {}
1377
1378PRE_SYSCALL(ioctl)(long fd, long cmd, long arg) {}
1379
1380POST_SYSCALL(ioctl)(long res, long fd, long cmd, long arg) {}
1381
1382PRE_SYSCALL(flock)(long fd, long cmd) {}
1383
1384POST_SYSCALL(flock)(long res, long fd, long cmd) {}
1385
1386PRE_SYSCALL(io_setup)(long nr_reqs, void **ctx) {
1387  if (ctx)
1388    PRE_WRITE(ctx, sizeof(*ctx));
1389}
1390
1391POST_SYSCALL(io_setup)(long res, long nr_reqs, void **ctx) {
1392  if (res >= 0 && ctx) {
1393    POST_WRITE(ctx, sizeof(*ctx));
1394    // (*ctx) is actually a pointer to a kernel mapped page, and there are
1395    // people out there who are crazy enough to peek into that page's 32-byte
1396    // header.
1397    if (*ctx)
1398      POST_WRITE(*ctx, 32);
1399  }
1400}
1401
1402PRE_SYSCALL(io_destroy)(long ctx) {}
1403
1404POST_SYSCALL(io_destroy)(long res, long ctx) {}
1405
1406PRE_SYSCALL(io_getevents)
1407(long ctx_id, long min_nr, long nr, __sanitizer_io_event *ioevpp,
1408 void *timeout) {
1409  if (timeout)
1410    PRE_READ(timeout, struct_timespec_sz);
1411}
1412
1413POST_SYSCALL(io_getevents)
1414(long res, long ctx_id, long min_nr, long nr, __sanitizer_io_event *ioevpp,
1415 void *timeout) {
1416  if (res >= 0) {
1417    if (ioevpp)
1418      POST_WRITE(ioevpp, res * sizeof(*ioevpp));
1419    if (timeout)
1420      POST_WRITE(timeout, struct_timespec_sz);
1421  }
1422  for (long i = 0; i < res; i++) {
1423    // We synchronize io_submit -> io_getevents/io_cancel using the
1424    // user-provided data context. Data is not necessary a pointer, it can be
1425    // an int, 0 or whatever; acquire/release will correctly handle this.
1426    // This scheme can lead to false negatives, e.g. when all operations
1427    // synchronize on 0. But there does not seem to be a better solution
1428    // (except wrapping all operations in own context, which is unreliable).
1429    // We can not reliably extract fildes in io_getevents.
1430    COMMON_SYSCALL_ACQUIRE((void *)ioevpp[i].data);
1431  }
1432}
1433
1434PRE_SYSCALL(io_submit)(long ctx_id, long nr, __sanitizer_iocb **iocbpp) {
1435  for (long i = 0; i < nr; ++i) {
1436    uptr op = iocbpp[i]->aio_lio_opcode;
1437    void *data = (void *)iocbpp[i]->aio_data;
1438    void *buf = (void *)iocbpp[i]->aio_buf;
1439    uptr len = (uptr)iocbpp[i]->aio_nbytes;
1440    if (op == iocb_cmd_pwrite && buf && len) {
1441      PRE_READ(buf, len);
1442    } else if (op == iocb_cmd_pread && buf && len) {
1443      POST_WRITE(buf, len);
1444    } else if (op == iocb_cmd_pwritev) {
1445      __sanitizer_iovec *iovec = (__sanitizer_iovec *)buf;
1446      for (uptr v = 0; v < len; v++)
1447        PRE_READ(iovec[v].iov_base, iovec[v].iov_len);
1448    } else if (op == iocb_cmd_preadv) {
1449      __sanitizer_iovec *iovec = (__sanitizer_iovec *)buf;
1450      for (uptr v = 0; v < len; v++)
1451        POST_WRITE(iovec[v].iov_base, iovec[v].iov_len);
1452    }
1453    // See comment in io_getevents.
1454    COMMON_SYSCALL_RELEASE(data);
1455  }
1456}
1457
1458POST_SYSCALL(io_submit)
1459(long res, long ctx_id, long nr, __sanitizer_iocb **iocbpp) {}
1460
1461PRE_SYSCALL(io_cancel)
1462(long ctx_id, __sanitizer_iocb *iocb, __sanitizer_io_event *result) {}
1463
1464POST_SYSCALL(io_cancel)
1465(long res, long ctx_id, __sanitizer_iocb *iocb, __sanitizer_io_event *result) {
1466  if (res == 0) {
1467    if (result) {
1468      // See comment in io_getevents.
1469      COMMON_SYSCALL_ACQUIRE((void *)result->data);
1470      POST_WRITE(result, sizeof(*result));
1471    }
1472    if (iocb)
1473      POST_WRITE(iocb, sizeof(*iocb));
1474  }
1475}
1476
1477PRE_SYSCALL(sendfile)(long out_fd, long in_fd, void *offset, long count) {}
1478
1479POST_SYSCALL(sendfile)
1480(long res, long out_fd, long in_fd, __sanitizer___kernel_off_t *offset,
1481 long count) {
1482  if (res >= 0) {
1483    if (offset)
1484      POST_WRITE(offset, sizeof(*offset));
1485  }
1486}
1487
1488PRE_SYSCALL(sendfile64)(long out_fd, long in_fd, void *offset, long count) {}
1489
1490POST_SYSCALL(sendfile64)
1491(long res, long out_fd, long in_fd, __sanitizer___kernel_loff_t *offset,
1492 long count) {
1493  if (res >= 0) {
1494    if (offset)
1495      POST_WRITE(offset, sizeof(*offset));
1496  }
1497}
1498
1499PRE_SYSCALL(readlink)(const void *path, void *buf, long bufsiz) {
1500  if (path)
1501    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
1502}
1503
1504POST_SYSCALL(readlink)(long res, const void *path, void *buf, long bufsiz) {
1505  if (res >= 0) {
1506    if (buf)
1507      POST_WRITE(buf, __sanitizer::internal_strlen((const char *)buf) + 1);
1508  }
1509}
1510
1511PRE_SYSCALL(creat)(const void *pathname, long mode) {
1512  if (pathname)
1513    PRE_READ(pathname,
1514             __sanitizer::internal_strlen((const char *)pathname) + 1);
1515}
1516
1517POST_SYSCALL(creat)(long res, const void *pathname, long mode) {}
1518
1519PRE_SYSCALL(open)(const void *filename, long flags, long mode) {
1520  if (filename)
1521    PRE_READ(filename,
1522             __sanitizer::internal_strlen((const char *)filename) + 1);
1523}
1524
1525POST_SYSCALL(open)(long res, const void *filename, long flags, long mode) {}
1526
1527PRE_SYSCALL(close)(long fd) { COMMON_SYSCALL_FD_CLOSE((int)fd); }
1528
1529POST_SYSCALL(close)(long res, long fd) {}
1530
1531PRE_SYSCALL(access)(const void *filename, long mode) {
1532  if (filename)
1533    PRE_READ(filename,
1534             __sanitizer::internal_strlen((const char *)filename) + 1);
1535}
1536
1537POST_SYSCALL(access)(long res, const void *filename, long mode) {}
1538
1539PRE_SYSCALL(vhangup)() {}
1540
1541POST_SYSCALL(vhangup)(long res) {}
1542
1543PRE_SYSCALL(chown)(const void *filename, long user, long group) {
1544  if (filename)
1545    PRE_READ(filename,
1546             __sanitizer::internal_strlen((const char *)filename) + 1);
1547}
1548
1549POST_SYSCALL(chown)(long res, const void *filename, long user, long group) {}
1550
1551PRE_SYSCALL(lchown)(const void *filename, long user, long group) {
1552  if (filename)
1553    PRE_READ(filename,
1554             __sanitizer::internal_strlen((const char *)filename) + 1);
1555}
1556
1557POST_SYSCALL(lchown)(long res, const void *filename, long user, long group) {}
1558
1559PRE_SYSCALL(fchown)(long fd, long user, long group) {}
1560
1561POST_SYSCALL(fchown)(long res, long fd, long user, long group) {}
1562
1563#  if SANITIZER_USES_UID16_SYSCALLS
1564PRE_SYSCALL(chown16)(const void *filename, long user, long group) {
1565  if (filename)
1566    PRE_READ(filename,
1567             __sanitizer::internal_strlen((const char *)filename) + 1);
1568}
1569
1570POST_SYSCALL(chown16)(long res, const void *filename, long user, long group) {}
1571
1572PRE_SYSCALL(lchown16)(const void *filename, long user, long group) {
1573  if (filename)
1574    PRE_READ(filename,
1575             __sanitizer::internal_strlen((const char *)filename) + 1);
1576}
1577
1578POST_SYSCALL(lchown16)(long res, const void *filename, long user, long group) {}
1579
1580PRE_SYSCALL(fchown16)(long fd, long user, long group) {}
1581
1582POST_SYSCALL(fchown16)(long res, long fd, long user, long group) {}
1583
1584PRE_SYSCALL(setregid16)(long rgid, long egid) {}
1585
1586POST_SYSCALL(setregid16)(long res, long rgid, long egid) {}
1587
1588PRE_SYSCALL(setgid16)(long gid) {}
1589
1590POST_SYSCALL(setgid16)(long res, long gid) {}
1591
1592PRE_SYSCALL(setreuid16)(long ruid, long euid) {}
1593
1594POST_SYSCALL(setreuid16)(long res, long ruid, long euid) {}
1595
1596PRE_SYSCALL(setuid16)(long uid) {}
1597
1598POST_SYSCALL(setuid16)(long res, long uid) {}
1599
1600PRE_SYSCALL(setresuid16)(long ruid, long euid, long suid) {}
1601
1602POST_SYSCALL(setresuid16)(long res, long ruid, long euid, long suid) {}
1603
1604PRE_SYSCALL(getresuid16)(void *ruid, void *euid, void *suid) {}
1605
1606POST_SYSCALL(getresuid16)
1607(long res, __sanitizer___kernel_old_uid_t *ruid,
1608 __sanitizer___kernel_old_uid_t *euid, __sanitizer___kernel_old_uid_t *suid) {
1609  if (res >= 0) {
1610    if (ruid)
1611      POST_WRITE(ruid, sizeof(*ruid));
1612    if (euid)
1613      POST_WRITE(euid, sizeof(*euid));
1614    if (suid)
1615      POST_WRITE(suid, sizeof(*suid));
1616  }
1617}
1618
1619PRE_SYSCALL(setresgid16)(long rgid, long egid, long sgid) {}
1620
1621POST_SYSCALL(setresgid16)(long res, long rgid, long egid, long sgid) {}
1622
1623PRE_SYSCALL(getresgid16)(void *rgid, void *egid, void *sgid) {}
1624
1625POST_SYSCALL(getresgid16)
1626(long res, __sanitizer___kernel_old_gid_t *rgid,
1627 __sanitizer___kernel_old_gid_t *egid, __sanitizer___kernel_old_gid_t *sgid) {
1628  if (res >= 0) {
1629    if (rgid)
1630      POST_WRITE(rgid, sizeof(*rgid));
1631    if (egid)
1632      POST_WRITE(egid, sizeof(*egid));
1633    if (sgid)
1634      POST_WRITE(sgid, sizeof(*sgid));
1635  }
1636}
1637
1638PRE_SYSCALL(setfsuid16)(long uid) {}
1639
1640POST_SYSCALL(setfsuid16)(long res, long uid) {}
1641
1642PRE_SYSCALL(setfsgid16)(long gid) {}
1643
1644POST_SYSCALL(setfsgid16)(long res, long gid) {}
1645
1646PRE_SYSCALL(getgroups16)
1647(long gidsetsize, __sanitizer___kernel_old_gid_t *grouplist) {}
1648
1649POST_SYSCALL(getgroups16)
1650(long res, long gidsetsize, __sanitizer___kernel_old_gid_t *grouplist) {
1651  if (res >= 0) {
1652    if (grouplist)
1653      POST_WRITE(grouplist, res * sizeof(*grouplist));
1654  }
1655}
1656
1657PRE_SYSCALL(setgroups16)
1658(long gidsetsize, __sanitizer___kernel_old_gid_t *grouplist) {
1659  if (grouplist)
1660    POST_WRITE(grouplist, gidsetsize * sizeof(*grouplist));
1661}
1662
1663POST_SYSCALL(setgroups16)
1664(long res, long gidsetsize, __sanitizer___kernel_old_gid_t *grouplist) {}
1665
1666PRE_SYSCALL(getuid16)() {}
1667
1668POST_SYSCALL(getuid16)(long res) {}
1669
1670PRE_SYSCALL(geteuid16)() {}
1671
1672POST_SYSCALL(geteuid16)(long res) {}
1673
1674PRE_SYSCALL(getgid16)() {}
1675
1676POST_SYSCALL(getgid16)(long res) {}
1677
1678PRE_SYSCALL(getegid16)() {}
1679
1680POST_SYSCALL(getegid16)(long res) {}
1681#  endif  // SANITIZER_USES_UID16_SYSCALLS
1682
1683PRE_SYSCALL(utime)(void *filename, void *times) {}
1684
1685POST_SYSCALL(utime)(long res, void *filename, void *times) {
1686  if (res >= 0) {
1687    if (filename)
1688      POST_WRITE(filename,
1689                 __sanitizer::internal_strlen((const char *)filename) + 1);
1690    if (times)
1691      POST_WRITE(times, struct_utimbuf_sz);
1692  }
1693}
1694
1695PRE_SYSCALL(utimes)(void *filename, void *utimes) {}
1696
1697POST_SYSCALL(utimes)(long res, void *filename, void *utimes) {
1698  if (res >= 0) {
1699    if (filename)
1700      POST_WRITE(filename,
1701                 __sanitizer::internal_strlen((const char *)filename) + 1);
1702    if (utimes)
1703      POST_WRITE(utimes, timeval_sz);
1704  }
1705}
1706
1707PRE_SYSCALL(lseek)(long fd, long offset, long origin) {}
1708
1709POST_SYSCALL(lseek)(long res, long fd, long offset, long origin) {}
1710
1711PRE_SYSCALL(llseek)
1712(long fd, long offset_high, long offset_low, void *result, long origin) {}
1713
1714POST_SYSCALL(llseek)
1715(long res, long fd, long offset_high, long offset_low, void *result,
1716 long origin) {
1717  if (res >= 0) {
1718    if (result)
1719      POST_WRITE(result, sizeof(long long));
1720  }
1721}
1722
1723PRE_SYSCALL(readv)(long fd, const __sanitizer_iovec *vec, long vlen) {}
1724
1725POST_SYSCALL(readv)
1726(long res, long fd, const __sanitizer_iovec *vec, long vlen) {
1727  if (res >= 0) {
1728    if (vec)
1729      kernel_write_iovec(vec, vlen, res);
1730  }
1731}
1732
1733PRE_SYSCALL(write)(long fd, const void *buf, long count) {
1734  if (buf)
1735    PRE_READ(buf, count);
1736}
1737
1738POST_SYSCALL(write)(long res, long fd, const void *buf, long count) {}
1739
1740PRE_SYSCALL(writev)(long fd, const __sanitizer_iovec *vec, long vlen) {}
1741
1742POST_SYSCALL(writev)
1743(long res, long fd, const __sanitizer_iovec *vec, long vlen) {
1744  if (res >= 0) {
1745    if (vec)
1746      kernel_read_iovec(vec, vlen, res);
1747  }
1748}
1749
1750#  ifdef _LP64
1751PRE_SYSCALL(pread64)(long fd, void *buf, long count, long pos) {}
1752
1753POST_SYSCALL(pread64)(long res, long fd, void *buf, long count, long pos) {
1754  if (res >= 0) {
1755    if (buf)
1756      POST_WRITE(buf, res);
1757  }
1758}
1759
1760PRE_SYSCALL(pwrite64)(long fd, const void *buf, long count, long pos) {
1761  if (buf)
1762    PRE_READ(buf, count);
1763}
1764
1765POST_SYSCALL(pwrite64)
1766(long res, long fd, const void *buf, long count, long pos) {}
1767#  else
1768PRE_SYSCALL(pread64)(long fd, void *buf, long count, long pos0, long pos1) {}
1769
1770POST_SYSCALL(pread64)
1771(long res, long fd, void *buf, long count, long pos0, long pos1) {
1772  if (res >= 0) {
1773    if (buf)
1774      POST_WRITE(buf, res);
1775  }
1776}
1777
1778PRE_SYSCALL(pwrite64)
1779(long fd, const void *buf, long count, long pos0, long pos1) {
1780  if (buf)
1781    PRE_READ(buf, count);
1782}
1783
1784POST_SYSCALL(pwrite64)
1785(long res, long fd, const void *buf, long count, long pos0, long pos1) {}
1786#  endif
1787
1788PRE_SYSCALL(preadv)
1789(long fd, const __sanitizer_iovec *vec, long vlen, long pos_l, long pos_h) {}
1790
1791POST_SYSCALL(preadv)
1792(long res, long fd, const __sanitizer_iovec *vec, long vlen, long pos_l,
1793 long pos_h) {
1794  if (res >= 0) {
1795    if (vec)
1796      kernel_write_iovec(vec, vlen, res);
1797  }
1798}
1799
1800PRE_SYSCALL(pwritev)
1801(long fd, const __sanitizer_iovec *vec, long vlen, long pos_l, long pos_h) {}
1802
1803POST_SYSCALL(pwritev)
1804(long res, long fd, const __sanitizer_iovec *vec, long vlen, long pos_l,
1805 long pos_h) {
1806  if (res >= 0) {
1807    if (vec)
1808      kernel_read_iovec(vec, vlen, res);
1809  }
1810}
1811
1812PRE_SYSCALL(getcwd)(void *buf, long size) {}
1813
1814POST_SYSCALL(getcwd)(long res, void *buf, long size) {
1815  if (res >= 0) {
1816    if (buf)
1817      POST_WRITE(buf, __sanitizer::internal_strlen((const char *)buf) + 1);
1818  }
1819}
1820
1821PRE_SYSCALL(mkdir)(const void *pathname, long mode) {
1822  if (pathname)
1823    PRE_READ(pathname,
1824             __sanitizer::internal_strlen((const char *)pathname) + 1);
1825}
1826
1827POST_SYSCALL(mkdir)(long res, const void *pathname, long mode) {}
1828
1829PRE_SYSCALL(chdir)(const void *filename) {
1830  if (filename)
1831    PRE_READ(filename,
1832             __sanitizer::internal_strlen((const char *)filename) + 1);
1833}
1834
1835POST_SYSCALL(chdir)(long res, const void *filename) {}
1836
1837PRE_SYSCALL(fchdir)(long fd) {}
1838
1839POST_SYSCALL(fchdir)(long res, long fd) {}
1840
1841PRE_SYSCALL(rmdir)(const void *pathname) {
1842  if (pathname)
1843    PRE_READ(pathname,
1844             __sanitizer::internal_strlen((const char *)pathname) + 1);
1845}
1846
1847POST_SYSCALL(rmdir)(long res, const void *pathname) {}
1848
1849PRE_SYSCALL(lookup_dcookie)(u64 cookie64, void *buf, long len) {}
1850
1851POST_SYSCALL(lookup_dcookie)(long res, u64 cookie64, void *buf, long len) {
1852  if (res >= 0) {
1853    if (buf)
1854      POST_WRITE(buf, __sanitizer::internal_strlen((const char *)buf) + 1);
1855  }
1856}
1857
1858PRE_SYSCALL(quotactl)(long cmd, const void *special, long id, void *addr) {
1859  if (special)
1860    PRE_READ(special, __sanitizer::internal_strlen((const char *)special) + 1);
1861}
1862
1863POST_SYSCALL(quotactl)
1864(long res, long cmd, const void *special, long id, void *addr) {}
1865
1866PRE_SYSCALL(getdents)(long fd, void *dirent, long count) {}
1867
1868POST_SYSCALL(getdents)(long res, long fd, void *dirent, long count) {
1869  if (res >= 0) {
1870    if (dirent)
1871      POST_WRITE(dirent, res);
1872  }
1873}
1874
1875PRE_SYSCALL(getdents64)(long fd, void *dirent, long count) {}
1876
1877POST_SYSCALL(getdents64)(long res, long fd, void *dirent, long count) {
1878  if (res >= 0) {
1879    if (dirent)
1880      POST_WRITE(dirent, res);
1881  }
1882}
1883
1884PRE_SYSCALL(setsockopt)
1885(long fd, long level, long optname, void *optval, long optlen) {}
1886
1887POST_SYSCALL(setsockopt)
1888(long res, long fd, long level, long optname, void *optval, long optlen) {
1889  if (res >= 0) {
1890    if (optval)
1891      POST_WRITE(optval,
1892                 __sanitizer::internal_strlen((const char *)optval) + 1);
1893  }
1894}
1895
1896PRE_SYSCALL(getsockopt)
1897(long fd, long level, long optname, void *optval, void *optlen) {}
1898
1899POST_SYSCALL(getsockopt)
1900(long res, long fd, long level, long optname, void *optval, void *optlen) {
1901  if (res >= 0) {
1902    if (optval)
1903      POST_WRITE(optval,
1904                 __sanitizer::internal_strlen((const char *)optval) + 1);
1905    if (optlen)
1906      POST_WRITE(optlen, sizeof(int));
1907  }
1908}
1909
1910PRE_SYSCALL(bind)(long arg0, sanitizer_kernel_sockaddr *arg1, long arg2) {}
1911
1912POST_SYSCALL(bind)
1913(long res, long arg0, sanitizer_kernel_sockaddr *arg1, long arg2) {
1914  if (res >= 0) {
1915    if (arg1)
1916      POST_WRITE(arg1, sizeof(*arg1));
1917  }
1918}
1919
1920PRE_SYSCALL(connect)(long arg0, sanitizer_kernel_sockaddr *arg1, long arg2) {}
1921
1922POST_SYSCALL(connect)
1923(long res, long arg0, sanitizer_kernel_sockaddr *arg1, long arg2) {
1924  if (res >= 0) {
1925    if (arg1)
1926      POST_WRITE(arg1, sizeof(*arg1));
1927  }
1928}
1929
1930PRE_SYSCALL(accept)(long arg0, sanitizer_kernel_sockaddr *arg1, void *arg2) {}
1931
1932POST_SYSCALL(accept)
1933(long res, long arg0, sanitizer_kernel_sockaddr *arg1, void *arg2) {
1934  if (res >= 0) {
1935    if (arg1)
1936      POST_WRITE(arg1, sizeof(*arg1));
1937    if (arg2)
1938      POST_WRITE(arg2, sizeof(unsigned));
1939  }
1940}
1941
1942PRE_SYSCALL(accept4)
1943(long arg0, sanitizer_kernel_sockaddr *arg1, void *arg2, long arg3) {}
1944
1945POST_SYSCALL(accept4)
1946(long res, long arg0, sanitizer_kernel_sockaddr *arg1, void *arg2, long arg3) {
1947  if (res >= 0) {
1948    if (arg1)
1949      POST_WRITE(arg1, sizeof(*arg1));
1950    if (arg2)
1951      POST_WRITE(arg2, sizeof(unsigned));
1952  }
1953}
1954
1955PRE_SYSCALL(getsockname)
1956(long arg0, sanitizer_kernel_sockaddr *arg1, void *arg2) {}
1957
1958POST_SYSCALL(getsockname)
1959(long res, long arg0, sanitizer_kernel_sockaddr *arg1, void *arg2) {
1960  if (res >= 0) {
1961    if (arg1)
1962      POST_WRITE(arg1, sizeof(*arg1));
1963    if (arg2)
1964      POST_WRITE(arg2, sizeof(unsigned));
1965  }
1966}
1967
1968PRE_SYSCALL(getpeername)
1969(long arg0, sanitizer_kernel_sockaddr *arg1, void *arg2) {}
1970
1971POST_SYSCALL(getpeername)
1972(long res, long arg0, sanitizer_kernel_sockaddr *arg1, void *arg2) {
1973  if (res >= 0) {
1974    if (arg1)
1975      POST_WRITE(arg1, sizeof(*arg1));
1976    if (arg2)
1977      POST_WRITE(arg2, sizeof(unsigned));
1978  }
1979}
1980
1981PRE_SYSCALL(send)(long arg0, void *arg1, long arg2, long arg3) {}
1982
1983POST_SYSCALL(send)(long res, long arg0, void *arg1, long arg2, long arg3) {
1984  if (res) {
1985    if (arg1)
1986      POST_READ(arg1, res);
1987  }
1988}
1989
1990PRE_SYSCALL(sendto)
1991(long arg0, void *arg1, long arg2, long arg3, sanitizer_kernel_sockaddr *arg4,
1992 long arg5) {}
1993
1994POST_SYSCALL(sendto)
1995(long res, long arg0, void *arg1, long arg2, long arg3,
1996 sanitizer_kernel_sockaddr *arg4, long arg5) {
1997  if (res >= 0) {
1998    if (arg1)
1999      POST_READ(arg1, res);
2000    if (arg4)
2001      POST_WRITE(arg4, sizeof(*arg4));
2002  }
2003}
2004
2005PRE_SYSCALL(sendmsg)(long fd, void *msg, long flags) {}
2006
2007POST_SYSCALL(sendmsg)(long res, long fd, void *msg, long flags) {
2008  // FIXME: POST_READ
2009}
2010
2011PRE_SYSCALL(sendmmsg)(long fd, void *msg, long vlen, long flags) {}
2012
2013POST_SYSCALL(sendmmsg)(long res, long fd, void *msg, long vlen, long flags) {
2014  // FIXME: POST_READ
2015}
2016
2017PRE_SYSCALL(recv)(long arg0, void *buf, long len, long flags) {}
2018
2019POST_SYSCALL(recv)(long res, void *buf, long len, long flags) {
2020  if (res >= 0) {
2021    if (buf)
2022      POST_WRITE(buf, res);
2023  }
2024}
2025
2026PRE_SYSCALL(recvfrom)
2027(long arg0, void *buf, long len, long flags, sanitizer_kernel_sockaddr *arg4,
2028 void *arg5) {}
2029
2030POST_SYSCALL(recvfrom)
2031(long res, long arg0, void *buf, long len, long flags,
2032 sanitizer_kernel_sockaddr *arg4, void *arg5) {
2033  if (res >= 0) {
2034    if (buf)
2035      POST_WRITE(buf, res);
2036    if (arg4)
2037      POST_WRITE(arg4, sizeof(*arg4));
2038    if (arg5)
2039      POST_WRITE(arg5, sizeof(int));
2040  }
2041}
2042
2043PRE_SYSCALL(socket)(long arg0, long arg1, long arg2) {}
2044
2045POST_SYSCALL(socket)(long res, long arg0, long arg1, long arg2) {}
2046
2047PRE_SYSCALL(socketpair)(long arg0, long arg1, long arg2, int *sv) {}
2048
2049POST_SYSCALL(socketpair)(long res, long arg0, long arg1, long arg2, int *sv) {
2050  if (res >= 0)
2051    if (sv)
2052      POST_WRITE(sv, sizeof(int) * 2);
2053}
2054
2055PRE_SYSCALL(socketcall)(long call, void *args) {}
2056
2057POST_SYSCALL(socketcall)(long res, long call, void *args) {
2058  if (res >= 0) {
2059    if (args)
2060      POST_WRITE(args, sizeof(long));
2061  }
2062}
2063
2064PRE_SYSCALL(listen)(long arg0, long arg1) {}
2065
2066POST_SYSCALL(listen)(long res, long arg0, long arg1) {}
2067
2068PRE_SYSCALL(poll)(void *ufds, long nfds, long timeout) {}
2069
2070POST_SYSCALL(poll)
2071(long res, __sanitizer_pollfd *ufds, long nfds, long timeout) {
2072  if (res >= 0) {
2073    if (ufds)
2074      POST_WRITE(ufds, nfds * sizeof(*ufds));
2075  }
2076}
2077
2078PRE_SYSCALL(select)
2079(long n, __sanitizer___kernel_fd_set *inp, __sanitizer___kernel_fd_set *outp,
2080 __sanitizer___kernel_fd_set *exp, void *tvp) {}
2081
2082POST_SYSCALL(select)
2083(long res, long n, __sanitizer___kernel_fd_set *inp,
2084 __sanitizer___kernel_fd_set *outp, __sanitizer___kernel_fd_set *exp,
2085 void *tvp) {
2086  if (res >= 0) {
2087    if (inp)
2088      POST_WRITE(inp, sizeof(*inp));
2089    if (outp)
2090      POST_WRITE(outp, sizeof(*outp));
2091    if (exp)
2092      POST_WRITE(exp, sizeof(*exp));
2093    if (tvp)
2094      POST_WRITE(tvp, timeval_sz);
2095  }
2096}
2097
2098PRE_SYSCALL(old_select)(void *arg) {}
2099
2100POST_SYSCALL(old_select)(long res, void *arg) {}
2101
2102PRE_SYSCALL(epoll_create)(long size) {}
2103
2104POST_SYSCALL(epoll_create)(long res, long size) {}
2105
2106PRE_SYSCALL(epoll_create1)(long flags) {}
2107
2108POST_SYSCALL(epoll_create1)(long res, long flags) {}
2109
2110PRE_SYSCALL(epoll_ctl)(long epfd, long op, long fd, void *event) {}
2111
2112POST_SYSCALL(epoll_ctl)(long res, long epfd, long op, long fd, void *event) {
2113  if (res >= 0) {
2114    if (event)
2115      POST_WRITE(event, struct_epoll_event_sz);
2116  }
2117}
2118
2119PRE_SYSCALL(epoll_wait)
2120(long epfd, void *events, long maxevents, long timeout) {}
2121
2122POST_SYSCALL(epoll_wait)
2123(long res, long epfd, void *events, long maxevents, long timeout) {
2124  if (res >= 0) {
2125    COMMON_SYSCALL_FD_ACQUIRE(epfd);
2126    if (events)
2127      POST_WRITE(events, res * struct_epoll_event_sz);
2128  }
2129}
2130
2131PRE_SYSCALL(epoll_pwait)
2132(long epfd, void *events, long maxevents, long timeout,
2133 const kernel_sigset_t *sigmask, long sigsetsize) {
2134  if (sigmask)
2135    PRE_READ(sigmask, sigsetsize);
2136}
2137
2138POST_SYSCALL(epoll_pwait)
2139(long res, long epfd, void *events, long maxevents, long timeout,
2140 const void *sigmask, long sigsetsize) {
2141  if (res >= 0) {
2142    COMMON_SYSCALL_FD_ACQUIRE(epfd);
2143    if (events)
2144      POST_WRITE(events, res * struct_epoll_event_sz);
2145  }
2146}
2147
2148PRE_SYSCALL(epoll_pwait2)
2149(long epfd, void *events, long maxevents,
2150 const sanitizer_kernel_timespec *timeout, const kernel_sigset_t *sigmask,
2151 long sigsetsize) {
2152  if (timeout)
2153    PRE_READ(timeout, sizeof(*timeout));
2154  if (sigmask)
2155    PRE_READ(sigmask, sigsetsize);
2156}
2157
2158POST_SYSCALL(epoll_pwait2)
2159(long res, long epfd, void *events, long maxevents,
2160 const sanitizer_kernel_timespec *timeout, const void *sigmask,
2161 long sigsetsize) {
2162  if (res >= 0) {
2163    COMMON_SYSCALL_FD_ACQUIRE(epfd);
2164    if (events)
2165      POST_WRITE(events, res * struct_epoll_event_sz);
2166  }
2167}
2168
2169PRE_SYSCALL(gethostname)(void *name, long len) {}
2170
2171POST_SYSCALL(gethostname)(long res, void *name, long len) {
2172  if (res >= 0) {
2173    if (name)
2174      POST_WRITE(name, __sanitizer::internal_strlen((const char *)name) + 1);
2175  }
2176}
2177
2178PRE_SYSCALL(sethostname)(void *name, long len) {}
2179
2180POST_SYSCALL(sethostname)(long res, void *name, long len) {
2181  if (res >= 0) {
2182    if (name)
2183      POST_WRITE(name, __sanitizer::internal_strlen((const char *)name) + 1);
2184  }
2185}
2186
2187PRE_SYSCALL(setdomainname)(void *name, long len) {}
2188
2189POST_SYSCALL(setdomainname)(long res, void *name, long len) {
2190  if (res >= 0) {
2191    if (name)
2192      POST_WRITE(name, __sanitizer::internal_strlen((const char *)name) + 1);
2193  }
2194}
2195
2196PRE_SYSCALL(newuname)(void *name) {}
2197
2198POST_SYSCALL(newuname)(long res, void *name) {
2199  if (res >= 0) {
2200    if (name)
2201      POST_WRITE(name, struct_new_utsname_sz);
2202  }
2203}
2204
2205PRE_SYSCALL(uname)(void *arg0) {}
2206
2207POST_SYSCALL(uname)(long res, void *arg0) {
2208  if (res >= 0) {
2209    if (arg0)
2210      POST_WRITE(arg0, struct_old_utsname_sz);
2211  }
2212}
2213
2214PRE_SYSCALL(olduname)(void *arg0) {}
2215
2216POST_SYSCALL(olduname)(long res, void *arg0) {
2217  if (res >= 0) {
2218    if (arg0)
2219      POST_WRITE(arg0, struct_oldold_utsname_sz);
2220  }
2221}
2222
2223PRE_SYSCALL(getrlimit)(long resource, void *rlim) {}
2224
2225POST_SYSCALL(getrlimit)(long res, long resource, void *rlim) {
2226  if (res >= 0) {
2227    if (rlim)
2228      POST_WRITE(rlim, struct_rlimit_sz);
2229  }
2230}
2231
2232PRE_SYSCALL(old_getrlimit)(long resource, void *rlim) {}
2233
2234POST_SYSCALL(old_getrlimit)(long res, long resource, void *rlim) {
2235  if (res >= 0) {
2236    if (rlim)
2237      POST_WRITE(rlim, struct_rlimit_sz);
2238  }
2239}
2240
2241PRE_SYSCALL(setrlimit)(long resource, void *rlim) {}
2242
2243POST_SYSCALL(setrlimit)(long res, long resource, void *rlim) {
2244  if (res >= 0) {
2245    if (rlim)
2246      POST_WRITE(rlim, struct_rlimit_sz);
2247  }
2248}
2249
2250#  if SANITIZER_GLIBC
2251PRE_SYSCALL(prlimit64)
2252(long pid, long resource, const void *new_rlim, void *old_rlim) {
2253  if (new_rlim)
2254    PRE_READ(new_rlim, struct_rlimit64_sz);
2255}
2256
2257POST_SYSCALL(prlimit64)
2258(long res, long pid, long resource, const void *new_rlim, void *old_rlim) {
2259  if (res >= 0) {
2260    if (old_rlim)
2261      POST_WRITE(old_rlim, struct_rlimit64_sz);
2262  }
2263}
2264#  endif
2265
2266PRE_SYSCALL(getrusage)(long who, void *ru) {}
2267
2268POST_SYSCALL(getrusage)(long res, long who, void *ru) {
2269  if (res >= 0) {
2270    if (ru)
2271      POST_WRITE(ru, struct_rusage_sz);
2272  }
2273}
2274
2275PRE_SYSCALL(umask)(long mask) {}
2276
2277POST_SYSCALL(umask)(long res, long mask) {}
2278
2279PRE_SYSCALL(msgget)(long key, long msgflg) {}
2280
2281POST_SYSCALL(msgget)(long res, long key, long msgflg) {}
2282
2283PRE_SYSCALL(msgsnd)(long msqid, void *msgp, long msgsz, long msgflg) {
2284  if (msgp)
2285    PRE_READ(msgp, msgsz);
2286}
2287
2288POST_SYSCALL(msgsnd)
2289(long res, long msqid, void *msgp, long msgsz, long msgflg) {}
2290
2291PRE_SYSCALL(msgrcv)
2292(long msqid, void *msgp, long msgsz, long msgtyp, long msgflg) {}
2293
2294POST_SYSCALL(msgrcv)
2295(long res, long msqid, void *msgp, long msgsz, long msgtyp, long msgflg) {
2296  if (res >= 0) {
2297    if (msgp)
2298      POST_WRITE(msgp, res);
2299  }
2300}
2301
2302#  if !SANITIZER_ANDROID
2303PRE_SYSCALL(msgctl)(long msqid, long cmd, void *buf) {}
2304
2305POST_SYSCALL(msgctl)(long res, long msqid, long cmd, void *buf) {
2306  if (res >= 0) {
2307    if (buf)
2308      POST_WRITE(buf, struct_msqid_ds_sz);
2309  }
2310}
2311#  endif
2312
2313PRE_SYSCALL(semget)(long key, long nsems, long semflg) {}
2314
2315POST_SYSCALL(semget)(long res, long key, long nsems, long semflg) {}
2316
2317PRE_SYSCALL(semop)(long semid, void *sops, long nsops) {}
2318
2319POST_SYSCALL(semop)(long res, long semid, void *sops, long nsops) {}
2320
2321PRE_SYSCALL(semctl)(long semid, long semnum, long cmd, void *arg) {}
2322
2323POST_SYSCALL(semctl)(long res, long semid, long semnum, long cmd, void *arg) {}
2324
2325PRE_SYSCALL(semtimedop)
2326(long semid, void *sops, long nsops, const void *timeout) {
2327  if (timeout)
2328    PRE_READ(timeout, struct_timespec_sz);
2329}
2330
2331POST_SYSCALL(semtimedop)
2332(long res, long semid, void *sops, long nsops, const void *timeout) {}
2333
2334PRE_SYSCALL(shmat)(long shmid, void *shmaddr, long shmflg) {}
2335
2336POST_SYSCALL(shmat)(long res, long shmid, void *shmaddr, long shmflg) {
2337  if (res >= 0) {
2338    if (shmaddr)
2339      POST_WRITE(shmaddr,
2340                 __sanitizer::internal_strlen((const char *)shmaddr) + 1);
2341  }
2342}
2343
2344PRE_SYSCALL(shmget)(long key, long size, long flag) {}
2345
2346POST_SYSCALL(shmget)(long res, long key, long size, long flag) {}
2347
2348PRE_SYSCALL(shmdt)(void *shmaddr) {}
2349
2350POST_SYSCALL(shmdt)(long res, void *shmaddr) {
2351  if (res >= 0) {
2352    if (shmaddr)
2353      POST_WRITE(shmaddr,
2354                 __sanitizer::internal_strlen((const char *)shmaddr) + 1);
2355  }
2356}
2357
2358PRE_SYSCALL(ipc)
2359(long call, long first, long second, long third, void *ptr, long fifth) {}
2360
2361POST_SYSCALL(ipc)
2362(long res, long call, long first, long second, long third, void *ptr,
2363 long fifth) {}
2364
2365#  if !SANITIZER_ANDROID
2366PRE_SYSCALL(shmctl)(long shmid, long cmd, void *buf) {}
2367
2368POST_SYSCALL(shmctl)(long res, long shmid, long cmd, void *buf) {
2369  if (res >= 0) {
2370    if (buf)
2371      POST_WRITE(buf, sizeof(__sanitizer_shmid_ds));
2372  }
2373}
2374
2375PRE_SYSCALL(mq_open)(const void *name, long oflag, long mode, void *attr) {
2376  if (name)
2377    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
2378}
2379
2380POST_SYSCALL(mq_open)
2381(long res, const void *name, long oflag, long mode, void *attr) {
2382  if (res >= 0) {
2383    if (attr)
2384      POST_WRITE(attr, struct_mq_attr_sz);
2385  }
2386}
2387
2388PRE_SYSCALL(mq_unlink)(const void *name) {
2389  if (name)
2390    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
2391}
2392
2393POST_SYSCALL(mq_unlink)(long res, const void *name) {}
2394
2395PRE_SYSCALL(mq_timedsend)
2396(long mqdes, const void *msg_ptr, long msg_len, long msg_prio,
2397 const void *abs_timeout) {
2398  if (msg_ptr)
2399    PRE_READ(msg_ptr, msg_len);
2400  if (abs_timeout)
2401    PRE_READ(abs_timeout, struct_timespec_sz);
2402}
2403
2404POST_SYSCALL(mq_timedsend)
2405(long res, long mqdes, const void *msg_ptr, long msg_len, long msg_prio,
2406 const void *abs_timeout) {}
2407
2408PRE_SYSCALL(mq_timedreceive)
2409(long mqdes, void *msg_ptr, long msg_len, void *msg_prio,
2410 const void *abs_timeout) {
2411  if (abs_timeout)
2412    PRE_READ(abs_timeout, struct_timespec_sz);
2413}
2414
2415POST_SYSCALL(mq_timedreceive)
2416(long res, long mqdes, void *msg_ptr, long msg_len, int *msg_prio,
2417 const void *abs_timeout) {
2418  if (res >= 0) {
2419    if (msg_ptr)
2420      POST_WRITE(msg_ptr, res);
2421    if (msg_prio)
2422      POST_WRITE(msg_prio, sizeof(*msg_prio));
2423  }
2424}
2425
2426PRE_SYSCALL(mq_notify)(long mqdes, const void *notification) {
2427  if (notification)
2428    PRE_READ(notification, struct_sigevent_sz);
2429}
2430
2431POST_SYSCALL(mq_notify)(long res, long mqdes, const void *notification) {}
2432
2433PRE_SYSCALL(mq_getsetattr)(long mqdes, const void *mqstat, void *omqstat) {
2434  if (mqstat)
2435    PRE_READ(mqstat, struct_mq_attr_sz);
2436}
2437
2438POST_SYSCALL(mq_getsetattr)
2439(long res, long mqdes, const void *mqstat, void *omqstat) {
2440  if (res >= 0) {
2441    if (omqstat)
2442      POST_WRITE(omqstat, struct_mq_attr_sz);
2443  }
2444}
2445#  endif  // SANITIZER_ANDROID
2446
2447PRE_SYSCALL(pciconfig_iobase)(long which, long bus, long devfn) {}
2448
2449POST_SYSCALL(pciconfig_iobase)(long res, long which, long bus, long devfn) {}
2450
2451PRE_SYSCALL(pciconfig_read)
2452(long bus, long dfn, long off, long len, void *buf) {}
2453
2454POST_SYSCALL(pciconfig_read)
2455(long res, long bus, long dfn, long off, long len, void *buf) {}
2456
2457PRE_SYSCALL(pciconfig_write)
2458(long bus, long dfn, long off, long len, void *buf) {}
2459
2460POST_SYSCALL(pciconfig_write)
2461(long res, long bus, long dfn, long off, long len, void *buf) {}
2462
2463PRE_SYSCALL(swapon)(const void *specialfile, long swap_flags) {
2464  if (specialfile)
2465    PRE_READ(specialfile,
2466             __sanitizer::internal_strlen((const char *)specialfile) + 1);
2467}
2468
2469POST_SYSCALL(swapon)(long res, const void *specialfile, long swap_flags) {}
2470
2471PRE_SYSCALL(swapoff)(const void *specialfile) {
2472  if (specialfile)
2473    PRE_READ(specialfile,
2474             __sanitizer::internal_strlen((const char *)specialfile) + 1);
2475}
2476
2477POST_SYSCALL(swapoff)(long res, const void *specialfile) {}
2478
2479PRE_SYSCALL(sysctl)(__sanitizer___sysctl_args *args) {
2480  if (args) {
2481    if (args->name)
2482      PRE_READ(args->name, args->nlen * sizeof(*args->name));
2483    if (args->newval)
2484      PRE_READ(args->name, args->newlen);
2485  }
2486}
2487
2488POST_SYSCALL(sysctl)(long res, __sanitizer___sysctl_args *args) {
2489  if (res >= 0) {
2490    if (args && args->oldval && args->oldlenp) {
2491      POST_WRITE(args->oldlenp, sizeof(*args->oldlenp));
2492      POST_WRITE(args->oldval, *args->oldlenp);
2493    }
2494  }
2495}
2496
2497PRE_SYSCALL(sysinfo)(void *info) {}
2498
2499POST_SYSCALL(sysinfo)(long res, void *info) {
2500  if (res >= 0) {
2501    if (info)
2502      POST_WRITE(info, struct_sysinfo_sz);
2503  }
2504}
2505
2506PRE_SYSCALL(sysfs)(long option, long arg1, long arg2) {}
2507
2508POST_SYSCALL(sysfs)(long res, long option, long arg1, long arg2) {}
2509
2510PRE_SYSCALL(syslog)(long type, void *buf, long len) {}
2511
2512POST_SYSCALL(syslog)(long res, long type, void *buf, long len) {
2513  if (res >= 0) {
2514    if (buf)
2515      POST_WRITE(buf, __sanitizer::internal_strlen((const char *)buf) + 1);
2516  }
2517}
2518
2519PRE_SYSCALL(uselib)(const void *library) {
2520  if (library)
2521    PRE_READ(library, __sanitizer::internal_strlen((const char *)library) + 1);
2522}
2523
2524POST_SYSCALL(uselib)(long res, const void *library) {}
2525
2526PRE_SYSCALL(ni_syscall)() {}
2527
2528POST_SYSCALL(ni_syscall)(long res) {}
2529
2530PRE_SYSCALL(ptrace)(long request, long pid, long addr, long data) {
2531#  if !SANITIZER_ANDROID &&                                                   \
2532      (defined(__i386) || defined(__x86_64) || defined(__mips64) ||           \
2533       defined(__powerpc64__) || defined(__aarch64__) || defined(__s390__) || \
2534       defined(__loongarch__) || SANITIZER_RISCV64 || defined(__sparc__))
2535  long data_arg = ptrace_data_arg(request, addr, data);
2536  if (data_arg) {
2537    if (request == ptrace_setregs) {
2538      PRE_READ((void *)data_arg, struct_user_regs_struct_sz);
2539    } else if (request == ptrace_setfpregs) {
2540      PRE_READ((void *)data_arg, struct_user_fpregs_struct_sz);
2541    } else if (request == ptrace_setfpxregs) {
2542      PRE_READ((void *)data_arg, struct_user_fpxregs_struct_sz);
2543    } else if (request == ptrace_setsiginfo) {
2544      PRE_READ((void *)data_arg, siginfo_t_sz);
2545    } else if (request == ptrace_setregset) {
2546      __sanitizer_iovec *iov = (__sanitizer_iovec *)data_arg;
2547      PRE_READ(iov->iov_base, iov->iov_len);
2548    }
2549  }
2550#  endif
2551}
2552
2553POST_SYSCALL(ptrace)(long res, long request, long pid, long addr, long data) {
2554#  if !SANITIZER_ANDROID &&                                                   \
2555      (defined(__i386) || defined(__x86_64) || defined(__mips64) ||           \
2556       defined(__powerpc64__) || defined(__aarch64__) || defined(__s390__) || \
2557       defined(__loongarch__) || SANITIZER_RISCV64 || defined(__sparc__))
2558  long data_arg = ptrace_data_arg(request, addr, data);
2559  if (res >= 0 && data_arg) {
2560    // Note that this is different from the interceptor in
2561    // sanitizer_common_interceptors.inc.
2562    // PEEK* requests return resulting values through data pointer.
2563    if (request == ptrace_getregs) {
2564      POST_WRITE((void *)data_arg, struct_user_regs_struct_sz);
2565    } else if (request == ptrace_getfpregs) {
2566      POST_WRITE((void *)data_arg, struct_user_fpregs_struct_sz);
2567    } else if (request == ptrace_getfpxregs) {
2568      POST_WRITE((void *)data_arg, struct_user_fpxregs_struct_sz);
2569    } else if (request == ptrace_getsiginfo) {
2570      POST_WRITE((void *)data_arg, siginfo_t_sz);
2571    } else if (request == ptrace_getregset) {
2572      __sanitizer_iovec *iov = (__sanitizer_iovec *)data_arg;
2573      POST_WRITE(iov->iov_base, iov->iov_len);
2574    } else if (request == ptrace_peekdata || request == ptrace_peektext ||
2575               request == ptrace_peekuser) {
2576      POST_WRITE((void *)data_arg, sizeof(void *));
2577    }
2578  }
2579#  endif
2580}
2581
2582PRE_SYSCALL(add_key)
2583(const void *_type, const void *_description, const void *_payload, long plen,
2584 long destringid) {
2585  if (_type)
2586    PRE_READ(_type, __sanitizer::internal_strlen((const char *)_type) + 1);
2587  if (_description)
2588    PRE_READ(_description,
2589             __sanitizer::internal_strlen((const char *)_description) + 1);
2590}
2591
2592POST_SYSCALL(add_key)
2593(long res, const void *_type, const void *_description, const void *_payload,
2594 long plen, long destringid) {}
2595
2596PRE_SYSCALL(request_key)
2597(const void *_type, const void *_description, const void *_callout_info,
2598 long destringid) {
2599  if (_type)
2600    PRE_READ(_type, __sanitizer::internal_strlen((const char *)_type) + 1);
2601  if (_description)
2602    PRE_READ(_description,
2603             __sanitizer::internal_strlen((const char *)_description) + 1);
2604  if (_callout_info)
2605    PRE_READ(_callout_info,
2606             __sanitizer::internal_strlen((const char *)_callout_info) + 1);
2607}
2608
2609POST_SYSCALL(request_key)
2610(long res, const void *_type, const void *_description,
2611 const void *_callout_info, long destringid) {}
2612
2613PRE_SYSCALL(keyctl)(long cmd, long arg2, long arg3, long arg4, long arg5) {}
2614
2615POST_SYSCALL(keyctl)
2616(long res, long cmd, long arg2, long arg3, long arg4, long arg5) {}
2617
2618PRE_SYSCALL(ioprio_set)(long which, long who, long ioprio) {}
2619
2620POST_SYSCALL(ioprio_set)(long res, long which, long who, long ioprio) {}
2621
2622PRE_SYSCALL(ioprio_get)(long which, long who) {}
2623
2624POST_SYSCALL(ioprio_get)(long res, long which, long who) {}
2625
2626PRE_SYSCALL(set_mempolicy)(long mode, void *nmask, long maxnode) {}
2627
2628POST_SYSCALL(set_mempolicy)(long res, long mode, void *nmask, long maxnode) {
2629  if (res >= 0) {
2630    if (nmask)
2631      POST_WRITE(nmask, sizeof(long));
2632  }
2633}
2634
2635PRE_SYSCALL(migrate_pages)
2636(long pid, long maxnode, const void *from, const void *to) {
2637  if (from)
2638    PRE_READ(from, sizeof(long));
2639  if (to)
2640    PRE_READ(to, sizeof(long));
2641}
2642
2643POST_SYSCALL(migrate_pages)
2644(long res, long pid, long maxnode, const void *from, const void *to) {}
2645
2646PRE_SYSCALL(move_pages)
2647(long pid, long nr_pages, const void **pages, const int *nodes, int *status,
2648 long flags) {
2649  if (pages)
2650    PRE_READ(pages, nr_pages * sizeof(*pages));
2651  if (nodes)
2652    PRE_READ(nodes, nr_pages * sizeof(*nodes));
2653}
2654
2655POST_SYSCALL(move_pages)
2656(long res, long pid, long nr_pages, const void **pages, const int *nodes,
2657 int *status, long flags) {
2658  if (res >= 0) {
2659    if (status)
2660      POST_WRITE(status, nr_pages * sizeof(*status));
2661  }
2662}
2663
2664PRE_SYSCALL(mbind)
2665(long start, long len, long mode, void *nmask, long maxnode, long flags) {}
2666
2667POST_SYSCALL(mbind)
2668(long res, long start, long len, long mode, void *nmask, long maxnode,
2669 long flags) {
2670  if (res >= 0) {
2671    if (nmask)
2672      POST_WRITE(nmask, sizeof(long));
2673  }
2674}
2675
2676PRE_SYSCALL(get_mempolicy)
2677(void *policy, void *nmask, long maxnode, long addr, long flags) {}
2678
2679POST_SYSCALL(get_mempolicy)
2680(long res, void *policy, void *nmask, long maxnode, long addr, long flags) {
2681  if (res >= 0) {
2682    if (policy)
2683      POST_WRITE(policy, sizeof(int));
2684    if (nmask)
2685      POST_WRITE(nmask, sizeof(long));
2686  }
2687}
2688
2689PRE_SYSCALL(inotify_init)() {}
2690
2691POST_SYSCALL(inotify_init)(long res) {}
2692
2693PRE_SYSCALL(inotify_init1)(long flags) {}
2694
2695POST_SYSCALL(inotify_init1)(long res, long flags) {}
2696
2697PRE_SYSCALL(inotify_add_watch)(long fd, const void *path, long mask) {
2698  if (path)
2699    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
2700}
2701
2702POST_SYSCALL(inotify_add_watch)
2703(long res, long fd, const void *path, long mask) {}
2704
2705PRE_SYSCALL(inotify_rm_watch)(long fd, long wd) {}
2706
2707POST_SYSCALL(inotify_rm_watch)(long res, long fd, long wd) {}
2708
2709PRE_SYSCALL(spu_run)(long fd, void *unpc, void *ustatus) {}
2710
2711POST_SYSCALL(spu_run)(long res, long fd, unsigned *unpc, unsigned *ustatus) {
2712  if (res >= 0) {
2713    if (unpc)
2714      POST_WRITE(unpc, sizeof(*unpc));
2715    if (ustatus)
2716      POST_WRITE(ustatus, sizeof(*ustatus));
2717  }
2718}
2719
2720PRE_SYSCALL(spu_create)(const void *name, long flags, long mode, long fd) {
2721  if (name)
2722    PRE_READ(name, __sanitizer::internal_strlen((const char *)name) + 1);
2723}
2724
2725POST_SYSCALL(spu_create)
2726(long res, const void *name, long flags, long mode, long fd) {}
2727
2728PRE_SYSCALL(mknodat)(long dfd, const void *filename, long mode, long dev) {
2729  if (filename)
2730    PRE_READ(filename,
2731             __sanitizer::internal_strlen((const char *)filename) + 1);
2732}
2733
2734POST_SYSCALL(mknodat)
2735(long res, long dfd, const void *filename, long mode, long dev) {}
2736
2737PRE_SYSCALL(mkdirat)(long dfd, const void *pathname, long mode) {
2738  if (pathname)
2739    PRE_READ(pathname,
2740             __sanitizer::internal_strlen((const char *)pathname) + 1);
2741}
2742
2743POST_SYSCALL(mkdirat)(long res, long dfd, const void *pathname, long mode) {}
2744
2745PRE_SYSCALL(unlinkat)(long dfd, const void *pathname, long flag) {
2746  if (pathname)
2747    PRE_READ(pathname,
2748             __sanitizer::internal_strlen((const char *)pathname) + 1);
2749}
2750
2751POST_SYSCALL(unlinkat)(long res, long dfd, const void *pathname, long flag) {}
2752
2753PRE_SYSCALL(symlinkat)(const void *oldname, long newdfd, const void *newname) {
2754  if (oldname)
2755    PRE_READ(oldname, __sanitizer::internal_strlen((const char *)oldname) + 1);
2756  if (newname)
2757    PRE_READ(newname, __sanitizer::internal_strlen((const char *)newname) + 1);
2758}
2759
2760POST_SYSCALL(symlinkat)
2761(long res, const void *oldname, long newdfd, const void *newname) {}
2762
2763PRE_SYSCALL(linkat)
2764(long olddfd, const void *oldname, long newdfd, const void *newname,
2765 long flags) {
2766  if (oldname)
2767    PRE_READ(oldname, __sanitizer::internal_strlen((const char *)oldname) + 1);
2768  if (newname)
2769    PRE_READ(newname, __sanitizer::internal_strlen((const char *)newname) + 1);
2770}
2771
2772POST_SYSCALL(linkat)
2773(long res, long olddfd, const void *oldname, long newdfd, const void *newname,
2774 long flags) {}
2775
2776PRE_SYSCALL(renameat)
2777(long olddfd, const void *oldname, long newdfd, const void *newname) {
2778  if (oldname)
2779    PRE_READ(oldname, __sanitizer::internal_strlen((const char *)oldname) + 1);
2780  if (newname)
2781    PRE_READ(newname, __sanitizer::internal_strlen((const char *)newname) + 1);
2782}
2783
2784POST_SYSCALL(renameat)
2785(long res, long olddfd, const void *oldname, long newdfd, const void *newname) {
2786}
2787
2788PRE_SYSCALL(futimesat)(long dfd, const void *filename, void *utimes) {
2789  if (filename)
2790    PRE_READ(filename,
2791             __sanitizer::internal_strlen((const char *)filename) + 1);
2792}
2793
2794POST_SYSCALL(futimesat)
2795(long res, long dfd, const void *filename, void *utimes) {
2796  if (res >= 0) {
2797    if (utimes)
2798      POST_WRITE(utimes, timeval_sz);
2799  }
2800}
2801
2802PRE_SYSCALL(faccessat)(long dfd, const void *filename, long mode) {
2803  if (filename)
2804    PRE_READ(filename,
2805             __sanitizer::internal_strlen((const char *)filename) + 1);
2806}
2807
2808POST_SYSCALL(faccessat)(long res, long dfd, const void *filename, long mode) {}
2809
2810PRE_SYSCALL(fchmodat)(long dfd, const void *filename, long mode) {
2811  if (filename)
2812    PRE_READ(filename,
2813             __sanitizer::internal_strlen((const char *)filename) + 1);
2814}
2815
2816POST_SYSCALL(fchmodat)(long res, long dfd, const void *filename, long mode) {}
2817
2818PRE_SYSCALL(fchownat)
2819(long dfd, const void *filename, long user, long group, long flag) {
2820  if (filename)
2821    PRE_READ(filename,
2822             __sanitizer::internal_strlen((const char *)filename) + 1);
2823}
2824
2825POST_SYSCALL(fchownat)
2826(long res, long dfd, const void *filename, long user, long group, long flag) {}
2827
2828PRE_SYSCALL(fchmodat2)(long dfd, const void *filename, long mode, long flag) {
2829  if (filename)
2830    PRE_READ(filename,
2831             __sanitizer::internal_strlen((const char *)filename) + 1);
2832}
2833
2834POST_SYSCALL(fchmodat2)
2835(long res, long dfd, const void *filename, long mode, long flag) {}
2836
2837PRE_SYSCALL(openat)(long dfd, const void *filename, long flags, long mode) {
2838  if (filename)
2839    PRE_READ(filename,
2840             __sanitizer::internal_strlen((const char *)filename) + 1);
2841}
2842
2843POST_SYSCALL(openat)
2844(long res, long dfd, const void *filename, long flags, long mode) {}
2845
2846PRE_SYSCALL(newfstatat)
2847(long dfd, const void *filename, void *statbuf, long flag) {
2848  if (filename)
2849    PRE_READ(filename,
2850             __sanitizer::internal_strlen((const char *)filename) + 1);
2851}
2852
2853POST_SYSCALL(newfstatat)
2854(long res, long dfd, const void *filename, void *statbuf, long flag) {
2855  if (res >= 0) {
2856    if (statbuf)
2857      POST_WRITE(statbuf, struct_kernel_stat_sz);
2858  }
2859}
2860
2861PRE_SYSCALL(fstatat64)
2862(long dfd, const void *filename, void *statbuf, long flag) {
2863  if (filename)
2864    PRE_READ(filename,
2865             __sanitizer::internal_strlen((const char *)filename) + 1);
2866}
2867
2868POST_SYSCALL(fstatat64)
2869(long res, long dfd, const void *filename, void *statbuf, long flag) {
2870  if (res >= 0) {
2871    if (statbuf)
2872      POST_WRITE(statbuf, struct_kernel_stat64_sz);
2873  }
2874}
2875
2876PRE_SYSCALL(readlinkat)(long dfd, const void *path, void *buf, long bufsiz) {
2877  if (path)
2878    PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
2879}
2880
2881POST_SYSCALL(readlinkat)
2882(long res, long dfd, const void *path, void *buf, long bufsiz) {
2883  if (res >= 0) {
2884    if (buf)
2885      POST_WRITE(buf, __sanitizer::internal_strlen((const char *)buf) + 1);
2886  }
2887}
2888
2889PRE_SYSCALL(utimensat)
2890(long dfd, const void *filename, void *utimes, long flags) {
2891  if (filename)
2892    PRE_READ(filename,
2893             __sanitizer::internal_strlen((const char *)filename) + 1);
2894}
2895
2896POST_SYSCALL(utimensat)
2897(long res, long dfd, const void *filename, void *utimes, long flags) {
2898  if (res >= 0) {
2899    if (utimes)
2900      POST_WRITE(utimes, struct_timespec_sz);
2901  }
2902}
2903
2904PRE_SYSCALL(unshare)(long unshare_flags) {}
2905
2906POST_SYSCALL(unshare)(long res, long unshare_flags) {}
2907
2908PRE_SYSCALL(splice)
2909(long fd_in, void *off_in, long fd_out, void *off_out, long len, long flags) {}
2910
2911POST_SYSCALL(splice)
2912(long res, long fd_in, void *off_in, long fd_out, void *off_out, long len,
2913 long flags) {
2914  if (res >= 0) {
2915    if (off_in)
2916      POST_WRITE(off_in, sizeof(long long));
2917    if (off_out)
2918      POST_WRITE(off_out, sizeof(long long));
2919  }
2920}
2921
2922PRE_SYSCALL(vmsplice)
2923(long fd, const __sanitizer_iovec *iov, long nr_segs, long flags) {}
2924
2925POST_SYSCALL(vmsplice)
2926(long res, long fd, const __sanitizer_iovec *iov, long nr_segs, long flags) {
2927  if (res >= 0) {
2928    if (iov)
2929      kernel_read_iovec(iov, nr_segs, res);
2930  }
2931}
2932
2933PRE_SYSCALL(tee)(long fdin, long fdout, long len, long flags) {}
2934
2935POST_SYSCALL(tee)(long res, long fdin, long fdout, long len, long flags) {}
2936
2937PRE_SYSCALL(get_robust_list)(long pid, void *head_ptr, void *len_ptr) {}
2938
2939POST_SYSCALL(get_robust_list)
2940(long res, long pid, void *head_ptr, void *len_ptr) {}
2941
2942PRE_SYSCALL(set_robust_list)(void *head, long len) {}
2943
2944POST_SYSCALL(set_robust_list)(long res, void *head, long len) {}
2945
2946PRE_SYSCALL(getcpu)(void *cpu, void *node, void *cache) {}
2947
2948POST_SYSCALL(getcpu)(long res, void *cpu, void *node, void *cache) {
2949  if (res >= 0) {
2950    if (cpu)
2951      POST_WRITE(cpu, sizeof(unsigned));
2952    if (node)
2953      POST_WRITE(node, sizeof(unsigned));
2954    // The third argument to this system call is nowadays unused.
2955  }
2956}
2957
2958PRE_SYSCALL(signalfd)(long ufd, void *user_mask, long sizemask) {}
2959
2960POST_SYSCALL(signalfd)
2961(long res, long ufd, kernel_sigset_t *user_mask, long sizemask) {
2962  if (res >= 0) {
2963    if (user_mask)
2964      POST_WRITE(user_mask, sizemask);
2965  }
2966}
2967
2968PRE_SYSCALL(signalfd4)(long ufd, void *user_mask, long sizemask, long flags) {}
2969
2970POST_SYSCALL(signalfd4)
2971(long res, long ufd, kernel_sigset_t *user_mask, long sizemask, long flags) {
2972  if (res >= 0) {
2973    if (user_mask)
2974      POST_WRITE(user_mask, sizemask);
2975  }
2976}
2977
2978PRE_SYSCALL(timerfd_create)(long clockid, long flags) {}
2979
2980POST_SYSCALL(timerfd_create)(long res, long clockid, long flags) {}
2981
2982PRE_SYSCALL(timerfd_settime)
2983(long ufd, long flags, const void *utmr, void *otmr) {
2984  if (utmr)
2985    PRE_READ(utmr, struct_itimerspec_sz);
2986}
2987
2988POST_SYSCALL(timerfd_settime)
2989(long res, long ufd, long flags, const void *utmr, void *otmr) {
2990  if (res >= 0) {
2991    if (otmr)
2992      POST_WRITE(otmr, struct_itimerspec_sz);
2993  }
2994}
2995
2996PRE_SYSCALL(timerfd_gettime)(long ufd, void *otmr) {}
2997
2998POST_SYSCALL(timerfd_gettime)(long res, long ufd, void *otmr) {
2999  if (res >= 0) {
3000    if (otmr)
3001      POST_WRITE(otmr, struct_itimerspec_sz);
3002  }
3003}
3004
3005PRE_SYSCALL(eventfd)(long count) {}
3006
3007POST_SYSCALL(eventfd)(long res, long count) {}
3008
3009PRE_SYSCALL(eventfd2)(long count, long flags) {}
3010
3011POST_SYSCALL(eventfd2)(long res, long count, long flags) {}
3012
3013PRE_SYSCALL(old_readdir)(long arg0, void *arg1, long arg2) {}
3014
3015POST_SYSCALL(old_readdir)(long res, long arg0, void *arg1, long arg2) {
3016  // Missing definition of 'struct old_linux_dirent'.
3017}
3018
3019PRE_SYSCALL(pselect6)
3020(long arg0, __sanitizer___kernel_fd_set *arg1,
3021 __sanitizer___kernel_fd_set *arg2, __sanitizer___kernel_fd_set *arg3,
3022 void *arg4, void *arg5) {}
3023
3024POST_SYSCALL(pselect6)
3025(long res, long arg0, __sanitizer___kernel_fd_set *arg1,
3026 __sanitizer___kernel_fd_set *arg2, __sanitizer___kernel_fd_set *arg3,
3027 void *arg4, void *arg5) {
3028  if (res >= 0) {
3029    if (arg1)
3030      POST_WRITE(arg1, sizeof(*arg1));
3031    if (arg2)
3032      POST_WRITE(arg2, sizeof(*arg2));
3033    if (arg3)
3034      POST_WRITE(arg3, sizeof(*arg3));
3035    if (arg4)
3036      POST_WRITE(arg4, struct_timespec_sz);
3037  }
3038}
3039
3040PRE_SYSCALL(ppoll)
3041(__sanitizer_pollfd *arg0, long arg1, void *arg2, const kernel_sigset_t *arg3,
3042 long arg4) {
3043  if (arg3)
3044    PRE_READ(arg3, arg4);
3045}
3046
3047POST_SYSCALL(ppoll)
3048(long res, __sanitizer_pollfd *arg0, long arg1, void *arg2, const void *arg3,
3049 long arg4) {
3050  if (res >= 0) {
3051    if (arg0)
3052      POST_WRITE(arg0, sizeof(*arg0));
3053    if (arg2)
3054      POST_WRITE(arg2, struct_timespec_sz);
3055  }
3056}
3057
3058PRE_SYSCALL(syncfs)(long fd) {}
3059
3060POST_SYSCALL(syncfs)(long res, long fd) {}
3061
3062PRE_SYSCALL(perf_event_open)
3063(__sanitizer_perf_event_attr *attr_uptr, long pid, long cpu, long group_fd,
3064 long flags) {
3065  if (attr_uptr)
3066    PRE_READ(attr_uptr, attr_uptr->size);
3067}
3068
3069POST_SYSCALL(perf_event_open)
3070(long res, __sanitizer_perf_event_attr *attr_uptr, long pid, long cpu,
3071 long group_fd, long flags) {}
3072
3073PRE_SYSCALL(mmap_pgoff)
3074(long addr, long len, long prot, long flags, long fd, long pgoff) {}
3075
3076POST_SYSCALL(mmap_pgoff)
3077(long res, long addr, long len, long prot, long flags, long fd, long pgoff) {}
3078
3079PRE_SYSCALL(old_mmap)(void *arg) {}
3080
3081POST_SYSCALL(old_mmap)(long res, void *arg) {}
3082
3083PRE_SYSCALL(name_to_handle_at)
3084(long dfd, const void *name, void *handle, void *mnt_id, long flag) {}
3085
3086POST_SYSCALL(name_to_handle_at)
3087(long res, long dfd, const void *name, void *handle, void *mnt_id, long flag) {}
3088
3089PRE_SYSCALL(open_by_handle_at)(long mountdirfd, void *handle, long flags) {}
3090
3091POST_SYSCALL(open_by_handle_at)
3092(long res, long mountdirfd, void *handle, long flags) {}
3093
3094PRE_SYSCALL(setns)(long fd, long nstype) {}
3095
3096POST_SYSCALL(setns)(long res, long fd, long nstype) {}
3097
3098PRE_SYSCALL(process_vm_readv)
3099(long pid, const __sanitizer_iovec *lvec, long liovcnt, const void *rvec,
3100 long riovcnt, long flags) {}
3101
3102POST_SYSCALL(process_vm_readv)
3103(long res, long pid, const __sanitizer_iovec *lvec, long liovcnt,
3104 const void *rvec, long riovcnt, long flags) {
3105  if (res >= 0) {
3106    if (lvec)
3107      kernel_write_iovec(lvec, liovcnt, res);
3108  }
3109}
3110
3111PRE_SYSCALL(process_vm_writev)
3112(long pid, const __sanitizer_iovec *lvec, long liovcnt, const void *rvec,
3113 long riovcnt, long flags) {}
3114
3115POST_SYSCALL(process_vm_writev)
3116(long res, long pid, const __sanitizer_iovec *lvec, long liovcnt,
3117 const void *rvec, long riovcnt, long flags) {
3118  if (res >= 0) {
3119    if (lvec)
3120      kernel_read_iovec(lvec, liovcnt, res);
3121  }
3122}
3123
3124PRE_SYSCALL(fork)() { COMMON_SYSCALL_PRE_FORK(); }
3125
3126POST_SYSCALL(fork)(long res) { COMMON_SYSCALL_POST_FORK(res); }
3127
3128PRE_SYSCALL(vfork)() { COMMON_SYSCALL_PRE_FORK(); }
3129
3130POST_SYSCALL(vfork)(long res) { COMMON_SYSCALL_POST_FORK(res); }
3131
3132PRE_SYSCALL(sigaction)
3133(long signum, const __sanitizer_kernel_sigaction_t *act,
3134 __sanitizer_kernel_sigaction_t *oldact) {
3135  if (act) {
3136    PRE_READ(&act->sigaction, sizeof(act->sigaction));
3137    PRE_READ(&act->sa_flags, sizeof(act->sa_flags));
3138    PRE_READ(&act->sa_mask, sizeof(act->sa_mask));
3139  }
3140}
3141
3142POST_SYSCALL(sigaction)
3143(long res, long signum, const __sanitizer_kernel_sigaction_t *act,
3144 __sanitizer_kernel_sigaction_t *oldact) {
3145  if (res >= 0 && oldact)
3146    POST_WRITE(oldact, sizeof(*oldact));
3147}
3148
3149PRE_SYSCALL(rt_sigaction)
3150(long signum, const __sanitizer_kernel_sigaction_t *act,
3151 __sanitizer_kernel_sigaction_t *oldact, SIZE_T sz) {
3152  if (act) {
3153    PRE_READ(&act->sigaction, sizeof(act->sigaction));
3154    PRE_READ(&act->sa_flags, sizeof(act->sa_flags));
3155    PRE_READ(&act->sa_mask, sz);
3156  }
3157}
3158
3159POST_SYSCALL(rt_sigaction)
3160(long res, long signum, const __sanitizer_kernel_sigaction_t *act,
3161 __sanitizer_kernel_sigaction_t *oldact, SIZE_T sz) {
3162  if (res >= 0 && oldact) {
3163    SIZE_T oldact_sz = ((char *)&oldact->sa_mask) - ((char *)oldact) + sz;
3164    POST_WRITE(oldact, oldact_sz);
3165  }
3166}
3167
3168PRE_SYSCALL(getrandom)(void *buf, uptr count, long flags) {
3169  if (buf) {
3170    PRE_WRITE(buf, count);
3171  }
3172}
3173
3174POST_SYSCALL(getrandom)(long res, void *buf, uptr count, long flags) {
3175  if (res > 0 && buf) {
3176    POST_WRITE(buf, res);
3177  }
3178}
3179
3180PRE_SYSCALL(sigaltstack)(const void *ss, void *oss) {
3181  if (ss != nullptr) {
3182    PRE_READ(ss, struct_stack_t_sz);
3183  }
3184  if (oss != nullptr) {
3185    PRE_WRITE(oss, struct_stack_t_sz);
3186  }
3187}
3188
3189POST_SYSCALL(sigaltstack)(long res, void *ss, void *oss) {
3190  if (res == 0) {
3191    if (oss != nullptr) {
3192      POST_WRITE(oss, struct_stack_t_sz);
3193    }
3194  }
3195}
3196
3197PRE_SYSCALL(futex)
3198(void *uaddr, long futex_op, long val, void *timeout, void *uaddr2, long val3) {
3199  COMMON_SYSCALL_BLOCKING_START();
3200}
3201
3202POST_SYSCALL(futex)
3203(long res, void *uaddr, long futex_op, long val, void *timeout, void *uaddr2,
3204 long val3) {
3205  COMMON_SYSCALL_BLOCKING_END();
3206}
3207
3208PRE_SYSCALL(copy_file_range)
3209(int fdin, __sanitizer___kernel_off_t *offin, int fdout,
3210 __sanitizer___kernel_off_t *offout, SIZE_T size, unsigned int flags) {
3211  if (offin != nullptr) {
3212    PRE_READ(offin, sizeof(*offin));
3213  }
3214  if (offout != nullptr) {
3215    PRE_READ(offout, sizeof(*offout));
3216  }
3217}
3218
3219POST_SYSCALL(copy_file_range)
3220(SSIZE_T, int fdin, __sanitizer___kernel_off_t *offin, int fdout,
3221 __sanitizer___kernel_off_t *offout, SIZE_T size, unsigned int flags) {
3222  if (offin != nullptr) {
3223    POST_WRITE(offin, sizeof(*offin));
3224  }
3225  if (offout != nullptr) {
3226    POST_WRITE(offout, sizeof(*offout));
3227  }
3228}
3229
3230}  // extern "C"
3231
3232#  undef PRE_SYSCALL
3233#  undef PRE_READ
3234#  undef PRE_WRITE
3235#  undef POST_SYSCALL
3236#  undef POST_READ
3237#  undef POST_WRITE
3238
3239#endif  // SANITIZER_LINUX