Add patches to fix build on arm64
This commit is contained in:
		
							parent
							
								
									2379dd06da
								
							
						
					
					
						commit
						5fb495cb03
					
				
							
								
								
									
										38
									
								
								0010-test-seccomp-fix-compilation-on-arm64.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								0010-test-seccomp-fix-compilation-on-arm64.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | |||||||
|  | From dff6c6295b1cb09d6da8ab054e66059e43247ab1 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Wed, 3 Apr 2019 12:36:03 +0200 | ||||||
|  | Subject: [PATCH 10/11] test-seccomp: fix compilation on arm64 | ||||||
|  | 
 | ||||||
|  | It has no open(). | ||||||
|  | ---
 | ||||||
|  |  src/test/test-seccomp.c | 8 +++++++- | ||||||
|  |  1 file changed, 7 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/test/test-seccomp.c b/src/test/test-seccomp.c
 | ||||||
|  | index 8efbecbeff..9b7307cf39 100644
 | ||||||
|  | --- a/src/test/test-seccomp.c
 | ||||||
|  | +++ b/src/test/test-seccomp.c
 | ||||||
|  | @@ -7,6 +7,7 @@
 | ||||||
|  |  #include <sys/mman.h> | ||||||
|  |  #include <sys/personality.h> | ||||||
|  |  #include <sys/shm.h> | ||||||
|  | +#include <sys/syscall.h>
 | ||||||
