@@ -115,15 +115,8 @@ extern struct ps_strings *__ps_strings;
115
115
# endif
116
116
117
117
# if SANITIZER_EMSCRIPTEN
118
- # define weak __attribute__ (__weak__)
119
- # define hidden __attribute__ ((__visibility__(" hidden" )))
120
- # include < syscall.h>
121
- # undef weak
122
- # undef hidden
123
- # include < emscripten/threading.h>
124
- # include < math.h>
125
- # include < wasi/api.h>
126
- # include < wasi/wasi-helpers.h>
118
+ # include < math.h> // For INFINITY
119
+ # include < emscripten/threading.h> // For emscripten_futex_wait
127
120
# endif
128
121
129
122
extern char **environ;
@@ -254,8 +247,8 @@ ScopedBlockSignals::~ScopedBlockSignals() { SetSigProcMask(&saved_, nullptr); }
254
247
# endif
255
248
256
249
// --------------- sanitizer_libc.h
257
- # if !SANITIZER_SOLARIS && !SANITIZER_NETBSD
258
- # if !SANITIZER_S390 && !SANITIZER_EMSCRIPTEN
250
+ # if !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
251
+ # if !SANITIZER_S390
259
252
uptr internal_mmap (void *addr, uptr length, int prot, int flags, int fd,
260
253
u64 offset) {
261
254
# if SANITIZER_FREEBSD
@@ -270,25 +263,23 @@ uptr internal_mmap(void *addr, uptr length, int prot, int flags, int fd,
270
263
(OFF_T)(offset / 4096 ));
271
264
# endif
272
265
}
273
- # endif // !SANITIZER_S390 && !SANITIZER_EMSCRIPTEN
266
+ # endif // !SANITIZER_S390
274
267
275
- # if !SANITIZER_EMSCRIPTEN
276
268
uptr internal_munmap (void *addr, uptr length) {
277
269
return internal_syscall (SYSCALL (munmap), (uptr)addr, length);
278
270
}
279
271
280
- # if SANITIZER_LINUX
272
+ # if SANITIZER_LINUX
281
273
uptr internal_mremap (void *old_address, uptr old_size, uptr new_size, int flags,
282
274
void *new_address) {
283
275
return internal_syscall (SYSCALL (mremap), (uptr)old_address, old_size,
284
276
new_size, flags, (uptr)new_address);
285
277
}
286
- # endif
278
+ # endif
287
279
288
280
int internal_mprotect (void *addr, uptr length, int prot) {
289
281
return internal_syscall (SYSCALL (mprotect), (uptr)addr, length, prot);
290
282
}
291
- # endif
292
283
293
284
int internal_madvise (uptr addr, uptr length, int advice) {
294
285
return internal_syscall (SYSCALL (madvise), addr, length, advice);
@@ -299,25 +290,18 @@ uptr internal_close_range(fd_t lowfd, fd_t highfd, int flags) {
299
290
return internal_syscall (SYSCALL (close_range), lowfd, highfd, flags);
300
291
}
301
292
# endif
302
-
303
- uptr internal_close (fd_t fd) {
304
- # if SANITIZER_EMSCRIPTEN
305
- return __wasi_fd_close (fd);
306
- # else
307
- return internal_syscall (SYSCALL (close), fd);
308
- # endif
309
- }
293
+ uptr internal_close (fd_t fd) { return internal_syscall (SYSCALL (close), fd); }
310
294
311
295
uptr internal_open (const char *filename, int flags) {
312
- # if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
296
+ # if SANITIZER_LINUX
313
297
return internal_syscall (SYSCALL (openat), AT_FDCWD, (uptr)filename, flags);
314
298
# else
315
299
return internal_syscall (SYSCALL (open), (uptr)filename, flags);
316
300
# endif
317
301
}
318
302
319
303
uptr internal_open (const char *filename, int flags, u32 mode) {
320
- # if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
304
+ # if SANITIZER_LINUX
321
305
return internal_syscall (SYSCALL (openat), AT_FDCWD, (uptr)filename, flags,
322
306
mode);
323
307
# else
@@ -326,35 +310,17 @@ uptr internal_open(const char *filename, int flags, u32 mode) {
326
310
}
327
311
328
312
uptr internal_read (fd_t fd, void *buf, uptr count) {
329
- # if SANITIZER_EMSCRIPTEN
330
- __wasi_iovec_t iov = {(uint8_t *)buf, count};
331
- size_t num;
332
- if (__wasi_syscall_ret (__wasi_fd_read (fd, &iov, 1 , &num))) {
333
- return -1 ;
334
- }
335
- return num;
336
- # else
337
313
sptr res;
338
314
HANDLE_EINTR (res,
339
315
(sptr)internal_syscall (SYSCALL (read), fd, (uptr)buf, count));
340
316
return res;
341
- # endif
342
317
}
343
318
344
319
uptr internal_write (fd_t fd, const void *buf, uptr count) {
345
- # if SANITIZER_EMSCRIPTEN
346
- __wasi_ciovec_t iov = {(const uint8_t *)buf, count};
347
- size_t num;
348
- if (__wasi_syscall_ret (__wasi_fd_write (fd, &iov, 1 , &num))) {
349
- return -1 ;
350
- }
351
- return num;
352
- # else
353
320
sptr res;
354
321
HANDLE_EINTR (res,
355
322
(sptr)internal_syscall (SYSCALL (write), fd, (uptr)buf, count));
356
323
return res;
357
- # endif
358
324
}
359
325
360
326
uptr internal_ftruncate (fd_t fd, uptr size) {
@@ -577,15 +543,15 @@ uptr internal_filesize(fd_t fd) {
577
543
uptr internal_dup (int oldfd) { return internal_syscall (SYSCALL (dup), oldfd); }
578
544
579
545
uptr internal_dup2 (int oldfd, int newfd) {
580
- # if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
546
+ # if SANITIZER_LINUX
581
547
return internal_syscall (SYSCALL (dup3), oldfd, newfd, 0 );
582
548
# else
583
549
return internal_syscall (SYSCALL (dup2), oldfd, newfd);
584
550
# endif
585
551
}
586
552
587
553
uptr internal_readlink (const char *path, char *buf, uptr bufsize) {
588
- # if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
554
+ # if SANITIZER_LINUX
589
555
return internal_syscall (SYSCALL (readlinkat), AT_FDCWD, (uptr)path, (uptr)buf,
590
556
bufsize);
591
557
# else
@@ -594,7 +560,7 @@ uptr internal_readlink(const char *path, char *buf, uptr bufsize) {
594
560
}
595
561
596
562
uptr internal_unlink (const char *path) {
597
- # if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
563
+ # if SANITIZER_LINUX
598
564
return internal_syscall (SYSCALL (unlinkat), AT_FDCWD, (uptr)path, 0 );
599
565
# else
600
566
return internal_syscall (SYSCALL (unlink), (uptr)path);
@@ -605,54 +571,40 @@ uptr internal_rename(const char *oldpath, const char *newpath) {
605
571
# if (defined(__riscv) || defined(__loongarch__)) && defined(__linux__)
606
572
return internal_syscall (SYSCALL (renameat2), AT_FDCWD, (uptr)oldpath, AT_FDCWD,
607
573
(uptr)newpath, 0 );
608
- # elif SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
574
+ # elif SANITIZER_LINUX
609
575
return internal_syscall (SYSCALL (renameat), AT_FDCWD, (uptr)oldpath, AT_FDCWD,
610
576
(uptr)newpath);
611
577
# else
612
578
return internal_syscall (SYSCALL (rename), (uptr)oldpath, (uptr)newpath);
613
579
# endif
614
580
}
615
581
616
- uptr internal_sched_yield () {
617
- # if SANITIZER_EMSCRIPTEN
618
- return 0 ;
619
- # else
620
- return internal_syscall (SYSCALL (sched_yield));
621
- # endif
622
- }
582
+ uptr internal_sched_yield () { return internal_syscall (SYSCALL (sched_yield)); }
623
583
624
584
void internal_usleep (u64 useconds) {
625
- # if SANITIZER_EMSCRIPTEN
626
- usleep (useconds);
627
- # else
628
585
struct timespec ts;
629
586
ts.tv_sec = useconds / 1000000 ;
630
587
ts.tv_nsec = (useconds % 1000000 ) * 1000 ;
631
588
internal_syscall (SYSCALL (nanosleep), &ts, &ts);
632
- # endif
633
589
}
634
590
635
- # if !SANITIZER_EMSCRIPTEN
636
591
uptr internal_execve (const char *filename, char *const argv[],
637
592
char *const envp[]) {
638
593
return internal_syscall (SYSCALL (execve), (uptr)filename, (uptr)argv,
639
594
(uptr)envp);
640
595
}
641
- # endif // !SANITIZER_EMSCRIPTEN
642
- # endif // !SANITIZER_SOLARIS && !SANITIZER_NETBSD
596
+ # endif // !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
643
597
644
- # if !SANITIZER_NETBSD
598
+ # if !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
645
599
void internal__exit (int exitcode) {
646
- # if SANITIZER_EMSCRIPTEN
647
- __wasi_proc_exit (exitcode);
648
- # elif SANITIZER_FREEBSD || SANITIZER_SOLARIS
600
+ # if SANITIZER_FREEBSD || SANITIZER_SOLARIS
649
601
internal_syscall (SYSCALL (exit), exitcode);
650
602
# else
651
603
internal_syscall (SYSCALL (exit_group), exitcode);
652
604
# endif
653
605
Die (); // Unreachable.
654
606
}
655
- # endif // !SANITIZER_NETBSD
607
+ # endif // !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
656
608
657
609
// ----------------- sanitizer_common.h
658
610
bool FileExists (const char *filename) {
@@ -672,16 +624,14 @@ bool DirExists(const char *path) {
672
624
return S_ISDIR (st.st_mode );
673
625
}
674
626
675
- # if !SANITIZER_NETBSD
627
+ # if !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
676
628
tid_t GetTid () {
677
629
# if SANITIZER_FREEBSD
678
630
long Tid;
679
631
thr_self (&Tid);
680
632
return Tid;
681
633
# elif SANITIZER_SOLARIS
682
634
return thr_self ();
683
- # elif SANITIZER_EMSCRIPTEN
684
- return (tid_t )pthread_self ();
685
635
# else
686
636
return internal_syscall (SYSCALL (gettid));
687
637
# endif
@@ -722,16 +672,6 @@ u64 NanoTime() {
722
672
}
723
673
# endif
724
674
725
- # if SANITIZER_EMSCRIPTEN
726
- extern " C" {
727
- int __clock_gettime (__sanitizer_clockid_t clk_id, void *tp);
728
- }
729
-
730
- uptr internal_clock_gettime (__sanitizer_clockid_t clk_id, void *tp) {
731
- return __clock_gettime (clk_id, tp);
732
- }
733
- # endif
734
-
735
675
// Like getenv, but reads env directly from /proc (on Linux) or parses the
736
676
// 'environ' array (on some others) and does not use libc. This function
737
677
// should be called first inside __asan_init.
@@ -916,14 +856,12 @@ struct linux_dirent {
916
856
};
917
857
# endif
918
858
919
- # if !SANITIZER_SOLARIS && !SANITIZER_NETBSD
920
- # if !SANITIZER_EMSCRIPTEN
859
+ # if !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
921
860
// Syscall wrappers.
922
861
uptr internal_ptrace (int request, int pid, void *addr, void *data) {
923
862
return internal_syscall (SYSCALL (ptrace), request, pid, (uptr)addr,
924
863
(uptr)data);
925
864
}
926
- # endif
927
865
928
866
uptr internal_waitpid (int pid, int *status, int options) {
929
867
return internal_syscall (SYSCALL (wait4), pid, (uptr)status, options,
@@ -953,14 +891,7 @@ uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count) {
953
891
}
954
892
955
893
uptr internal_lseek (fd_t fd, OFF_T offset, int whence) {
956
- # if SANITIZER_EMSCRIPTEN
957
- __wasi_filesize_t result;
958
- return __wasi_syscall_ret (__wasi_fd_seek (fd, offset, whence, &result))
959
- ? -1
960
- : result;
961
- # else
962
894
return internal_syscall (SYSCALL (lseek), fd, offset, whence);
963
- # endif
964
895
}
965
896
966
897
# if SANITIZER_LINUX
@@ -976,32 +907,25 @@ uptr internal_arch_prctl(int option, uptr arg2) {
976
907
# endif
977
908
# endif
978
909
979
- # if !SANITIZER_EMSCRIPTEN
980
910
uptr internal_sigaltstack (const void *ss, void *oss) {
981
911
return internal_syscall (SYSCALL (sigaltstack), (uptr)ss, (uptr)oss);
982
912
}
983
- # endif
984
913
985
914
extern " C" pid_t __fork (void );
986
915
987
916
int internal_fork () {
988
- # if SANITIZER_EMSCRIPTEN
989
- Report (" fork not supported on emscripten\n " );
990
- return -1 ;
991
- # else
992
- # if SANITIZER_LINUX
993
- # if SANITIZER_S390
917
+ # if SANITIZER_LINUX
918
+ # if SANITIZER_S390
994
919
return internal_syscall (SYSCALL (clone), 0 , SIGCHLD);
995
- # elif SANITIZER_SPARC
920
+ # elif SANITIZER_SPARC
996
921
// The clone syscall interface on SPARC differs massively from the rest,
997
922
// so fall back to __fork.
998
923
return __fork ();
999
- # else
1000
- return internal_syscall (SYSCALL (clone), SIGCHLD, 0 );
1001
- # endif
1002
924
# else
1003
- return internal_syscall (SYSCALL (fork) );
925
+ return internal_syscall (SYSCALL (clone), SIGCHLD, 0 );
1004
926
# endif
927
+ # else
928
+ return internal_syscall (SYSCALL (fork));
1005
929
# endif
1006
930
}
1007
931
@@ -1093,8 +1017,6 @@ uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
1093
1017
__sanitizer_sigset_t *oldset) {
1094
1018
# if SANITIZER_FREEBSD
1095
1019
return internal_syscall (SYSCALL (sigprocmask), how, set, oldset);
1096
- # elif SANITIZER_EMSCRIPTEN
1097
- return 0 ;
1098
1020
# else
1099
1021
__sanitizer_kernel_sigset_t *k_set = (__sanitizer_kernel_sigset_t *)set;
1100
1022
__sanitizer_kernel_sigset_t *k_oldset = (__sanitizer_kernel_sigset_t *)oldset;
@@ -1146,7 +1068,7 @@ bool internal_sigismember(__sanitizer_sigset_t *set, int signum) {
1146
1068
return sigismember (rset, signum);
1147
1069
}
1148
1070
# endif
1149
- # endif // !SANITIZER_SOLARIS
1071
+ # endif // !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
1150
1072
1151
1073
# if !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
1152
1074
// ThreadLister implementation.
0 commit comments