brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · f6ac3fa Raw
129 lines · plain
1//===-- sanitizer_common_interceptors_netbsd_compat.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-exception6//7//===----------------------------------------------------------------------===//8//9// Common function interceptors for tools like AddressSanitizer,10// ThreadSanitizer, MemorySanitizer, etc.11//12// Interceptors for NetBSD old function calls that have been versioned.13//14// NetBSD minimal version supported 9.0.15// NetBSD current version supported 9.99.26.16//17//===----------------------------------------------------------------------===//18 19#if SANITIZER_NETBSD20 21// First undef all mangled symbols.22// Next, define compat interceptors.23// Finally, undef INIT_ and redefine it.24// This allows to avoid preprocessor issues.25 26#undef fstatvfs27#undef fstatvfs128#undef getmntinfo29#undef getvfsstat30#undef statvfs31#undef statvfs132 33INTERCEPTOR(int, statvfs, char *path, void *buf) {34  void *ctx;35  COMMON_INTERCEPTOR_ENTER(ctx, statvfs, path, buf);36  if (path) COMMON_INTERCEPTOR_READ_RANGE(ctx, path, internal_strlen(path) + 1);37  // FIXME: under ASan the call below may write to freed memory and corrupt38  // its metadata. See39  // https://github.com/google/sanitizers/issues/321.40  int res = REAL(statvfs)(path, buf);41  if (!res) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, struct_statvfs90_sz);42  return res;43}44 45INTERCEPTOR(int, fstatvfs, int fd, void *buf) {46  void *ctx;47  COMMON_INTERCEPTOR_ENTER(ctx, fstatvfs, fd, buf);48  COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd);49  // FIXME: under ASan the call below may write to freed memory and corrupt50  // its metadata. See51  // https://github.com/google/sanitizers/issues/321.52  int res = REAL(fstatvfs)(fd, buf);53  if (!res) {54    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, struct_statvfs90_sz);55    if (fd >= 0)56      COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);57  }58  return res;59}60 61#undef INIT_STATVFS62#define INIT_STATVFS \63  COMMON_INTERCEPT_FUNCTION(statvfs); \64  COMMON_INTERCEPT_FUNCTION(fstatvfs); \65  COMMON_INTERCEPT_FUNCTION(__statvfs90); \66  COMMON_INTERCEPT_FUNCTION(__fstatvfs90)67 68INTERCEPTOR(int, __getmntinfo13, void **mntbufp, int flags) {69  void *ctx;70  COMMON_INTERCEPTOR_ENTER(ctx, __getmntinfo13, mntbufp, flags);71  int cnt = REAL(__getmntinfo13)(mntbufp, flags);72  if (cnt > 0 && mntbufp) {73    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, mntbufp, sizeof(void *));74    if (*mntbufp)75      COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *mntbufp, cnt * struct_statvfs90_sz);76  }77  return cnt;78}79 80#undef INIT_GETMNTINFO81#define INIT_GETMNTINFO \82  COMMON_INTERCEPT_FUNCTION(__getmntinfo13); \83  COMMON_INTERCEPT_FUNCTION(__getmntinfo90)84 85INTERCEPTOR(int, getvfsstat, void *buf, SIZE_T bufsize, int flags) {86  void *ctx;87  COMMON_INTERCEPTOR_ENTER(ctx, getvfsstat, buf, bufsize, flags);88  int ret = REAL(getvfsstat)(buf, bufsize, flags);89  if (buf && ret > 0)90    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, ret * struct_statvfs90_sz);91  return ret;92}93 94#undef INIT_GETVFSSTAT95#define INIT_GETVFSSTAT \96  COMMON_INTERCEPT_FUNCTION(getvfsstat); \97  COMMON_INTERCEPT_FUNCTION(__getvfsstat90)98 99INTERCEPTOR(int, statvfs1, const char *path, void *buf, int flags) {100  void *ctx;101  COMMON_INTERCEPTOR_ENTER(ctx, statvfs1, path, buf, flags);102  if (path) COMMON_INTERCEPTOR_READ_RANGE(ctx, path, internal_strlen(path) + 1);103  int res = REAL(statvfs1)(path, buf, flags);104  if (!res) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, struct_statvfs90_sz);105  return res;106}107 108INTERCEPTOR(int, fstatvfs1, int fd, void *buf, int flags) {109  void *ctx;110  COMMON_INTERCEPTOR_ENTER(ctx, fstatvfs1, fd, buf, flags);111  COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd);112  int res = REAL(fstatvfs1)(fd, buf, flags);113  if (!res) {114    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, struct_statvfs90_sz);115    if (fd >= 0)116      COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);117  }118  return res;119}120 121#undef INIT_STATVFS1122#define INIT_STATVFS1 \123  COMMON_INTERCEPT_FUNCTION(statvfs1); \124  COMMON_INTERCEPT_FUNCTION(fstatvfs1); \125  COMMON_INTERCEPT_FUNCTION(__statvfs190); \126  COMMON_INTERCEPT_FUNCTION(__fstatvfs190)127 128#endif129