]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Merge remote-tracking branches 'public/ticket24315_029' and 'public/bug24198_029...
authorNick Mathewson <nickm@torproject.org>
Mon, 20 Nov 2017 18:20:25 +0000 (13:20 -0500)
committerNick Mathewson <nickm@torproject.org>
Mon, 20 Nov 2017 18:20:25 +0000 (13:20 -0500)
1  2  3 
configure.ac
src/common/sandbox.c

diff --cc configure.ac
Simple merge
index 7a4e3ece389e4e9a50ee92890317ddeff37c5995,d0ead2caec59537fd0b36f5da50498c72f6b8ad1,0b862a549c94db0c42b7bb85067245d8190607c8..0fd129d22c20668893a3656d5755be9ae8329962
@@@@ -394,8 -425,54 -419,8 +400,54 @@@@ sb_mmap2(scmp_filter_ctx ctx, sandbox_c
   
     return 0;
   }
 - #endif
 ++#endif /* defined(__NR_mmap2) */
  +
+ +#ifdef HAVE_GNU_LIBC_VERSION_H
+ +#ifdef HAVE_GNU_GET_LIBC_VERSION
+ +#define CHECK_LIBC_VERSION
+ +#endif
+  #endif
+  
+ +/* Return true if we think we're running with a libc that always uses
+ + * openat on linux. */
+ +static int
+ +libc_uses_openat_for_everything(void)
+ +{
+ +#ifdef CHECK_LIBC_VERSION
+ +  const char *version = gnu_get_libc_version();
+ +  if (version == NULL)
+ +    return 0;
+ +
+ +  int major = -1;
+ +  int minor = -1;
+ +
+ +  tor_sscanf(version, "%d.%d", &major, &minor);
+ +  if (major >= 3)
+ +    return 1;
+ +  else if (major == 2 && minor >= 26)
+ +    return 1;
+ +  else
+ +    return 0;
+ +#else
+ +  return 0;
+ +#endif
+ +}
+ +
+ +/** Allow a single file to be opened.  If <b>use_openat</b> is true,
+ + * we're using a libc that remaps all the opens into openats. */
+ +static int
+ +allow_file_open(scmp_filter_ctx ctx, int use_openat, const char *file)
+ +{
+ +  if (use_openat) {
+ +    return seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(openat),
+ +                              SCMP_CMP_STR(0, SCMP_CMP_EQ, AT_FDCWD),
+ +                              SCMP_CMP_STR(1, SCMP_CMP_EQ, file));
+ +  } else {
+ +    return seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open),
+ +                              SCMP_CMP_STR(0, SCMP_CMP_EQ, file));
+ +  }
+ +}
+ +
   /**
    * Function responsible for setting up the open syscall for
    * the seccomp filter sandbox.
@@@@ -1051,8 -1110,8 -1048,21 +1113,21 @@@@ sb_stat64(scmp_filter_ctx ctx, sandbox_
   
     return 0;
   }
  -#endif
 ++#endif /* defined(__NR_stat64) */
 + 
++ static int
++ sb_kill(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
++ {
++   (void) filter;
++ #ifdef __NR_kill
++   /* Allow killing anything with signal 0 -- it isn't really a kill. */
++   return seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(kill),
++        SCMP_CMP(1, SCMP_CMP_EQ, 0));
++ #else
++   return 0;
+  #endif
++ }
+  
   /**
    * Array of function pointers responsible for filtering different syscalls at
    * a parameter level.
@@@@ -1088,11 -1150,7 -1101,8 +1163,11 @@@@ static sandbox_filter_func_t filter_fun
       sb_socket,
       sb_setsockopt,
       sb_getsockopt,
 -     sb_socketpair
 +     sb_socketpair,
-  
 ++#ifdef HAVE_KIST_SUPPORT
 ++    sb_ioctl,
 ++#endif
++     sb_kill
   };
   
   const char *