[compiler-rt] [sanitizer] Remove usage of termios ioctl constants on Linux (PR #149140)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 17 18:49:23 PDT 2025
https://github.com/trcrsired updated https://github.com/llvm/llvm-project/pull/149140
>From d011ca7c22f682dad4cc26916c4bbd83570ae7eb Mon Sep 17 00:00:00 2001
From: trcrsired <uwgghhbcad at gmail.com>
Date: Thu, 17 Jul 2025 12:18:30 +0800
Subject: [PATCH 1/2] [sanitizer] Remove usage of termios ioctl constants for
glibc
glibc 2.42 made all usage of termios ioctl constants strictly internal.
Therefore, we remove all usage for those removed constants for glibc.
We keep a pesudo definition for PowerPC to make bots happy.
---
.../sanitizer_common_interceptors_ioctl.inc | 12 ++++++----
.../lib/sanitizer_common/sanitizer_platform.h | 22 +++++++++++++++++++
.../sanitizer_platform_limits_posix.cpp | 12 ++++++----
.../sanitizer_platform_limits_posix.h | 4 +++-
4 files changed, 41 insertions(+), 9 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
index 08c2be47f5358..02649b7f1f202 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
@@ -344,12 +344,16 @@ static void ioctl_table_fill() {
_(SOUND_PCM_WRITE_CHANNELS, WRITE, sizeof(int));
_(SOUND_PCM_WRITE_FILTER, WRITE, sizeof(int));
_(TCFLSH, NONE, 0);
- _(TCGETS, WRITE, struct_termios_sz);
+# if SANITIZER_TERMIOS_IOCTL_CONSTANTS
+ _(SANITIZER_TCGETS, WRITE, struct_termios_sz);
+# endif
_(TCSBRK, NONE, 0);
_(TCSBRKP, NONE, 0);
- _(TCSETS, READ, struct_termios_sz);
- _(TCSETSF, READ, struct_termios_sz);
- _(TCSETSW, READ, struct_termios_sz);
+# if SANITIZER_TERMIOS_IOCTL_CONSTANTS
+ _(SANITIZER_TCSETS, READ, struct_termios_sz);
+ _(SANITIZER_TCSETSF, READ, struct_termios_sz);
+ _(SANITIZER_TCSETSW, READ, struct_termios_sz);
+# endif
_(TCXONC, NONE, 0);
_(TIOCGLCKTRMIOS, WRITE, struct_termios_sz);
_(TIOCGSOFTCAR, WRITE, sizeof(int));
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
index 196c0a988478e..54f0bca42d0d4 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
@@ -482,4 +482,26 @@
# define SANITIZER_START_BACKGROUND_THREAD_IN_ASAN_INTERNAL 0
#endif
+#if SANITIZER_LINUX
+# if !SANITIZER_GLIBC || SANITIZER_PPC
+// Workaround for
+// glibc/commit/3d3572f59059e2b19b8541ea648a6172136ec42e
+// Linux: Keep termios ioctl constants strictly internal
+# define SANITIZER_TERMIOS_IOCTL_CONSTANTS 1
+# if SANITIZER_GLIBC && SANITIZER_PPC
+# define SANITIZER_TCGETS 0x402c7413
+# define SANITIZER_TCSETS 0x802c7414
+# define SANITIZER_TCSETSF 0x802c7415
+# define SANITIZER_TCSETSW 0x802c7416
+# else
+# define SANITIZER_TCGETS TCGETS
+# define SANITIZER_TCSETS TCSETS
+# define SANITIZER_TCSETSF TCSETSF
+# define SANITIZER_TCSETSW TCSETSW
+# endif
+# else
+# define SANITIZER_TERMIOS_IOCTL_CONSTANTS 0
+# endif
+#endif
+
#endif // SANITIZER_PLATFORM_H
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
index 7a89bf1c74985..3645d1069145a 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -780,15 +780,19 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
#endif // SOUND_VERSION
unsigned IOCTL_TCFLSH = TCFLSH;
unsigned IOCTL_TCGETA = TCGETA;
- unsigned IOCTL_TCGETS = TCGETS;
+# if SANITIZER_TERMIOS_IOCTL_CONSTANTS
+ unsigned IOCTL_TCGETS = SANITIZER_TCGETS;
+# endif
unsigned IOCTL_TCSBRK = TCSBRK;
unsigned IOCTL_TCSBRKP = TCSBRKP;
unsigned IOCTL_TCSETA = TCSETA;
unsigned IOCTL_TCSETAF = TCSETAF;
unsigned IOCTL_TCSETAW = TCSETAW;
- unsigned IOCTL_TCSETS = TCSETS;
- unsigned IOCTL_TCSETSF = TCSETSF;
- unsigned IOCTL_TCSETSW = TCSETSW;
+# if SANITIZER_TERMIOS_IOCTL_CONSTANTS
+ unsigned IOCTL_TCSETS = SANITIZER_TCSETS;
+ unsigned IOCTL_TCSETSF = SANITIZER_TCSETSF;
+ unsigned IOCTL_TCSETSW = SANITIZER_TCSETSW;
+# endif
unsigned IOCTL_TCXONC = TCXONC;
unsigned IOCTL_TIOCGLCKTRMIOS = TIOCGLCKTRMIOS;
unsigned IOCTL_TIOCGSOFTCAR = TIOCGSOFTCAR;
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
index a2b6c37d5450c..9114b0277a55f 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -1313,15 +1313,17 @@ extern unsigned IOCTL_SNDCTL_COPR_WCODE;
extern unsigned IOCTL_SNDCTL_COPR_WDATA;
extern unsigned IOCTL_TCFLSH;
extern unsigned IOCTL_TCGETA;
-extern unsigned IOCTL_TCGETS;
extern unsigned IOCTL_TCSBRK;
extern unsigned IOCTL_TCSBRKP;
extern unsigned IOCTL_TCSETA;
extern unsigned IOCTL_TCSETAF;
extern unsigned IOCTL_TCSETAW;
+# if SANITIZER_TERMIOS_IOCTL_CONSTANTS
+extern unsigned IOCTL_TCGETS;
extern unsigned IOCTL_TCSETS;
extern unsigned IOCTL_TCSETSF;
extern unsigned IOCTL_TCSETSW;
+# endif
extern unsigned IOCTL_TCXONC;
extern unsigned IOCTL_TIOCGLCKTRMIOS;
extern unsigned IOCTL_TIOCGSOFTCAR;
>From 442ffa9a2d61ca75c30f8fd2d00458a9786a519e Mon Sep 17 00:00:00 2001
From: trcrsired <uwgghhbcad at gmail.com>
Date: Fri, 18 Jul 2025 09:48:18 +0800
Subject: [PATCH 2/2] [sanitizer] avoid using ioctl constants for glibc above
2.41
---
.../sanitizer_common_interceptors_ioctl.inc | 8 +++----
.../lib/sanitizer_common/sanitizer_platform.h | 23 ++++++-------------
.../sanitizer_platform_limits_posix.cpp | 8 +++----
3 files changed, 15 insertions(+), 24 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
index 02649b7f1f202..673f284b6a043 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
@@ -345,14 +345,14 @@ static void ioctl_table_fill() {
_(SOUND_PCM_WRITE_FILTER, WRITE, sizeof(int));
_(TCFLSH, NONE, 0);
# if SANITIZER_TERMIOS_IOCTL_CONSTANTS
- _(SANITIZER_TCGETS, WRITE, struct_termios_sz);
+ _(TCGETS, WRITE, struct_termios_sz);
# endif
_(TCSBRK, NONE, 0);
_(TCSBRKP, NONE, 0);
# if SANITIZER_TERMIOS_IOCTL_CONSTANTS
- _(SANITIZER_TCSETS, READ, struct_termios_sz);
- _(SANITIZER_TCSETSF, READ, struct_termios_sz);
- _(SANITIZER_TCSETSW, READ, struct_termios_sz);
+ _(TCSETS, READ, struct_termios_sz);
+ _(TCSETSF, READ, struct_termios_sz);
+ _(TCSETSW, READ, struct_termios_sz);
# endif
_(TCXONC, NONE, 0);
_(TIOCGLCKTRMIOS, WRITE, struct_termios_sz);
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
index 54f0bca42d0d4..8ffbc5d26da17 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
@@ -483,25 +483,16 @@
#endif
#if SANITIZER_LINUX
-# if !SANITIZER_GLIBC || SANITIZER_PPC
+# if SANITIZER_GLIBC
// Workaround for
// glibc/commit/3d3572f59059e2b19b8541ea648a6172136ec42e
// Linux: Keep termios ioctl constants strictly internal
-# define SANITIZER_TERMIOS_IOCTL_CONSTANTS 1
-# if SANITIZER_GLIBC && SANITIZER_PPC
-# define SANITIZER_TCGETS 0x402c7413
-# define SANITIZER_TCSETS 0x802c7414
-# define SANITIZER_TCSETSF 0x802c7415
-# define SANITIZER_TCSETSW 0x802c7416
+# if __GLIBC_PREREQ(2, 41)
+# define SANITIZER_TERMIOS_IOCTL_CONSTANTS 0
+# else
+# define SANITIZER_TERMIOS_IOCTL_CONSTANTS 1
+# endif
# else
-# define SANITIZER_TCGETS TCGETS
-# define SANITIZER_TCSETS TCSETS
-# define SANITIZER_TCSETSF TCSETSF
-# define SANITIZER_TCSETSW TCSETSW
+# define SANITIZER_TERMIOS_IOCTL_CONSTANTS 1
# endif
-# else
-# define SANITIZER_TERMIOS_IOCTL_CONSTANTS 0
-# endif
-#endif
-
#endif // SANITIZER_PLATFORM_H
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
index 3645d1069145a..ef4b8a85d6634 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -781,7 +781,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
unsigned IOCTL_TCFLSH = TCFLSH;
unsigned IOCTL_TCGETA = TCGETA;
# if SANITIZER_TERMIOS_IOCTL_CONSTANTS
- unsigned IOCTL_TCGETS = SANITIZER_TCGETS;
+ unsigned IOCTL_TCGETS = TCGETS;
# endif
unsigned IOCTL_TCSBRK = TCSBRK;
unsigned IOCTL_TCSBRKP = TCSBRKP;
@@ -789,9 +789,9 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
unsigned IOCTL_TCSETAF = TCSETAF;
unsigned IOCTL_TCSETAW = TCSETAW;
# if SANITIZER_TERMIOS_IOCTL_CONSTANTS
- unsigned IOCTL_TCSETS = SANITIZER_TCSETS;
- unsigned IOCTL_TCSETSF = SANITIZER_TCSETSF;
- unsigned IOCTL_TCSETSW = SANITIZER_TCSETSW;
+ unsigned IOCTL_TCSETS = TCSETS;
+ unsigned IOCTL_TCSETSF = TCSETSF;
+ unsigned IOCTL_TCSETSW = TCSETSW;
# endif
unsigned IOCTL_TCXONC = TCXONC;
unsigned IOCTL_TIOCGLCKTRMIOS = TIOCGLCKTRMIOS;
More information about the llvm-commits
mailing list