summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamil Rytarowski <n54@gmx.com>2018-02-27 02:30:16 +0000
committerKamil Rytarowski <n54@gmx.com>2018-02-27 02:30:16 +0000
commitcb26bd2b62ab2eb08d31d848e0c961c5234c490f (patch)
tree1dc8b4bb233a874b2c3f33a838a2fe5e7c477da8
parent14d860750b83d8bca83893da003b8cad890344da (diff)
Add new interceptors: getttyent(3) family
Summary: getttyent, getttynam, setttyentpath - get ttys file entry Reuse them on NetBSD. Sponsored by <The NetBSD Foundation> Reviewers: vitalybuka, joerg Reviewed By: vitalybuka Subscribers: llvm-commits, kubamracek, #sanitizers Tags: #sanitizers Differential Revision: https://reviews.llvm.org/D43539 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@326161 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/sanitizer_common/sanitizer_common_interceptors.inc35
-rw-r--r--lib/sanitizer_common/sanitizer_platform_interceptors.h1
-rw-r--r--lib/sanitizer_common/sanitizer_platform_limits_netbsd.cc3
-rw-r--r--lib/sanitizer_common/sanitizer_platform_limits_netbsd.h12
-rw-r--r--test/sanitizer_common/TestCases/NetBSD/ttyent.cc70
5 files changed, 121 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc
index 776804112..9121759ba 100644
--- a/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -6851,6 +6851,40 @@ INTERCEPTOR(void, strmode, u32 mode, char *bp) {
#define INIT_STRMODE
#endif
+#if SANITIZER_INTERCEPT_TTYENT
+INTERCEPTOR(struct __sanitizer_ttyent *, getttyent, void) {
+ void *ctx;
+ COMMON_INTERCEPTOR_ENTER(ctx, getttyent);
+ struct __sanitizer_ttyent *ttyent = REAL(getttyent)();
+ if (ttyent)
+ COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ttyent, struct_ttyent_sz);
+ return ttyent;
+}
+INTERCEPTOR(struct __sanitizer_ttyent *, getttynam, char *name) {
+ void *ctx;
+ COMMON_INTERCEPTOR_ENTER(ctx, getttynam, name);
+ if (name)
+ COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1);
+ struct __sanitizer_ttyent *ttyent = REAL(getttynam)(name);
+ if (ttyent)
+ COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ttyent, struct_ttyent_sz);
+ return ttyent;
+}
+INTERCEPTOR(int, setttyentpath, char *path) {
+ void *ctx;
+ COMMON_INTERCEPTOR_ENTER(ctx, setttyentpath, path);
+ if (path)
+ COMMON_INTERCEPTOR_READ_RANGE(ctx, path, REAL(strlen)(path) + 1);
+ return REAL(setttyentpath)(path);
+}
+#define INIT_TTYENT \
+ COMMON_INTERCEPT_FUNCTION(getttyent); \
+ COMMON_INTERCEPT_FUNCTION(getttynam); \
+ COMMON_INTERCEPT_FUNCTION(setttyentpath)
+#else
+#define INIT_TTYENT
+#endif
+
static void InitializeCommonInterceptors() {
static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1];
interceptor_metadata_map = new((void *)&metadata_mem) MetadataHashMap();
@@ -7081,6 +7115,7 @@ static void InitializeCommonInterceptors() {
INIT_DEVNAME_R;
INIT_FGETLN;
INIT_STRMODE;
+ INIT_TTYENT;
#if SANITIZER_NETBSD
COMMON_INTERCEPT_FUNCTION(__libc_mutex_lock);
diff --git a/lib/sanitizer_common/sanitizer_platform_interceptors.h b/lib/sanitizer_common/sanitizer_platform_interceptors.h
index f081ecd11..46f381b20 100644
--- a/lib/sanitizer_common/sanitizer_platform_interceptors.h
+++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h
@@ -461,5 +461,6 @@
#define SANITIZER_INTERCEPT_DEVNAME_R SI_NETBSD
#define SANITIZER_INTERCEPT_FGETLN SI_NETBSD
#define SANITIZER_INTERCEPT_STRMODE SI_NETBSD
+#define SANITIZER_INTERCEPT_TTYENT SI_NETBSD
#endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H
diff --git a/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cc b/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cc
index 8d863eb43..b7d67e446 100644
--- a/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cc
+++ b/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cc
@@ -198,6 +198,7 @@
#include <term.h>
#include <termios.h>
#include <time.h>
+#include <ttyent.h>
#include <utime.h>
#include <utmp.h>
#include <utmpx.h>
@@ -338,6 +339,8 @@ int glob_altdirfunc = GLOB_ALTDIRFUNC;
unsigned path_max = PATH_MAX;
+int struct_ttyent_sz = sizeof(struct ttyent);
+
// ioctl arguments
unsigned struct_altqreq_sz = sizeof(altqreq);
unsigned struct_amr_user_ioctl_sz = sizeof(amr_user_ioctl);
diff --git a/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h b/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h
index 828411e7f..194f70506 100644
--- a/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h
+++ b/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h
@@ -362,6 +362,8 @@ extern int glob_altdirfunc;
extern unsigned path_max;
+extern int struct_ttyent_sz;
+
extern int ptrace_pt_io;
extern int ptrace_pt_lwpinfo;
extern int ptrace_pt_set_event_mask;
@@ -437,6 +439,16 @@ struct __sanitizer_ifconf {
} 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_class;
+};
+
#define IOC_NRBITS 8
#define IOC_TYPEBITS 8
#define IOC_SIZEBITS 14
diff --git a/test/sanitizer_common/TestCases/NetBSD/ttyent.cc b/test/sanitizer_common/TestCases/NetBSD/ttyent.cc
new file mode 100644
index 000000000..73bc0a5da
--- /dev/null
+++ b/test/sanitizer_common/TestCases/NetBSD/ttyent.cc
@@ -0,0 +1,70 @@
+// RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ttyent.h>
+
+#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;
+}