diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -7543,6 +7543,14 @@ COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ttyent, struct_ttyent_sz); return ttyent; } +#define INIT_TTYENT \ + COMMON_INTERCEPT_FUNCTION(getttyent); \ + COMMON_INTERCEPT_FUNCTION(getttynam); +#else +#define INIT_TTYENT +#endif + +#if SANITIZER_INTERCEPT_TTYENTPATH INTERCEPTOR(int, setttyentpath, char *path) { void *ctx; COMMON_INTERCEPTOR_ENTER(ctx, setttyentpath, path); @@ -7550,12 +7558,9 @@ COMMON_INTERCEPTOR_READ_RANGE(ctx, path, internal_strlen(path) + 1); return REAL(setttyentpath)(path); } -#define INIT_TTYENT \ - COMMON_INTERCEPT_FUNCTION(getttyent); \ - COMMON_INTERCEPT_FUNCTION(getttynam); \ - COMMON_INTERCEPT_FUNCTION(setttyentpath) +#define INIT_TTYENTPATH COMMON_INTERCEPT_FUNCTION(setttyentpath); #else -#define INIT_TTYENT +#define INIT_TTYENTPATH #endif #if SANITIZER_INTERCEPT_PROTOENT diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -521,7 +521,8 @@ #define SANITIZER_INTERCEPT_DEVNAME_R (SI_NETBSD || SI_FREEBSD) #define SANITIZER_INTERCEPT_FGETLN (SI_NETBSD || SI_FREEBSD) #define SANITIZER_INTERCEPT_STRMODE (SI_NETBSD || SI_FREEBSD) -#define SANITIZER_INTERCEPT_TTYENT SI_NETBSD +#define SANITIZER_INTERCEPT_TTYENT (SI_NETBSD || SI_FREEBSD) +#define SANITIZER_INTERCEPT_TTYENTPATH SI_NETBSD #define SANITIZER_INTERCEPT_PROTOENT (SI_LINUX || SI_NETBSD || SI_FREEBSD) #define SANITIZER_INTERCEPT_PROTOENT_R SI_GLIBC #define SANITIZER_INTERCEPT_NETENT (SI_LINUX || SI_NETBSD || SI_FREEBSD) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_freebsd.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_freebsd.h --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_freebsd.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_freebsd.h @@ -383,6 +383,8 @@ extern unsigned path_max; +extern int struct_ttyent_sz; + struct __sanitizer_wordexp_t { uptr we_wordc; char **we_wordv; @@ -412,6 +414,16 @@ } ifc_ifcu; }; +struct __sanitizer__ttyent { + char *ty_name; + char *ty_getty; + char *ty_type; + int ty_status; + char *ty_window; + char *ty_comment; + char *ty_group; +}; + # define IOC_NRBITS 8 # define IOC_TYPEBITS 8 # if defined(__powerpc__) || defined(__powerpc64__) || defined(__mips__) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_freebsd.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_freebsd.cpp --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_freebsd.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_freebsd.cpp @@ -74,6 +74,7 @@ #include #include #include +#include #include #include #include @@ -174,6 +175,8 @@ unsigned path_max = PATH_MAX; +int struct_ttyent_sz = sizeof(struct ttyent); + // ioctl arguments unsigned struct_ifreq_sz = sizeof(struct ifreq); unsigned struct_termios_sz = sizeof(struct termios); diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/ttyent.cpp b/compiler-rt/test/sanitizer_common/TestCases/Linux/ttyent.cpp new file mode 100644 --- /dev/null +++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/ttyent.cpp @@ -0,0 +1,60 @@ +// RUN: %clangxx -O0 -g %s -o %t +// +// REQUIRES: freebsd, netbsd + +#include +#include +#include + +#include +#include +#include + +void test1() { + struct ttyent *typ = getttyent(); + assert(typ && typ->ty_name != nullptr); + assert(typ->ty_type != nullptr); + endttyent(); +} + +void test2() { + struct ttyent *typ = getttynam("console"); + assert(typ && typ->ty_name != nullptr); + assert(typ->ty_type != nullptr); + endttyent(); +} + +void test3() { + if (!setttyent()) + exit(1); + + struct ttyent *typ = getttyent(); + assert(typ && typ->ty_name != nullptr); + assert(typ->ty_type != nullptr); + endttyent(); +} + +#if defined(__NetBSD__) +void test4() { + if (!setttyentpath(_PATH_TTYS)) + exit(1); + + struct ttyent *typ = getttyent(); + assert(typ && typ->ty_name != nullptr); + assert(typ->ty_type != nullptr); + assert(typ->ty_class != nullptr); + + endttyent(); +} +#endif + +int main(void) { + test1(); + test2(); + test3(); +#if defined(__NetBSD__) + test4(); +#endif + + return 0; +} diff --git a/compiler-rt/test/sanitizer_common/TestCases/NetBSD/ttyent.cpp b/compiler-rt/test/sanitizer_common/TestCases/NetBSD/ttyent.cpp deleted file mode 100644 --- a/compiler-rt/test/sanitizer_common/TestCases/NetBSD/ttyent.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s - -#include -#include -#include - -#define STRING_OR_NULL(x) ((x) ? (x) : "null") - -void test1() { - struct ttyent *typ = getttyent(); - - printf("%s %s %s %d %s %s %s\n", STRING_OR_NULL(typ->ty_name), - STRING_OR_NULL(typ->ty_getty), STRING_OR_NULL(typ->ty_type), - typ->ty_status, STRING_OR_NULL(typ->ty_window), - STRING_OR_NULL(typ->ty_comment), STRING_OR_NULL(typ->ty_class)); - - endttyent(); -} - -void test2() { - struct ttyent *typ = getttynam("console"); - - printf("%s %s %s %d %s %s %s\n", STRING_OR_NULL(typ->ty_name), - STRING_OR_NULL(typ->ty_getty), STRING_OR_NULL(typ->ty_type), - typ->ty_status, STRING_OR_NULL(typ->ty_window), - STRING_OR_NULL(typ->ty_comment), STRING_OR_NULL(typ->ty_class)); - - endttyent(); -} - -void test3() { - if (!setttyent()) - exit(1); - - struct ttyent *typ = getttyent(); - - printf("%s %s %s %d %s %s %s\n", STRING_OR_NULL(typ->ty_name), - STRING_OR_NULL(typ->ty_getty), STRING_OR_NULL(typ->ty_type), - typ->ty_status, STRING_OR_NULL(typ->ty_window), - STRING_OR_NULL(typ->ty_comment), STRING_OR_NULL(typ->ty_class)); - - endttyent(); -} - -void test4() { - if (!setttyentpath(_PATH_TTYS)) - exit(1); - - struct ttyent *typ = getttyent(); - - printf("%s %s %s %d %s %s %s\n", STRING_OR_NULL(typ->ty_name), - STRING_OR_NULL(typ->ty_getty), STRING_OR_NULL(typ->ty_type), - typ->ty_status, STRING_OR_NULL(typ->ty_window), - STRING_OR_NULL(typ->ty_comment), STRING_OR_NULL(typ->ty_class)); - - endttyent(); -} - -int main(void) { - printf("ttyent\n"); - - test1(); - test2(); - test3(); - test4(); - - // CHECK: ttyent - - return 0; -}