From 3fe2c54a5b122acc1d96c0e01d802b4f4a4c84b4 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 2 Jul 2012 14:08:41 -0700 Subject: Fix the waf/autoconf builds to detect correctly the 32-bit or 64-bit syscall ABI on Linux. Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Tue Jul 3 05:32:21 CEST 2012 on sn-devel-104 --- source3/configure.in | 91 ++++++++++++++++++++++++++++++++++++++++------------ source3/wscript | 77 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 134 insertions(+), 34 deletions(-) diff --git a/source3/configure.in b/source3/configure.in index 4def9cd80a..4379ce7eb1 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -2766,26 +2766,77 @@ AC_CHECK_FUNCS(getpagesize) # look for a method of setting the effective uid seteuid=no; -# -# Disable for now until Linux-64 and Linux-32 specific versions -# are separated out. -# -#case "$host_os" in -#*linux*) -#if test $seteuid = no; then -#AC_CACHE_CHECK([for Linux thread-specific credentials],samba_cv_USE_LINUX_THREAD_CREDENTIALS,[ -#AC_TRY_RUN([ -##define AUTOCONF_TEST 1 -##define USE_LINUX_THREAD_CREDENTIALS 1 -##include "${srcdir-.}/../lib/util/setid.c" -##include "${srcdir-.}/lib/util_sec.c"], -# samba_cv_USE_LINUX_THREAD_CREDENTIALS=yes,samba_cv_USE_LINUX_THREAD_CREDENTIALS=no,samba_cv_USE_LINUX_THREAD_CREDENTIALS=cross)]) -#if test x"$samba_cv_USE_LINUX_THREAD_CREDENTIALS" = x"yes"; then -# seteuid=yes;AC_DEFINE(USE_LINUX_THREAD_CREDENTIALS,1,[Whether we can use Linux thread-specific credentials]) -#fi -#fi -#;; -#esac +################################################ +# Start by checking for 32-bit system call definitions on Linux. + +case "$host_os" in +*linux*) +AC_CACHE_CHECK([for Linux 32-bit system calls],samba_cv_USE_LINUX_32BIT_SYSCALLS,[ +AC_TRY_COMPILE([ +#if defined(HAVE_UNISTD_H) +#include +#endif +#include +#include +#include +#include + +#ifdef HAVE_SYS_PRIV_H +#include +#endif +#ifdef HAVE_SYS_ID_H +#include +#endif + +#if defined(HAVE_SYSCALL_H) +#include +#endif + +#if defined(HAVE_SYS_SYSCALL_H) +#include +#endif +], +[ +syscall(SYS_setresuid32, -1, -1, -1); +syscall(SYS_setresgid32, -1, -1, -1); +syscall(SYS_setreuid32, -1, -1); +syscall(SYS_setregid32, -1, -1); +syscall(SYS_setuid32, -1); +syscall(SYS_setgid32, -1); +syscall(SYS_setgroups32, 0, NULL); +], samba_cv_USE_LINUX_32BIT_SYSCALLS=yes,samba_cv_USE_LINUX_32BIT_SYSCALLS=no,samba_cv_USE_LINUX_32BIT_SYSCALLS=cross)]) + +if test x"$samba_cv_USE_LINUX_32BIT_SYSCALLS" = x"yes"; then + AC_DEFINE(USE_LINUX_32BIT_SYSCALLS,1,[Use Linux 32-bit system calls]) + AC_CACHE_CHECK([for Linux thread-specific credentials with 32-bit system calls],samba_cv_USE_LINUX_THREAD_CREDENTIALS,[ + AC_TRY_RUN([ +#define AUTOCONF_TEST 1 +#define USE_LINUX_THREAD_CREDENTIALS 1 +#define USE_LINUX_32BIT_SYSCALLS 1 +#include "${srcdir-.}/../lib/util/setid.c" +#include "${srcdir-.}/lib/util_sec.c"], + samba_cv_USE_LINUX_THREAD_CREDENTIALS=yes,samba_cv_USE_LINUX_THREAD_CREDENTIALS=no,samba_cv_USE_LINUX_THREAD_CREDENTIALS=cross)]) +if test x"$samba_cv_USE_LINUX_THREAD_CREDENTIALS" = x"yes"; then + seteuid=yes; + AC_DEFINE(USE_LINUX_THREAD_CREDENTIALS,1,[Whether we can use Linux thread-specific credentials with 32-bit system calls]) +fi +fi + +if test $seteuid = no; then +AC_CACHE_CHECK([for Linux thread-specific credentials],samba_cv_USE_LINUX_THREAD_CREDENTIALS,[ +AC_TRY_RUN([ +#define AUTOCONF_TEST 1 +#define USE_LINUX_THREAD_CREDENTIALS 1 +#include "${srcdir-.}/../lib/util/setid.c" +#include "${srcdir-.}/lib/util_sec.c"], + samba_cv_USE_LINUX_THREAD_CREDENTIALS=yes,samba_cv_USE_LINUX_THREAD_CREDENTIALS=no,samba_cv_USE_LINUX_THREAD_CREDENTIALS=cross)]) +if test x"$samba_cv_USE_LINUX_THREAD_CREDENTIALS" = x"yes"; then + seteuid=yes;AC_DEFINE(USE_LINUX_THREAD_CREDENTIALS,1,[Whether we can use Linux thread-specific credentials]) +fi +fi + +;; +esac if test $seteuid = no; then AC_CACHE_CHECK([for setreuid],samba_cv_USE_SETREUID,[ diff --git a/source3/wscript b/source3/wscript index e372fcc5ae..5fcf86ea18 100755 --- a/source3/wscript +++ b/source3/wscript @@ -728,22 +728,71 @@ int i; i = PAM_RADIO_TYPE; conf.DEFINE('WITH_PAM', 1) conf.DEFINE('WITH_PAM_MODULES', 1) - seteuid = False # -# Disable for now until Linux-64 and Linux-32 specific versions -# are separated out. +# Ensure we select the correct set of system calls on Linux. # -# if not seteuid: -# seteuid = conf.CHECK_CODE(''' -# #define AUTOCONF_TEST 1 -# #define USE_LINUX_THREAD_CREDENTIALS 1 -# #include "../lib/util/setid.c" -# #include "./lib/util_sec.c" -# ''', -# 'USE_LINUX_THREAD_CREDENTIALS', -# addmain=False, -# execute=True, -# msg="Checking whether we can use Linux thread-specific credentials") + if (host_os.rfind('linux') > -1): + conf.CHECK_CODE(''' +#if defined(HAVE_UNISTD_H) +#include +#endif +#include +#include +#include +#include + +#ifdef HAVE_SYS_PRIV_H +#include +#endif +#ifdef HAVE_SYS_ID_H +#include +#endif + +#if defined(HAVE_SYSCALL_H) +#include +#endif + +#if defined(HAVE_SYS_SYSCALL_H) +#include +#endif + +syscall(SYS_setresuid32, -1, -1, -1); +syscall(SYS_setresgid32, -1, -1, -1); +syscall(SYS_setreuid32, -1, -1); +syscall(SYS_setregid32, -1, -1); +syscall(SYS_setuid32, -1); +syscall(SYS_setgid32, -1); +syscall(SYS_setgroups32, 0, NULL); +''', + 'USE_LINUX_32BIT_SYSCALLS', + msg="Checking whether Linux should use 32-bit credential calls"); + + seteuid = False + + if not seteuid: + if (conf.CONFIG_SET('USE_LINUX_32BIT_SYSCALLS')): + seteuid = conf.CHECK_CODE(''' + #define AUTOCONF_TEST 1 + #define USE_LINUX_THREAD_CREDENTIALS 1 + #define USE_LINUX_32BIT_SYSCALLS 1 + #include "../lib/util/setid.c" + #include "./lib/util_sec.c" + ''', + 'USE_LINUX_THREAD_CREDENTIALS', + addmain=False, + execute=True, + msg="Checking whether we can use Linux thread-specific credentials with 32-bit system calls") + else: + seteuid = conf.CHECK_CODE(''' + #define AUTOCONF_TEST 1 + #define USE_LINUX_THREAD_CREDENTIALS 1 + #include "../lib/util/setid.c" + #include "./lib/util_sec.c" + ''', + 'USE_LINUX_THREAD_CREDENTIALS', + addmain=False, + execute=True, + msg="Checking whether we can use Linux thread-specific credentials") if not seteuid: seteuid = conf.CHECK_CODE(''' #define AUTOCONF_TEST 1 -- cgit