Subject: Re: bug#77232: [PATCH] Allow also to get attributes of the terminal line

From: "Dr. Werner Fink" <[email-masked]>
Date: Mon, 7 Apr 2025 13:51:07 +0200

On 2025/04/05 11:43:40 +0300, Eli Zaretskii wrote:
> Ping! Werner, do you plan on submitting a modified patch?

What is about the attacheds patch ... here I go with the
latest manual page ioctl_tty(2) as well if the macro
MAP_DROPPABLE is not defined then the value 0x08 is
used.

> > From: Philipp Stephani <[email-masked]>
> > Date: Tue, 25 Mar 2025 17:22:22 +0100
> > Cc: Eli Zaretskii <[email-masked]>,
> >  [email-masked]
> > 
> > 
> > 
> > > Am 25.03.2025 um 16:24 schrieb Dr. Werner Fink <[email-masked]>:
> > > 
> > > On 2025/03/25 16:06:39 +0100, Philipp Stephani wrote:
> > >>>> #endif
> > >>>> 
> > >>>> +/* https://github.com/torvalds/linux/commit/9651fcedf7b92d3f7f1ab179e8ab55b85ee10fc1 */
> > >>>> +#ifndef MAP_DROPPABLE
> > >>>> +#define MAP_DROPPABLE 0x0
> > >> 
> > >> Shouldn't this be 0x08? At least that's how it's defined in mman.h.
> > > 
> > > If the kernel does not know (means header does not know) we should not
> > > set an unknown flags as this will fail also (IMHO).
> > > Only if older header files are used in combination with newer kernel
> > > we would see the current behaviour.
> > 
> > The code in question doesn't actually call mmap, it creates a syscall filter that tests whether any unknown flags are set.  Basically
> >   if ((flags & ~known_flags) != 0) abort();
> > So putting something into known_flags that might not be known to the kernel when Emacs is run is harmless.  In fact, it's beneficial for the case where the mman.h that's used when compiling seccomp-filter.c is older than the kernel that will be used to run Emacs.

Werner

-- 
  "Having a smoking section in a restaurant is like having
          a peeing section in a swimming pool." -- Edward Burr
Allow also to get attributes of the terminal line as
well as support mmap(2) flag MAP_DROPPABLE to allow
zero memory under memory pressure.

---
 lib-src/seccomp-filter.c |   19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

--- lib-src/seccomp-filter.c
+++ lib-src/seccomp-filter.c	2025-03-19 12:29:10.689765873 +0000
@@ -42,6 +42,7 @@ variants of those files that can be used
 #include <stdlib.h>
 #include <stdint.h>
 #include <stdio.h>
+#include <asm/termbits.h>  /* mandatory accordingly to latest ioctl_tty(2) */
 #include <time.h>
 
 #include <asm/prctl.h>
@@ -64,6 +71,11 @@ variants of those files that can be used
 #define ARCH_CET_STATUS 0x3001
 #endif
 
+/* https://github.com/torvalds/linux/commit/9651fcedf7b92d3f7f1ab179e8ab55b85ee10fc1 */
+#ifndef MAP_DROPPABLE
+#define MAP_DROPPABLE 0x08
+#endif
+
 static ATTRIBUTE_FORMAT_PRINTF (2, 3) _Noreturn void
 fail (int error, const char *format, ...)
 {
@@ -187,7 +199,7 @@ main (int argc, char **argv)
            some versions of the dynamic loader still use it.  Also
            allow allocating thread stacks.  */
         SCMP_A3_32 (SCMP_CMP_MASKED_EQ,
-                    ~(MAP_SHARED | MAP_PRIVATE | MAP_FILE
+                    ~(MAP_SHARED | MAP_PRIVATE | MAP_FILE | MAP_DROPPABLE
                       | MAP_ANONYMOUS | MAP_FIXED | MAP_DENYWRITE
                       | MAP_STACK | MAP_NORESERVE),
                     0));
@@ -274,6 +286,11 @@ main (int argc, char **argv)
         SCMP_A0_32 (SCMP_CMP_EQ, STDIN_FILENO),
         SCMP_A1_32 (SCMP_CMP_EQ, TIOCGPGRP));
 
+  /* Allow `tcgetattr' call of glibc on physical terminal devices. */
+  RULE (SCMP_ACT_ALLOW, SCMP_SYS (ioctl),
+        SCMP_A0_32 (SCMP_CMP_EQ, STDERR_FILENO),
+        SCMP_A1_32 (SCMP_CMP_EQ, TCGETS));
+
   /* Allow reading (but not setting) file flags.  */
   RULE (SCMP_ACT_ALLOW, SCMP_SYS (fcntl),
         SCMP_A1_32 (SCMP_CMP_EQ, F_GETFL));