|  |  #include <sys/types.h> | ||||||
|  |  #include <unistd.h> | ||||||
|  |   | ||||||
|  | @@ -763,9 +764,14 @@ static void test_lock_personality(void) {
 | ||||||
|  |   | ||||||
|  |  static int real_open(const char *path, int flags, mode_t mode) { | ||||||
|  |          /* glibc internally calls openat() when open() is requested. Let's hence define our own wrapper for | ||||||
|  | -         * testing purposes that calls the real syscall. */
 | ||||||
|  | +         * testing purposes that calls the real syscall, on architectures where SYS_open is defined. On
 | ||||||
|  | +         * other architectures, let's just fall back to the glibc call. */
 | ||||||
|  |   | ||||||
|  | +#ifdef SYS_open
 | ||||||
|  |          return (int) syscall(SYS_open, path, flags, mode); | ||||||
|  | +#else
 | ||||||
|  | +        return open(path, flags, mode);
 | ||||||
|  | +#endif
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static void test_restrict_suid_sgid(void) { | ||||||
							
								
								
									
										283
									
								
								0011-seccomp-rework-how-the-S-UG-ID-filter-is-installed.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										283
									
								
								0011-seccomp-rework-how-the-S-UG-ID-filter-is-installed.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,283 @@ | |||||||
|  | From da4dc9a6748797e804b6bc92ad513d509abf581c Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Wed, 3 Apr 2019 13:11:00 +0200 | ||||||
|  | Subject: [PATCH 11/11] seccomp: rework how the S[UG]ID filter is installed | ||||||
|  | 
 | ||||||
|  | If we know that a syscall is undefined on the given architecture, don't | ||||||
|  | even try to add it. | ||||||
|  | 
 | ||||||
|  | Try to install the filter even if some syscalls fail. Also use a helper | ||||||
|  | function to make the whole a bit less magic. | ||||||
|  | 
 | ||||||
|  | This allows the S[UG]ID test to pass on arm64. | ||||||
|  | ---
 | ||||||
|  |  src/shared/seccomp-util.c | 244 +++++++++++++++++++++----------------- | ||||||
|  |  1 file changed, 138 insertions(+), 106 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/shared/seccomp-util.c b/src/shared/seccomp-util.c
 | ||||||
|  | index 7a179998bd..65d800c914 100644
 | ||||||
|  | --- a/src/shared/seccomp-util.c
 | ||||||
|  | +++ b/src/shared/seccomp-util.c
 | ||||||
|  | @@ -1803,9 +1803,139 @@ int seccomp_protect_hostname(void) {
 | ||||||
|  |          return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static int seccomp_restrict_sxid(scmp_filter_ctx seccomp, mode_t m) {
 | ||||||
|  | +        /* Checks the mode_t parameter of the following system calls:
 | ||||||
|  | +         *
 | ||||||
|  | +         *       → chmod() + fchmod() + fchmodat()
 | ||||||
|  | +         *       → open() + creat() + openat()
 | ||||||
|  | +         *       → mkdir() + mkdirat()
 | ||||||
|  | +         *       → mknod() + mknodat()
 | ||||||
|  | +         *
 | ||||||
|  | +         * Returns error if *everything* failed, and 0 otherwise.
 | ||||||
|  | +         */
 | ||||||
|  | +        int r = 0;
 | ||||||
|  | +        bool any = false;
 | ||||||
|  | +
 | ||||||
|  | +        r = seccomp_rule_add_exact(
 | ||||||
|  | +                        seccomp,
 | ||||||
|  | +                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | +                        SCMP_SYS(chmod),
 | ||||||
|  | +                        1,
 | ||||||
|  | +                        SCMP_A1(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                log_debug_errno(r, "Failed to add filter for chmod: %m");
 | ||||||
|  | +        else
 | ||||||
|  | +                any = true;
 | ||||||
|  | +
 | ||||||
|  | +        r = seccomp_rule_add_exact(
 | ||||||
|  | +                        seccomp,
 | ||||||
|  | +                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | +                        SCMP_SYS(fchmod),
 | ||||||
|  | +                        1,
 | ||||||
|  | +                        SCMP_A1(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                log_debug_errno(r, "Failed to add filter for fchmod: %m");
 | ||||||
|  | +        else
 | ||||||
|  | +                any = true;
 | ||||||
|  | +
 | ||||||
|  | +        r = seccomp_rule_add_exact(
 | ||||||
|  | +                        seccomp,
 | ||||||
|  | +                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | +                        SCMP_SYS(fchmodat),
 | ||||||
|  | +                        1,
 | ||||||
|  | +                        SCMP_A2(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                log_debug_errno(r, "Failed to add filter for fchmodat: %m");
 | ||||||
|  | +        else
 | ||||||
|  | +                any = true;
 | ||||||
|  | +
 | ||||||
|  | +        r = seccomp_rule_add_exact(
 | ||||||
|  | +                        seccomp,
 | ||||||
|  | +                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | +                        SCMP_SYS(mkdir),
 | ||||||
|  | +                        1,
 | ||||||
|  | +                        SCMP_A1(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                log_debug_errno(r, "Failed to add filter for mkdir: %m");
 | ||||||
|  | +        else
 | ||||||
|  | +                any = true;
 | ||||||
|  | +
 | ||||||
|  | +        r = seccomp_rule_add_exact(
 | ||||||
|  | +                        seccomp,
 | ||||||
|  | +                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | +                        SCMP_SYS(mkdirat),
 | ||||||
|  | +                        1,
 | ||||||
|  | +                        SCMP_A2(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                log_debug_errno(r, "Failed to add filter for mkdirat: %m");
 | ||||||
|  | +        else
 | ||||||
|  | +                any = true;
 | ||||||
|  | +
 | ||||||
|  | +        r = seccomp_rule_add_exact(
 | ||||||
|  | +                        seccomp,
 | ||||||
|  | +                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | +                        SCMP_SYS(mknod),
 | ||||||
|  | +                        1,
 | ||||||
|  | +                        SCMP_A1(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                log_debug_errno(r, "Failed to add filter for mknod: %m");
 | ||||||
|  | +        else
 | ||||||
|  | +                any = true;
 | ||||||
|  | +
 | ||||||
|  | +        r = seccomp_rule_add_exact(
 | ||||||
|  | +                        seccomp,
 | ||||||
|  | +                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | +                        SCMP_SYS(mknodat),
 | ||||||
|  | +                        1,
 | ||||||
|  | +                        SCMP_A2(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                log_debug_errno(r, "Failed to add filter for mknodat: %m");
 | ||||||
|  | +        else
 | ||||||
|  | +                any = true;
 | ||||||
|  | +
 | ||||||
|  | +#if SCMP_SYS(open) > 0
 | ||||||
|  | +        r = seccomp_rule_add_exact(
 | ||||||
|  | +                        seccomp,
 | ||||||
|  | +                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | +                        SCMP_SYS(open),
 | ||||||
|  | +                        2,
 | ||||||
|  | +                        SCMP_A1(SCMP_CMP_MASKED_EQ, O_CREAT, O_CREAT),
 | ||||||
|  | +                        SCMP_A2(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                log_debug_errno(r, "Failed to add filter for open: %m");
 | ||||||
|  | +        else
 | ||||||
|  | +                any = true;
 | ||||||
|  | +#endif
 | ||||||
|  | +
 | ||||||
|  | +        r = seccomp_rule_add_exact(
 | ||||||
|  | +                        seccomp,
 | ||||||
|  | +                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | +                        SCMP_SYS(openat),
 | ||||||
|  | +                        2,
 | ||||||
|  | +                        SCMP_A2(SCMP_CMP_MASKED_EQ, O_CREAT, O_CREAT),
 | ||||||
|  | +                        SCMP_A3(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                log_debug_errno(r, "Failed to add filter for openat: %m");
 | ||||||
|  | +        else
 | ||||||
|  | +                any = true;
 | ||||||
|  | +
 | ||||||
|  | +        r = seccomp_rule_add_exact(
 | ||||||
|  | +                        seccomp,
 | ||||||
|  | +                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | +                        SCMP_SYS(creat),
 | ||||||
|  | +                        1,
 | ||||||
|  | +                        SCMP_A1(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                log_debug_errno(r, "Failed to add filter for creat: %m");
 | ||||||
|  | +        else
 | ||||||
|  | +                any = true;
 | ||||||
|  | +
 | ||||||
|  | +        return any ? 0 : r;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  int seccomp_restrict_suid_sgid(void) { | ||||||
|  |          uint32_t arch; | ||||||
|  | -        int r;
 | ||||||
|  | +        int r, k;
 | ||||||
|  |   | ||||||
|  |          SECCOMP_FOREACH_LOCAL_ARCH(arch) { | ||||||
|  |                  _cleanup_(seccomp_releasep) scmp_filter_ctx seccomp = NULL; | ||||||
|  | @@ -1814,114 +1944,16 @@ int seccomp_restrict_suid_sgid(void) {
 | ||||||
|  |                  if (r < 0) | ||||||
|  |                          return r; | ||||||
|  |   | ||||||
|  | -                /* Checks the mode_t parameter of the following system calls:
 | ||||||
|  | -                 *
 | ||||||
|  | -                 *       → chmod() + fchmod() + fchmodat()
 | ||||||
|  | -                 *       → open() + creat() + openat()
 | ||||||
|  | -                 *       → mkdir() + mkdirat()
 | ||||||
|  | -                 *       → mknod() + mknodat()
 | ||||||
|  | -                 */
 | ||||||
|  | +                r = seccomp_restrict_sxid(seccomp, S_ISUID);
 | ||||||
|  | +                if (r < 0)
 | ||||||
|  | +                        log_debug_errno(r, "Failed to add suid rule for architecture %s, ignoring: %m", seccomp_arch_to_string(arch));
 | ||||||
|  |   | ||||||
|  | -                for (unsigned bit = 0; bit < 2; bit ++) {
 | ||||||
|  | -                        /* Block S_ISUID in the first iteration, S_ISGID in the second */
 | ||||||
|  | -                        mode_t m = bit == 0 ? S_ISUID : S_ISGID;
 | ||||||
|  | +                k = seccomp_restrict_sxid(seccomp, S_ISGID);
 | ||||||
|  | +                if (k < 0)
 | ||||||
|  | +                        log_debug_errno(r, "Failed to add sgid rule for architecture %s, ignoring: %m", seccomp_arch_to_string(arch));
 | ||||||
|  |   | ||||||
|  | -                        r = seccomp_rule_add_exact(
 | ||||||
|  | -                                        seccomp,
 | ||||||
|  | -                                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | -                                        SCMP_SYS(chmod),
 | ||||||
|  | -                                        1,
 | ||||||
|  | -                                        SCMP_A1(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | -                        if (r < 0)
 | ||||||
|  | -                                break;
 | ||||||
|  | -
 | ||||||
|  | -                        r = seccomp_rule_add_exact(
 | ||||||
|  | -                                        seccomp,
 | ||||||
|  | -                                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | -                                        SCMP_SYS(fchmod),
 | ||||||
|  | -                                        1,
 | ||||||
|  | -                                        SCMP_A1(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | -                        if (r < 0)
 | ||||||
|  | -                                break;
 | ||||||
|  | -
 | ||||||
|  | -                        r = seccomp_rule_add_exact(
 | ||||||
|  | -                                        seccomp,
 | ||||||
|  | -                                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | -                                        SCMP_SYS(fchmodat),
 | ||||||
|  | -                                        1,
 | ||||||
|  | -                                        SCMP_A2(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | -                        if (r < 0)
 | ||||||
|  | -                                break;
 | ||||||
|  | -
 | ||||||
|  | -                        r = seccomp_rule_add_exact(
 | ||||||
|  | -                                        seccomp,
 | ||||||
|  | -                                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | -                                        SCMP_SYS(mkdir),
 | ||||||
|  | -                                        1,
 | ||||||
|  | -                                        SCMP_A1(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | -                        if (r < 0)
 | ||||||
|  | -                                break;
 | ||||||
|  | -
 | ||||||
|  | -                        r = seccomp_rule_add_exact(
 | ||||||
|  | -                                        seccomp,
 | ||||||
|  | -                                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | -                                        SCMP_SYS(mkdirat),
 | ||||||
|  | -                                        1,
 | ||||||
|  | -                                        SCMP_A2(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | -                        if (r < 0)
 | ||||||
|  | -                                break;
 | ||||||
|  | -
 | ||||||
|  | -                        r = seccomp_rule_add_exact(
 | ||||||
|  | -                                        seccomp,
 | ||||||
|  | -                                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | -                                        SCMP_SYS(mknod),
 | ||||||
|  | -                                        1,
 | ||||||
|  | -                                        SCMP_A1(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | -                        if (r < 0)
 | ||||||
|  | -                                break;
 | ||||||
|  | -
 | ||||||
|  | -                        r = seccomp_rule_add_exact(
 | ||||||
|  | -                                        seccomp,
 | ||||||
|  | -                                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | -                                        SCMP_SYS(mknodat),
 | ||||||
|  | -                                        1,
 | ||||||
|  | -                                        SCMP_A2(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | -                        if (r < 0)
 | ||||||
|  | -                                break;
 | ||||||
|  | -
 | ||||||
|  | -                        r = seccomp_rule_add_exact(
 | ||||||
|  | -                                        seccomp,
 | ||||||
|  | -                                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | -                                        SCMP_SYS(open),
 | ||||||
|  | -                                        2,
 | ||||||
|  | -                                        SCMP_A1(SCMP_CMP_MASKED_EQ, O_CREAT, O_CREAT),
 | ||||||
|  | -                                        SCMP_A2(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | -                        if (r < 0)
 | ||||||
|  | -                                break;
 | ||||||
|  | -
 | ||||||
|  | -                        r = seccomp_rule_add_exact(
 | ||||||
|  | -                                        seccomp,
 | ||||||
|  | -                                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | -                                        SCMP_SYS(openat),
 | ||||||
|  | -                                        2,
 | ||||||
|  | -                                        SCMP_A2(SCMP_CMP_MASKED_EQ, O_CREAT, O_CREAT),
 | ||||||
|  | -                                        SCMP_A3(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | -                        if (r < 0)
 | ||||||
|  | -                                break;
 | ||||||
|  | -
 | ||||||
|  | -                        r = seccomp_rule_add_exact(
 | ||||||
|  | -                                        seccomp,
 | ||||||
|  | -                                        SCMP_ACT_ERRNO(EPERM),
 | ||||||
|  | -                                        SCMP_SYS(creat),
 | ||||||
|  | -                                        1,
 | ||||||
|  | -                                        SCMP_A1(SCMP_CMP_MASKED_EQ, m, m));
 | ||||||
|  | -                        if (r < 0)
 | ||||||
|  | -                                break;
 | ||||||
|  | -                }
 | ||||||
|  | -                if (r < 0) {
 | ||||||
|  | -                        log_debug_errno(r, "Failed to add suid/sgid rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
 | ||||||
|  | +                if (r < 0 && k < 0)
 | ||||||
|  |                          continue; | ||||||
|  | -                }
 | ||||||
|  |   | ||||||
|  |                  r = seccomp_load(seccomp); | ||||||
|  |                  if (IN_SET(r, -EPERM, -EACCES)) | ||||||
| @ -53,6 +53,8 @@ GIT_DIR=../../src/systemd/.git git diffab -M v233..master@{2017-06-15} -- hwdb/[ | |||||||
| %endif | %endif | ||||||
| 
 | 
 | ||||||
| Patch0002:      0002-Revert-units-set-NoNewPrivileges-for-all-long-runnin.patch | Patch0002:      0002-Revert-units-set-NoNewPrivileges-for-all-long-runnin.patch | ||||||
|  | Patch0010:      0010-test-seccomp-fix-compilation-on-arm64.patch | ||||||
|  | Patch0011:      0011-seccomp-rework-how-the-S-UG-ID-filter-is-installed.patch | ||||||
| 
 | 
 | ||||||
| Patch0998:      0998-resolved-create-etc-resolv.conf-symlink-at-runtime.patch | Patch0998:      0998-resolved-create-etc-resolv.conf-symlink-at-runtime.patch | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user