Home | History | Annotate | Line # | Download | only in sanitizer_common
      1  1.1  mrg //===-- sanitizer_solaris.cpp ---------------------------------------------===//
      2  1.1  mrg //
      3  1.1  mrg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4  1.1  mrg // See https://llvm.org/LICENSE.txt for license information.
      5  1.1  mrg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6  1.1  mrg //
      7  1.1  mrg //===----------------------------------------------------------------------===//
      8  1.1  mrg //
      9  1.1  mrg // This file is shared between various sanitizers' runtime libraries and
     10  1.1  mrg // implements Solaris-specific functions.
     11  1.1  mrg //===----------------------------------------------------------------------===//
     12  1.1  mrg 
     13  1.1  mrg #include "sanitizer_platform.h"
     14  1.1  mrg #if SANITIZER_SOLARIS
     15  1.1  mrg 
     16  1.1  mrg #include <stdio.h>
     17  1.1  mrg 
     18  1.1  mrg #include "sanitizer_common.h"
     19  1.1  mrg #include "sanitizer_flags.h"
     20  1.1  mrg #include "sanitizer_internal_defs.h"
     21  1.1  mrg #include "sanitizer_libc.h"
     22  1.1  mrg #include "sanitizer_placement_new.h"
     23  1.1  mrg #include "sanitizer_platform_limits_posix.h"
     24  1.1  mrg #include "sanitizer_procmaps.h"
     25  1.1  mrg 
     26  1.1  mrg #include <fcntl.h>
     27  1.1  mrg #include <pthread.h>
     28  1.1  mrg #include <sched.h>
     29  1.1  mrg #include <thread.h>
     30  1.1  mrg #include <synch.h>
     31  1.1  mrg #include <signal.h>
     32  1.1  mrg #include <sys/mman.h>
     33  1.1  mrg #include <sys/resource.h>
     34  1.1  mrg #include <sys/stat.h>
     35  1.1  mrg #include <sys/types.h>
     36  1.1  mrg #include <dirent.h>
     37  1.1  mrg #include <unistd.h>
     38  1.1  mrg #include <errno.h>
     39  1.1  mrg #include <stdlib.h>
     40  1.1  mrg 
     41  1.1  mrg namespace __sanitizer {
     42  1.1  mrg 
     43  1.1  mrg //#include "sanitizer_syscall_generic.inc"
     44  1.1  mrg 
     45  1.1  mrg #define _REAL(func) _ ## func
     46  1.1  mrg #define DECLARE__REAL(ret_type, func, ...) \
     47  1.1  mrg   extern "C" ret_type _REAL(func)(__VA_ARGS__)
     48  1.1  mrg #define DECLARE__REAL_AND_INTERNAL(ret_type, func, ...) \
     49  1.1  mrg   DECLARE__REAL(ret_type, func, __VA_ARGS__); \
     50  1.1  mrg   ret_type internal_ ## func(__VA_ARGS__)
     51  1.1  mrg 
     52  1.1  mrg #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
     53  1.1  mrg #define _REAL64(func) _ ## func ## 64
     54  1.1  mrg #else
     55  1.1  mrg #define _REAL64(func) _REAL(func)
     56  1.1  mrg #endif
     57  1.1  mrg #define DECLARE__REAL64(ret_type, func, ...) \
     58  1.1  mrg   extern "C" ret_type _REAL64(func)(__VA_ARGS__)
     59  1.1  mrg #define DECLARE__REAL_AND_INTERNAL64(ret_type, func, ...) \
     60  1.1  mrg   DECLARE__REAL64(ret_type, func, __VA_ARGS__); \
     61  1.1  mrg   ret_type internal_ ## func(__VA_ARGS__)
     62  1.1  mrg 
     63  1.1  mrg // ---------------------- sanitizer_libc.h
     64  1.1  mrg DECLARE__REAL_AND_INTERNAL64(uptr, mmap, void *addr, uptr /*size_t*/ length,
     65  1.1  mrg                              int prot, int flags, int fd, OFF_T offset) {
     66  1.1  mrg   return (uptr)_REAL64(mmap)(addr, length, prot, flags, fd, offset);
     67  1.1  mrg }
     68  1.1  mrg 
     69  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, munmap, void *addr, uptr length) {
     70  1.1  mrg   return _REAL(munmap)(addr, length);
     71  1.1  mrg }
     72  1.1  mrg 
     73  1.1  mrg DECLARE__REAL_AND_INTERNAL(int, mprotect, void *addr, uptr length, int prot) {
     74  1.1  mrg   return _REAL(mprotect)(addr, length, prot);
     75  1.1  mrg }
     76  1.1  mrg 
     77  1.3  mrg // Illumos' declaration of madvise cannot be made visible if _XOPEN_SOURCE
     78  1.3  mrg // is defined as g++ does on Solaris.
     79  1.3  mrg //
     80  1.3  mrg // This declaration is consistent with Solaris 11.4. Both Illumos and Solaris
     81  1.3  mrg // versions older than 11.4 declared madvise with a caddr_t as the first
     82  1.3  mrg // argument, but we don't currently support Solaris versions older than 11.4,
     83  1.3  mrg // and as mentioned above the declaration is not visible on Illumos so we can
     84  1.3  mrg // use any declaration we like on Illumos.
     85  1.3  mrg extern "C" int madvise(void *, size_t, int);
     86  1.3  mrg 
     87  1.3  mrg int internal_madvise(uptr addr, uptr length, int advice) {
     88  1.3  mrg   return madvise((void *)addr, length, advice);
     89  1.3  mrg }
     90  1.3  mrg 
     91  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, close, fd_t fd) {
     92  1.1  mrg   return _REAL(close)(fd);
     93  1.1  mrg }
     94  1.1  mrg 
     95  1.1  mrg extern "C" int _REAL64(open)(const char *, int, ...);
     96  1.1  mrg 
     97  1.1  mrg uptr internal_open(const char *filename, int flags) {
     98  1.1  mrg   return _REAL64(open)(filename, flags);
     99  1.1  mrg }
    100  1.1  mrg 
    101  1.1  mrg uptr internal_open(const char *filename, int flags, u32 mode) {
    102  1.1  mrg   return _REAL64(open)(filename, flags, mode);
    103  1.1  mrg }
    104  1.1  mrg 
    105  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, read, fd_t fd, void *buf, uptr count) {
    106  1.1  mrg   return _REAL(read)(fd, buf, count);
    107  1.1  mrg }
    108  1.1  mrg 
    109  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, write, fd_t fd, const void *buf, uptr count) {
    110  1.1  mrg   return _REAL(write)(fd, buf, count);
    111  1.1  mrg }
    112  1.1  mrg 
    113  1.1  mrg // FIXME: There's only _ftruncate64 beginning with Solaris 11.
    114  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, ftruncate, fd_t fd, uptr size) {
    115  1.1  mrg   return ftruncate(fd, size);
    116  1.1  mrg }
    117  1.1  mrg 
    118  1.1  mrg DECLARE__REAL_AND_INTERNAL64(uptr, stat, const char *path, void *buf) {
    119  1.1  mrg   return _REAL64(stat)(path, (struct stat *)buf);
    120  1.1  mrg }
    121  1.1  mrg 
    122  1.1  mrg DECLARE__REAL_AND_INTERNAL64(uptr, lstat, const char *path, void *buf) {
    123  1.1  mrg   return _REAL64(lstat)(path, (struct stat *)buf);
    124  1.1  mrg }
    125  1.1  mrg 
    126  1.1  mrg DECLARE__REAL_AND_INTERNAL64(uptr, fstat, fd_t fd, void *buf) {
    127  1.1  mrg   return _REAL64(fstat)(fd, (struct stat *)buf);
    128  1.1  mrg }
    129  1.1  mrg 
    130  1.1  mrg uptr internal_filesize(fd_t fd) {
    131  1.1  mrg   struct stat st;
    132  1.1  mrg   if (internal_fstat(fd, &st))
    133  1.1  mrg     return -1;
    134  1.1  mrg   return (uptr)st.st_size;
    135  1.1  mrg }
    136  1.1  mrg 
    137  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, dup, int oldfd) {
    138  1.1  mrg   return _REAL(dup)(oldfd);
    139  1.1  mrg }
    140  1.1  mrg 
    141  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, dup2, int oldfd, int newfd) {
    142  1.1  mrg   return _REAL(dup2)(oldfd, newfd);
    143  1.1  mrg }
    144  1.1  mrg 
    145  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, readlink, const char *path, char *buf,
    146  1.1  mrg                            uptr bufsize) {
    147  1.1  mrg   return _REAL(readlink)(path, buf, bufsize);
    148  1.1  mrg }
    149  1.1  mrg 
    150  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, unlink, const char *path) {
    151  1.1  mrg   return _REAL(unlink)(path);
    152  1.1  mrg }
    153  1.1  mrg 
    154  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, rename, const char *oldpath,
    155  1.1  mrg                            const char *newpath) {
    156  1.1  mrg   return _REAL(rename)(oldpath, newpath);
    157  1.1  mrg }
    158  1.1  mrg 
    159  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, sched_yield, void) {
    160  1.1  mrg   return sched_yield();
    161  1.1  mrg }
    162  1.1  mrg 
    163  1.3  mrg DECLARE__REAL_AND_INTERNAL(void, usleep, u64 useconds) {
    164  1.3  mrg   struct timespec ts;
    165  1.3  mrg   ts.tv_sec = useconds / 1000000;
    166  1.3  mrg   ts.tv_nsec = (useconds % 1000000) * 1000;
    167  1.3  mrg   nanosleep(&ts, nullptr);
    168  1.1  mrg }
    169  1.1  mrg 
    170  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, execve, const char *filename,
    171  1.1  mrg                            char *const argv[], char *const envp[]) {
    172  1.1  mrg   return _REAL(execve)(filename, argv, envp);
    173  1.1  mrg }
    174  1.1  mrg 
    175  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, waitpid, int pid, int *status, int options) {
    176  1.1  mrg   return _REAL(waitpid)(pid, status, options);
    177  1.1  mrg }
    178  1.1  mrg 
    179  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, getpid, void) {
    180  1.1  mrg   return _REAL(getpid)();
    181  1.1  mrg }
    182  1.1  mrg 
    183  1.1  mrg // FIXME: This might be wrong: _getdents doesn't take a struct linux_dirent *.
    184  1.1  mrg DECLARE__REAL_AND_INTERNAL64(uptr, getdents, fd_t fd, struct linux_dirent *dirp,
    185  1.1  mrg                              unsigned int count) {
    186  1.1  mrg   return _REAL64(getdents)(fd, dirp, count);
    187  1.1  mrg }
    188  1.1  mrg 
    189  1.1  mrg DECLARE__REAL_AND_INTERNAL64(uptr, lseek, fd_t fd, OFF_T offset, int whence) {
    190  1.1  mrg   return _REAL64(lseek)(fd, offset, whence);
    191  1.1  mrg }
    192  1.1  mrg 
    193  1.1  mrg // FIXME: This might be wrong: _sigfillset doesn't take a
    194  1.1  mrg // __sanitizer_sigset_t *.
    195  1.1  mrg DECLARE__REAL_AND_INTERNAL(void, sigfillset, __sanitizer_sigset_t *set) {
    196  1.1  mrg   _REAL(sigfillset)(set);
    197  1.1  mrg }
    198  1.1  mrg 
    199  1.1  mrg // FIXME: This might be wrong: _sigprocmask doesn't take __sanitizer_sigset_t *.
    200  1.1  mrg DECLARE__REAL_AND_INTERNAL(uptr, sigprocmask, int how,
    201  1.1  mrg                            __sanitizer_sigset_t *set,
    202  1.1  mrg                            __sanitizer_sigset_t *oldset) {
    203  1.1  mrg   return _REAL(sigprocmask)(how, set, oldset);
    204  1.1  mrg }
    205  1.1  mrg 
    206  1.1  mrg DECLARE__REAL_AND_INTERNAL(int, fork, void) {
    207  1.1  mrg   // TODO(glider): this may call user's pthread_atfork() handlers which is bad.
    208  1.1  mrg   return _REAL(fork)();
    209  1.1  mrg }
    210  1.1  mrg 
    211  1.1  mrg u64 NanoTime() {
    212  1.1  mrg   return gethrtime();
    213  1.1  mrg }
    214  1.1  mrg 
    215  1.1  mrg uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp) {
    216  1.1  mrg   // FIXME: No internal variant.
    217  1.1  mrg   return clock_gettime(clk_id, (timespec *)tp);
    218  1.1  mrg }
    219  1.1  mrg 
    220  1.1  mrg // ----------------- sanitizer_common.h
    221  1.3  mrg void FutexWait(atomic_uint32_t *p, u32 cmp) {
    222  1.3  mrg   // FIXME: implement actual blocking.
    223  1.3  mrg   sched_yield();
    224  1.1  mrg }
    225  1.1  mrg 
    226  1.3  mrg void FutexWake(atomic_uint32_t *p, u32 count) {}
    227  1.1  mrg 
    228  1.1  mrg }  // namespace __sanitizer
    229  1.1  mrg 
    230  1.1  mrg #endif  // SANITIZER_SOLARIS
    231