diff --git a/CMakeLists.txt b/CMakeLists.txt index 5230577e3..cd431dfda 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,7 @@ set( PACKAGE tdelibs ) include( FindPkgConfig ) include( CheckIncludeFile ) +include( CheckIncludeFiles ) include( CheckSymbolExists ) include( CheckFunctionExists ) include( CheckCSourceCompiles ) @@ -225,6 +226,7 @@ check_include_file( "dirent.h" HAVE_DIRENT_H ) check_include_file( "dld.h" HAVE_DLD_H ) check_include_file( "dlfcn.h" HAVE_DLFCN_H ) check_include_file( "dl.h" HAVE_DL_H ) +check_include_files( "sys/types.h;sys/dl.h" HAVE_SYS_DL_H ) check_include_file( "float.h" HAVE_FLOAT_H ) check_include_file( "fstab.h" HAVE_FSTAB_H ) check_include_file( "ieeefp.h" HAVE_IEEEFP_H ) @@ -237,6 +239,7 @@ check_include_file( "machine/soundcard.h" HAVE_MACHINE_SOUNDCARD_H ) check_include_file( "malloc.h" HAVE_MALLOC_H ) check_include_file( "memory.h" HAVE_MEMORY_H ) check_include_file( "mntent.h" HAVE_MNTENT_H ) +check_include_file( "sys/mntent.h" HAVE_SYS_MNTENT_H ) check_include_file( "ndir.h" HAVE_NDIR_H ) check_include_file( "netinet/in.h" HAVE_NETINET_IN_H ) check_include_file( "net/if.h" HAVE_NET_IF_H ) @@ -260,7 +263,7 @@ check_include_file( "sys/dir.h" HAVE_SYS_DIR_H ) check_include_file( "sys/filio.h" HAVE_SYS_FILIO_H ) check_include_file( "sys/mman.h" HAVE_SYS_MMAN_H ) check_include_file( "sys/mntent.h" HAVE_SYS_MNTENT_H ) -check_include_file( "sys/mnttab.h" HAVE_SYS_MNTTAB_H ) +check_include_files( "stdio.h;sys/mnttab.h" HAVE_SYS_MNTTAB_H ) check_include_file( "sys/mount.h" HAVE_SYS_MOUNT_H ) if( NOT HAVE_SYS_MOUNT_H ) find_path( SYS_MOUNT_PATH "sys/mount.h" ) @@ -280,9 +283,16 @@ check_include_file( "sys/ucred.h" HAVE_SYS_UCRED_H ) if( NOT HAVE_SYS_UCRED_H ) find_path( SYS_UCRED_PATH "sys/ucred.h" ) if( SYS_UCRED_PATH ) - set( HAVE_SYS_UCRED_H "1" ) + set( HAVE_SYS_UCRED_H 1 ) endif( ) endif( ) +check_include_file( "ucred.h" HAVE_UCRED_H ) +if( NOT HAVE_UCRED_H ) + find_path( UCRED_PATH "ucred.h" ) + if( UCRED_PATH ) + set( HAVE_UCRED_H 1 ) + endif() +endif() check_include_file( "sys/xattr.h" HAVE_SYS_XATTR_H ) check_include_file( "termios.h" HAVE_TERMIOS_H ) check_include_file( "termio.h" HAVE_TERMIO_H ) @@ -427,6 +437,7 @@ endif( HAVE_GETMNTINFO ) check_function_exists( getnameinfo HAVE_GETNAMEINFO ) check_function_exists( getpagesize HAVE_GETPAGESIZE ) check_function_exists( getpeereid HAVE_GETPEEREID ) +check_function_exists( getpeerucred HAVE_GETPEERUCRED ) check_function_exists( getpeername HAVE_GETPEERNAME ) check_function_exists( getprotobyname_r HAVE_GETPROTOBYNAME_R ) check_function_exists( getpt HAVE_GETPT ) @@ -466,6 +477,14 @@ check_function_exists( __argz_count HAVE___ARGZ_COUNT ) check_function_exists( __argz_next HAVE___ARGZ_NEXT ) check_function_exists( __argz_stringify HAVE___ARGZ_STRINGIFY ) check_function_exists( sendfile HAVE_SENDFILE ) +set( SENDFILE_LIBRARIES "" ) +if( NOT HAVE_SENDFILE) + check_library_exists( sendfile sendfile "" HAVE_SENDFILE_LIB ) + if( HAVE_SENDFILE_LIB ) + set( HAVE_SENDFILE 1 ) + set( SENDFILE_LIBRARIES sendfile ) + endif( HAVE_SENDFILE_LIB ) +endif() check_function_exists( rindex HAVE_RINDEX ) check_function_exists( putenv HAVE_PUTENV ) check_function_exists( poll HAVE_POLL ) diff --git a/config.h.cmake b/config.h.cmake index b2daa5979..17a871252 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -174,6 +174,9 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_DL_H 1 +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_DL_H 1 + /* Define if your system has Linux Directory Notification */ #undef HAVE_DNOTIFY @@ -240,6 +243,9 @@ /* Define to 1 if you have the `getpeereid' function. */ #cmakedefine HAVE_GETPEEREID 1 +/* Define to 1 if you have the `getpeerucred' function. */ +#cmakedefine HAVE_GETPEERUCRED 1 + /* Define to 1 if you have the `getpeername' function. */ #cmakedefine HAVE_GETPEERNAME 1 @@ -651,6 +657,9 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYS_UCRED_H 1 +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_UCRED_H 1 + /* Define if system has the sys/xattr.h header. */ #cmakedefine HAVE_SYS_XATTR_H 1 diff --git a/dcop/dcopclient.cpp b/dcop/dcopclient.cpp index 5523365c8..52d9097c1 100644 --- a/dcop/dcopclient.cpp +++ b/dcop/dcopclient.cpp @@ -50,6 +50,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +#ifdef HAVE_UCRED_H +#include +#endif /* HAVE_UCRED_H */ #include #include @@ -724,7 +727,7 @@ bool DCOPClient::isSuspended() const return !d->notifier->isEnabled(); } -#if defined(SO_PEERCRED) || defined(LOCAL_PEEREID) +#if defined(SO_PEERCRED) || defined(LOCAL_PEEREID) || defined(HAVE_GETPEERUCRED) #define USE_PEER_IS_US // Check whether the remote end is owned by the same user. static bool peerIsUs(int sockfd) @@ -745,6 +748,18 @@ static bool peerIsUs(int sockfd) if (getsockopt(sockfd, 0, LOCAL_PEEREID, &cred, &siz) != 0 || siz != sizeof(cred)) return false; return (cred.unp_euid == geteuid()); +#elif defined(HAVE_GETPEERUCRED) + ucred_t *cred = nullptr; + uint_t peer_uid; + + if (getpeerucred(sockfd, &cred) != 0) { + if (cred != nullptr) + ucred_free(cred); + return false; + } + peer_uid = ucred_geteuid(cred); + ucred_free(cred); + return (peer_uid == getuid()); #endif } #else diff --git a/tdecore/CMakeLists.txt b/tdecore/CMakeLists.txt index 22c3bbc88..c794a8039 100644 --- a/tdecore/CMakeLists.txt +++ b/tdecore/CMakeLists.txt @@ -141,7 +141,7 @@ tde_add_library( ${target} SHARED AUTOMOC SOURCES ${${target}_SRCS} VERSION 14.1.0 EMBED tdecorenetwork-static - LINK DCOP-shared tdefx-shared ICE SM ${ZLIB_LIBRARIES} + LINK DCOP-shared tdefx-shared ICE SM ${ZLIB_LIBRARIES} ${RESOLV_LIBRARIES} LINK_PRIVATE ltdlc-static ${KDESVGICONS} ${XCOMPOSITE_LIBRARIES} ${LIBIDN_LIBRARIES} ${LIBBFD_LIBRARIES} ${LIB_UTIL} ${GAMIN_LIBRARIES} ${Backtrace_LIBRARY} diff --git a/tdecore/kdebug.cpp b/tdecore/kdebug.cpp index afd925190..78fc06247 100644 --- a/tdecore/kdebug.cpp +++ b/tdecore/kdebug.cpp @@ -759,7 +759,13 @@ TQString formatBacktrace(void *addr) { // NOTE: if somebody would compile for some non-linux-glibc platform // check if dladdr function is avalible there Dl_info info; - dladdr(func.addr, &info); // obtain information about the function. + + // obtain information about the function. +#ifdef Q_OS_SOLARIS + dladdr((void *)func.addr, &info); +#else + dladdr(func.addr, &info); +#endif /* Solaris */ func.fileName = info.dli_fname; func.base = info.dli_fbase; diff --git a/tdecore/kmountpoint.cpp b/tdecore/kmountpoint.cpp index a9be89e76..ae698c2af 100644 --- a/tdecore/kmountpoint.cpp +++ b/tdecore/kmountpoint.cpp @@ -33,6 +33,7 @@ #include #endif #ifdef HAVE_SYS_MNTTAB_H +#include #include #endif #ifdef HAVE_MNTENT_H diff --git a/tdecore/ksimpledirwatch.cpp b/tdecore/ksimpledirwatch.cpp index cbb4ce682..a5bab80ce 100644 --- a/tdecore/ksimpledirwatch.cpp +++ b/tdecore/ksimpledirwatch.cpp @@ -52,11 +52,17 @@ // debug #include +#ifdef Q_OS_SOLARIS +#include /* FIONREAD is defined here */ +#endif /* solaris */ + #ifdef HAVE_INOTIFY #include #include #include +#ifdef Q_OS_LINUX #include +#endif /* Linux */ // Linux kernel headers are documented to not compile #define _S390_BITOPS_H #include diff --git a/tdecore/tdesycoca.cpp b/tdecore/tdesycoca.cpp index a11175117..c109d5ff4 100644 --- a/tdecore/tdesycoca.cpp +++ b/tdecore/tdesycoca.cpp @@ -42,7 +42,7 @@ #include #endif -#ifdef Q_OS_SOLARIS +#if defined(Q_OS_SOLARIS) && !defined(__dilos__) extern "C" { extern int madvise(caddr_t, size_t, int); diff --git a/tdehtml/misc/knsplugininstaller.cpp b/tdehtml/misc/knsplugininstaller.cpp index b8b94cd6b..db83e5c75 100644 --- a/tdehtml/misc/knsplugininstaller.cpp +++ b/tdehtml/misc/knsplugininstaller.cpp @@ -157,7 +157,11 @@ bool KNSPluginInstallEngine::findPlugin() // get system infos // TODO/FIX : correct this to work with x86-64 machines +#ifdef Q_OS_SOLARIS + struct utsname sysinfo; +#else /* default */ utsname sysinfo; +#endif /* default */ if(uname(&sysinfo)) return false; TQString sysname(sysinfo.sysname); diff --git a/tdeio/tdeio/global.cpp b/tdeio/tdeio/global.cpp index c53929b1e..21437cdd3 100644 --- a/tdeio/tdeio/global.cpp +++ b/tdeio/tdeio/global.cpp @@ -1307,6 +1307,8 @@ TDEIO_EXPORT TQByteArray TDEIO::rawErrorDetail(int errorCode, const TQString &er #endif #ifdef HAVE_SYS_UCRED_H #include +#elifdef HAVE_UCRED_H +#include #endif #ifdef HAVE_SYS_MOUNT_H #include diff --git a/tdeio/tdeio/kdirwatch.cpp b/tdeio/tdeio/kdirwatch.cpp index b3763978d..c87558e1d 100644 --- a/tdeio/tdeio/kdirwatch.cpp +++ b/tdeio/tdeio/kdirwatch.cpp @@ -64,11 +64,17 @@ // debug #include +#ifdef Q_OS_SOLARIS +#include /* FIONREAD */ +#endif /* solaris */ + #ifdef HAVE_INOTIFY #include #include #include +#ifdef Q_OS_LINUX #include +#endif /* Linux */ // Linux kernel headers are documented to not compile #define _S390_BITOPS_H #include diff --git a/tdeioslave/file/file.cpp b/tdeioslave/file/file.cpp index b7ac91bfd..bf18a069b 100644 --- a/tdeioslave/file/file.cpp +++ b/tdeioslave/file/file.cpp @@ -1446,15 +1446,15 @@ void FileProtocol::mount( bool _ro, const char *_fstype, const TQString& _dev, c buffer.sprintf( "%s %s %s %s 2>%s", mountProg.latin1(), readonly.data(), dev.data(), point.data(), tmp ); else // mount giving device + mountpoint + fstype -#if defined(__svr4__) && defined(__sun__) - // MACRO for Solaris 8 and I +#if defined(Q_OS_SOLARIS) + // MACRO for Solaris 8 and I // believe this is true for SVR4 in general - buffer.sprintf( "%s -F %s %s %s %s 2>%s" - mountProg.latin1() - fstype.data() - _ro ? "-oro" : "" - dev.data() - point.data() + buffer.sprintf( "%s -F %s %s %s %s 2>%s", + mountProg.latin1(), + fstype.data(), + _ro ? "-oro" : "", + dev.data(), + point.data(), tmp ); #elif defined(__OpenBSD__) buffer.sprintf( "%s %s %s -t %s %s %s 2>%s", "tdesu", mountProg.latin1(), readonly.data(), diff --git a/tdesu/client.cpp b/tdesu/client.cpp index fe5733ee7..8c775bbed 100644 --- a/tdesu/client.cpp +++ b/tdesu/client.cpp @@ -19,6 +19,9 @@ #include #include #include +#ifdef HAVE_UCRED_H +#include +#endif /* HAVE_UCRED_H */ #include #include @@ -146,6 +149,21 @@ int TDEsuClient::connect() return -1; } # endif +#elif defined(HAVE_GETPEERUCRED) + ucred_t *cred = nullptr; + + if (getpeerucred(sockfd, &cred) == 0) { + uid_t peer_uid = ucred_geteuid(cred); + + ucred_free(cred); + if (peer_uid != getuid()) { + kdWarning(900) << "socket not owned by me! socket uid = " << peer_uid << endl; + close(sockfd); sockfd = -1; + return -1; + } + } + if (cred != nullptr) + ucred_free(cred); #else struct ucred cred; socklen_t siz = sizeof(cred);