| 1 | #!/usr/bin/env python
|
|---|
| 2 |
|
|---|
| 3 | import Options
|
|---|
| 4 | import os, sys
|
|---|
| 5 |
|
|---|
| 6 | VERSION="1.2.0"
|
|---|
| 7 |
|
|---|
| 8 | def configure(conf):
|
|---|
| 9 | if conf.CHECK_BUNDLED_SYSTEM('uid_wrapper', minversion=VERSION, set_target=False):
|
|---|
| 10 | conf.DEFINE('USING_SYSTEM_UID_WRAPPER', 1)
|
|---|
| 11 | libuid_wrapper_so_path = 'libuid_wrapper.so'
|
|---|
| 12 | else:
|
|---|
| 13 | # check HAVE_GCC_ATOMIC_BUILTINS
|
|---|
| 14 | conf.CHECK_CODE('''
|
|---|
| 15 | #include <stdbool.h>
|
|---|
| 16 | int main(void) {
|
|---|
| 17 | bool x;
|
|---|
| 18 | bool *p_x = &x;
|
|---|
| 19 | __atomic_load(p_x, &x, __ATOMIC_RELAXED);
|
|---|
| 20 | return 0;
|
|---|
| 21 | ''',
|
|---|
| 22 | 'HAVE_GCC_ATOMIC_BUILTINS',
|
|---|
| 23 | addmain=False,
|
|---|
| 24 | msg='Checking for atomic builtins')
|
|---|
| 25 |
|
|---|
| 26 | # check HAVE_GCC_THREAD_LOCAL_STORAGE
|
|---|
| 27 | conf.CHECK_CODE('''
|
|---|
| 28 | __thread int tls;
|
|---|
| 29 |
|
|---|
| 30 | int main(void) {
|
|---|
| 31 | return 0;
|
|---|
| 32 | }
|
|---|
| 33 | ''',
|
|---|
| 34 | 'HAVE_GCC_THREAD_LOCAL_STORAGE',
|
|---|
| 35 | addmain=False,
|
|---|
| 36 | msg='Checking for thread local storage')
|
|---|
| 37 |
|
|---|
| 38 | if Options.options.address_sanitizer:
|
|---|
| 39 | # check HAVE_ADDRESS_SANITIZER_ATTRIBUTE
|
|---|
| 40 | conf.CHECK_CODE('''
|
|---|
| 41 | void test_address_sanitizer_attribute(void) __attribute__((no_sanitize_address));
|
|---|
| 42 |
|
|---|
| 43 | void test_address_sanitizer_attribute(void)
|
|---|
| 44 | {
|
|---|
| 45 | return;
|
|---|
| 46 | }
|
|---|
| 47 |
|
|---|
| 48 | int main(void) {
|
|---|
| 49 | return 0;
|
|---|
| 50 | }
|
|---|
| 51 | ''',
|
|---|
| 52 | 'HAVE_ADDRESS_SANITIZER_ATTRIBUTE',
|
|---|
| 53 | addmain=False,
|
|---|
| 54 | cflags='-Wall -Wextra -Werror',
|
|---|
| 55 | msg='Checking for address sanitizer attribute')
|
|---|
| 56 |
|
|---|
| 57 | # check HAVE_FUNCTION_ATTRIBUTE_FORMAT
|
|---|
| 58 | conf.CHECK_CODE('''
|
|---|
| 59 | void log_fn(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
|
|---|
| 60 |
|
|---|
| 61 | int main(void) {
|
|---|
| 62 | return 0;
|
|---|
| 63 | }
|
|---|
| 64 | ''',
|
|---|
| 65 | 'HAVE_FUNCTION_ATTRIBUTE_FORMAT',
|
|---|
| 66 | addmain=False,
|
|---|
| 67 | msg='Checking for printf format validation support')
|
|---|
| 68 | # Prototype checks
|
|---|
| 69 | conf.CHECK_C_PROTOTYPE('setgroups',
|
|---|
| 70 | 'int setgroups(int ngroups, const gid_t *grouplist)',
|
|---|
| 71 | define='HAVE_SETGROUPS_INT', headers='unistd.h sys/types.h')
|
|---|
| 72 | conf.CHECK_C_PROTOTYPE('syscall',
|
|---|
| 73 | 'int syscall(int number, ...)',
|
|---|
| 74 | define='HAVE_SYSCALL_INT', headers='unistd.h sys/syscall.h')
|
|---|
| 75 |
|
|---|
| 76 | if (sys.platform.rfind('linux') > -1):
|
|---|
| 77 | conf.CHECK_CODE('''
|
|---|
| 78 | #if defined(HAVE_UNISTD_H)
|
|---|
| 79 | #include <unistd.h>
|
|---|
| 80 | #endif
|
|---|
| 81 | #include <stdlib.h>
|
|---|
| 82 | #include <stdio.h>
|
|---|
| 83 | #include <sys/types.h>
|
|---|
| 84 | #include <errno.h>
|
|---|
| 85 |
|
|---|
| 86 | #ifdef HAVE_SYS_PRIV_H
|
|---|
| 87 | #include <sys/priv.h>
|
|---|
| 88 | #endif
|
|---|
| 89 | #ifdef HAVE_SYS_ID_H
|
|---|
| 90 | #include <sys/id.h>
|
|---|
| 91 | #endif
|
|---|
| 92 |
|
|---|
| 93 | #if defined(HAVE_SYSCALL_H)
|
|---|
| 94 | #include <syscall.h>
|
|---|
| 95 | #endif
|
|---|
| 96 |
|
|---|
| 97 | #if defined(HAVE_SYS_SYSCALL_H)
|
|---|
| 98 | #include <sys/syscall.h>
|
|---|
| 99 | #endif
|
|---|
| 100 |
|
|---|
| 101 | syscall(SYS_setresuid32, -1, -1, -1);
|
|---|
| 102 | syscall(SYS_setresgid32, -1, -1, -1);
|
|---|
| 103 | syscall(SYS_setreuid32, -1, -1);
|
|---|
| 104 | syscall(SYS_setregid32, -1, -1);
|
|---|
| 105 | syscall(SYS_setuid32, -1);
|
|---|
| 106 | syscall(SYS_setgid32, -1);
|
|---|
| 107 | syscall(SYS_setgroups32, 0, NULL);
|
|---|
| 108 | ''',
|
|---|
| 109 | 'HAVE_LINUX_32BIT_SYSCALLS',
|
|---|
| 110 | msg="Checking whether Linux has 32-bit credential calls");
|
|---|
| 111 |
|
|---|
| 112 | conf.CHECK_FUNCS('getresuid getresgid')
|
|---|
| 113 |
|
|---|
| 114 | # Create full path to uid_wrapper
|
|---|
| 115 | srcdir = os.path.realpath(conf.srcdir)
|
|---|
| 116 | libuid_wrapper_so_path = srcdir + '/bin/default/lib/uid_wrapper/libuid-wrapper.so'
|
|---|
| 117 |
|
|---|
| 118 | conf.DEFINE('LIBUID_WRAPPER_SO_PATH', libuid_wrapper_so_path)
|
|---|
| 119 | conf.DEFINE('UID_WRAPPER', 1)
|
|---|
| 120 |
|
|---|
| 121 | def build(bld):
|
|---|
| 122 | if not bld.CONFIG_SET("USING_SYSTEM_UID_WRAPPER"):
|
|---|
| 123 | # We need to do it this way or the library wont work.
|
|---|
| 124 | # Using private_library=True will add symbol version which
|
|---|
| 125 | # breaks preloading!
|
|---|
| 126 | bld.SAMBA_LIBRARY('uid_wrapper',
|
|---|
| 127 | source='uid_wrapper.c',
|
|---|
| 128 | deps='dl',
|
|---|
| 129 | install=False,
|
|---|
| 130 | realname='libuid-wrapper.so')
|
|---|
| 131 |
|
|---|