diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 487aac2a16a..474b44a286e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -208,6 +208,91 @@ jobs: # ./common/test-runner ./XrdClTests/libXrdClTests.so 'All Tests/FileSystemTest/' # ./common/test-runner ./XrdClTests/libXrdClTests.so 'All Tests/LocalFileHandlerTest/' + cmake-alpine-musl: + + runs-on: ubuntu-latest + container: alpine + + steps: + - name: Install external dependencies + shell: sh + run: | + apk add \ + bash \ + cmake \ + cppunit-dev \ + curl-dev \ + fuse-dev \ + fuse3-dev \ + g++ \ + git \ + json-c-dev \ + krb5-dev \ + libxml2-dev \ + linux-headers \ + make \ + openssl-dev \ + py3-pip \ + python3-dev \ + readline-dev \ + tinyxml-dev \ + util-linux-dev \ + zlib-dev + + - name: Clone repository + uses: actions/checkout@v2 + + - name: Build with cmake + run: | + cd .. + # need to fix ownership not to confuse git + chown -R -v "$( id -u; ):$( id -g; )" xrootd + cmake \ + -DCMAKE_CXX_STANDARD=17 \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DPYTHON_EXECUTABLE=$(command -v python3) \ + -DFORCE_ENABLED=ON \ + -DENABLE_HTTP=OFF \ + -DENABLE_TESTS=ON \ + -DENABLE_VOMS=OFF \ + -DENABLE_XRDEC=OFF \ + -DENABLE_XRDCLHTTP=OFF \ + -DENABLE_MACAROONS=OFF \ + -DENABLE_SCITOKENS=OFF \ + -DPIP_OPTIONS="--verbose" \ + -S xrootd \ + -B build + cmake build -LH + cmake \ + --build build \ + --clean-first \ + --parallel $(($(nproc) - 1)) + cmake --build build --target install + python3 -m pip list + + - name: Verify install + run: | + command -v xrootd + command -v xrdcp + + - name: Verify Python bindings + run: | + python3 --version --version + python3 -m pip list + python3 -m pip show xrootd + python3 -c 'import XRootD; print(XRootD)' + python3 -c 'import pyxrootd; print(pyxrootd)' + python3 -c 'from XRootD import client; print(client.FileSystem("root://someserver:1094"))' + + - name: Run libXrdCl tests + run: | + cd ../build/tests + ./common/test-runner ./XrdClTests/libXrdClTests.so 'All Tests/UtilsTest/' + ./common/test-runner ./XrdClTests/libXrdClTests.so 'All Tests/SocketTest/' + ./common/test-runner ./XrdClTests/libXrdClTests.so 'All Tests/PollerTest/' + cmake-centos7: runs-on: ubuntu-latest diff --git a/cmake/XRootDOSDefs.cmake b/cmake/XRootDOSDefs.cmake index 8b182e61ea1..9f7c9aa5940 100644 --- a/cmake/XRootDOSDefs.cmake +++ b/cmake/XRootDOSDefs.cmake @@ -70,6 +70,21 @@ if( ${CMAKE_SYSTEM_NAME} STREQUAL "Linux" ) set( LINUX TRUE ) include( GNUInstallDirs ) set( EXTRA_LIBS rt ) + + # Check for musl libc with the compiler, since it provides way to detect it + execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine + OUTPUT_VARIABLE TARGET_TRIPLE ERROR_VARIABLE TARGET_ERROR) + + if (NOT TARGET_ERROR) + if ("${TARGET_TRIPLE}" MATCHES "musl") + message(STATUS "Detected musl libc") + add_definitions(-DMUSL=1) + endif() + else() + message(WARNING "Could not detect system information!") + endif() + + unset(TARGET_ERROR) endif() #------------------------------------------------------------------------------- diff --git a/docs/PreReleaseNotes.txt b/docs/PreReleaseNotes.txt index dea9b140268..33572e5648a 100644 --- a/docs/PreReleaseNotes.txt +++ b/docs/PreReleaseNotes.txt @@ -16,7 +16,5 @@ Prerelease Notes + **Major bug fixes** + **Minor bug fixes** - **[PFC]** Add a missing if-error for a rare direct-read error trace. - **Commit: 9d2973d1 + **Miscellaneous** diff --git a/docs/ReleaseNotes.txt b/docs/ReleaseNotes.txt index d7632b5e91b..89b1c6b0435 100644 --- a/docs/ReleaseNotes.txt +++ b/docs/ReleaseNotes.txt @@ -5,6 +5,21 @@ XRootD Release Notes ============= +------------- +Version 5.5.3 +------------- + ++ **Minor bug fixes** + **[Pfc]** Add missing if-error for a rare direct-read error trace + **[Server]** Avoid a race condition during deferred file close + **[XrdCms]** Fix compiler warning for potentially uninitialized variables + **[XrdCms]** Remove extraneous character from error output (issue 1501) + **[XrdHttp]** Support user-provided script for computing checksums + **[XrdPosix]** Add missing include + ++ **Miscellaneous** + **[RPM]** Add g++ as build dependency + ------------- Version 5.5.2 ------------- diff --git a/packaging/rhel/xrootd.spec.in b/packaging/rhel/xrootd.spec.in index bbafe833035..3182309f438 100644 --- a/packaging/rhel/xrootd.spec.in +++ b/packaging/rhel/xrootd.spec.in @@ -184,6 +184,8 @@ Requires(postun): initscripts %if %{?rhel}%{!?rhel:0} == 7 BuildRequires: devtoolset-7 +%else +BuildRequires: gcc-c++ %endif %description diff --git a/src/Xrd/XrdConfig.hh b/src/Xrd/XrdConfig.hh index a06ad462f4e..2d1403a5e10 100644 --- a/src/Xrd/XrdConfig.hh +++ b/src/Xrd/XrdConfig.hh @@ -34,6 +34,8 @@ #include "Xrd/XrdProtLoad.hh" #include "Xrd/XrdProtocol.hh" +#include + class XrdSysError; class XrdTcpMonInfo; class XrdNetSecurity; diff --git a/src/Xrd/XrdPoll.hh b/src/Xrd/XrdPoll.hh index 3790b03b080..d9bda5d6277 100644 --- a/src/Xrd/XrdPoll.hh +++ b/src/Xrd/XrdPoll.hh @@ -29,7 +29,7 @@ /* specific prior written permission of the institution or contributor. */ /******************************************************************************/ -#include +#include #include "XrdSys/XrdSysPthread.hh" #define XRD_NUMPOLLERS 3 diff --git a/src/XrdAcc/XrdAccGroups.cc b/src/XrdAcc/XrdAccGroups.cc index e663fdd35aa..94b8edbc75e 100644 --- a/src/XrdAcc/XrdAccGroups.cc +++ b/src/XrdAcc/XrdAccGroups.cc @@ -46,6 +46,14 @@ #include "XrdAcc/XrdAccGroups.hh" #include "XrdAcc/XrdAccPrivs.hh" +#ifdef MUSL +int innetgr(const char *netgroup, const char *host, const char *user, + const char *domain) +{ + return 0; +} +#endif + // Additionally, this routine does not support a user in more than // NGROUPS_MAX groups. This is a standard unix limit defined in limits.h. diff --git a/src/XrdCl/XrdClFileStateHandler.hh b/src/XrdCl/XrdClFileStateHandler.hh index 197151321f8..f8353881950 100644 --- a/src/XrdCl/XrdClFileStateHandler.hh +++ b/src/XrdCl/XrdClFileStateHandler.hh @@ -39,6 +39,7 @@ #include #include +#include #include #include diff --git a/src/XrdCl/XrdClMonitor.hh b/src/XrdCl/XrdClMonitor.hh index 2fc7537776a..2b3a96c46fa 100644 --- a/src/XrdCl/XrdClMonitor.hh +++ b/src/XrdCl/XrdClMonitor.hh @@ -43,6 +43,8 @@ #include "XrdCl/XrdClFileSystem.hh" +#include + namespace XrdCl { class URL; diff --git a/src/XrdCl/XrdClXRootDMsgHandler.cc b/src/XrdCl/XrdClXRootDMsgHandler.cc index 81e41d21bb1..1bd60a3e336 100644 --- a/src/XrdCl/XrdClXRootDMsgHandler.cc +++ b/src/XrdCl/XrdClXRootDMsgHandler.cc @@ -1202,9 +1202,7 @@ namespace XrdCl if( pStatus.code == errErrorResponse ) { st->errNo = rsp->body.error.errnum; - // omit the last character as the string returned from the server - // (acording to protocol specs) should be null-terminated - std::string errmsg( rsp->body.error.errmsg, rsp->hdr.dlen-5 ); + std::string errmsg( rsp->body.error.errmsg, rsp->hdr.dlen-4 ); if( st->errNo == kXR_noReplicas && !pLastError.IsOK() ) errmsg += " Last seen error: " + pLastError.ToString(); st->SetErrorMessage( errmsg ); diff --git a/src/XrdCms/XrdCmsCluster.cc b/src/XrdCms/XrdCmsCluster.cc index 7649ebdde6e..011bcde2813 100644 --- a/src/XrdCms/XrdCmsCluster.cc +++ b/src/XrdCms/XrdCmsCluster.cc @@ -2036,7 +2036,7 @@ int XrdCmsCluster::Unuseable(XrdCmsSelect &Sel) int n = snprintf(Sel.Resp.Data, sizeof(Sel.Resp.Data), "No servers are available to %s%s the %s.", - Xmode, Amode, EType)+1; + Xmode, Amode, EType); if (n < (int)sizeof(Sel.Resp.Data)) Sel.Resp.DLen = n+1; else Sel.Resp.DLen = sizeof(Sel.Resp.Data); diff --git a/src/XrdNet/XrdNetMsg.cc b/src/XrdNet/XrdNetMsg.cc index fa6c16f872a..f97e1af0996 100644 --- a/src/XrdNet/XrdNetMsg.cc +++ b/src/XrdNet/XrdNetMsg.cc @@ -29,7 +29,7 @@ /******************************************************************************/ #include -#include +#include #include "XrdNet/XrdNet.hh" #include "XrdNet/XrdNetMsg.hh" diff --git a/src/XrdNet/XrdNetSecurity.cc b/src/XrdNet/XrdNetSecurity.cc index 0f8451127ce..0faf563dd2e 100644 --- a/src/XrdNet/XrdNetSecurity.cc +++ b/src/XrdNet/XrdNetSecurity.cc @@ -40,11 +40,6 @@ #include #include #include -int innetgr(const char *netgroup, const char *host, const char *user, - const char *domain) -{ - return 0; -} #include "XrdSys/XrdWin32.hh" #endif @@ -53,6 +48,14 @@ int innetgr(const char *netgroup, const char *host, const char *user, #include "XrdNet/XrdNetUtils.hh" #include "XrdSys/XrdSysTrace.hh" +#if defined(MUSL) || defined(WIN32) +int innetgr(const char *netgroup, const char *host, const char *user, + const char *domain) +{ + return 0; +} +#endif + /******************************************************************************/ /* L o c a l C l a s s e s */ /******************************************************************************/ diff --git a/src/XrdOfs/XrdOfsHandle.cc b/src/XrdOfs/XrdOfsHandle.cc index 963f17a5a6a..26b40ce0887 100644 --- a/src/XrdOfs/XrdOfsHandle.cc +++ b/src/XrdOfs/XrdOfsHandle.cc @@ -30,7 +30,7 @@ #include #include -#include +#include #include #include "XrdOfs/XrdOfsHandle.hh" diff --git a/src/XrdOssCsi/XrdOssCsiTagstoreFile.hh b/src/XrdOssCsi/XrdOssCsiTagstoreFile.hh index b1a94acd668..0202579ccb4 100644 --- a/src/XrdOssCsi/XrdOssCsiTagstoreFile.hh +++ b/src/XrdOssCsi/XrdOssCsiTagstoreFile.hh @@ -38,9 +38,7 @@ #include #include -#if defined(__GLIBC__) || defined(__BIONIC__) || defined(__CYGWIN__) -#include -#elif defined(__APPLE__) +#if defined(__APPLE__) // Make sure that byte swap functions are not already defined. #if !defined(bswap_16) // Mac OS X / Darwin features @@ -49,6 +47,8 @@ #define bswap_32(x) OSSwapInt32(x) #define bswap_64(x) OSSwapInt64(x) #endif +#else +#include #endif class XrdOssCsiTagstoreFile : public XrdOssCsiTagstore diff --git a/src/XrdOuc/XrdOucBackTrace.cc b/src/XrdOuc/XrdOucBackTrace.cc index 813183c3228..c61a89b633d 100644 --- a/src/XrdOuc/XrdOucBackTrace.cc +++ b/src/XrdOuc/XrdOucBackTrace.cc @@ -34,7 +34,7 @@ #include #include -#ifdef __GNUC__ +#ifndef MUSL /* glibc, uclibc, and macOS all have execinfo.h */ #include #include #endif @@ -176,13 +176,11 @@ XrdInfo *CvtRsp(const char *name, int snum) /* D e m a n g l e */ /******************************************************************************/ +#ifndef MUSL namespace { int Demangle(char *cSym, char *buff, int blen) { -#ifndef __GNUC__ - return -1; -#else int status; char *plus = index(cSym, '+'); char *brak = (plus ? index(plus, '[') : 0); @@ -201,7 +199,6 @@ int Demangle(char *cSym, char *buff, int blen) status = snprintf(buff, blen, "%s %s+%s\n", brak, realname, plus+1); free(realname); return status; -#endif } } @@ -221,6 +218,7 @@ int DumpDepth() return (depth <= maxDepth ? depth : maxDepth); } } +#endif /******************************************************************************/ /* D u m p S t a c k */ @@ -230,8 +228,8 @@ namespace { void DumpStack(char *bP, int bL, TidType tid) { -#ifndef __GNUC__ - snprintf(bP, bL, "TBT " TidFmt " No stack information available, not gnuc.", tid); +#ifdef MUSL + snprintf(bP, bL, "TBT " TidFmt " No stack information available with musl libc.", tid); return; #else static int btDepth = DumpDepth(); // One time MT-safe call diff --git a/src/XrdPosix/XrdPosix.cc b/src/XrdPosix/XrdPosix.cc index 0f32dc2eed5..e4f020c09bf 100644 --- a/src/XrdPosix/XrdPosix.cc +++ b/src/XrdPosix/XrdPosix.cc @@ -53,6 +53,58 @@ extern XrdPosixLinkage Xunix; +/******************************************************************************/ +/* U t i l i t y F u n c t i o n s */ +/******************************************************************************/ + +#ifdef MUSL +#include +#endif + +static inline void fseterr(FILE *fp) +{ + /* Most systems provide FILE as a struct and the necessary bitmask in + , because they need it for implementing getc() and putc() as + fast macros. This function is based on gnulib's fseterr.c */ +#if defined _IO_ERR_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 + /* GNU libc, BeOS, Haiku, Linux libc5 */ + fp->_flags |= _IO_ERR_SEEN; +#elif defined __sferror || defined __APPLE__ || defined __DragonFly__ || defined __ANDROID__ + /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ + fp->_flags |= __SERR; +#elif defined _IOERR + /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */ + fp->_flag |= _IOERR; +#elif defined __UCLIBC__ /* uClibc */ + fp->__modeflags |= __FLAG_ERROR; +#elif defined MUSL /* musl libc */ + __fseterr(fp); +#else + #error "Unsupported platform! Please report it as a bug." +#endif +} + +static inline void fseteof(FILE *fp) +{ + /* Most systems provide FILE as a struct and the necessary bitmask in + , because they need it for implementing getc() and putc() as + fast macros. */ +#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 + /* GNU libc, BeOS, Haiku, Linux libc5 */ + fp->_flags |= _IO_EOF_SEEN; +#elif defined __sferror || defined __APPLE__ || defined __DragonFly__ || defined __ANDROID__ + /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ + fp->_flags |= __SEOF; +#elif defined _IOEOF + /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */ + fp->_flag |= _IOEOF; +#elif defined __UCLIBC__ /* uClibc */ + fp->__modeflags |= __FLAG_EOF; +#else + (void) fseek(fp, 0L, SEEK_END); +#endif +} + /******************************************************************************/ /* X r d P o s i x _ A c c e s s */ /******************************************************************************/ @@ -308,19 +360,9 @@ size_t XrdPosix_Fread(void *ptr, size_t size, size_t nitems, FILE *stream) // Get the right return code. Note that we cannot emulate the flags in sunx86 // - if (bytes > 0 && size) rc = bytes/size; -#ifndef SUNX86 -#if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__)) - else if (bytes < 0) stream->_flags |= _IO_ERR_SEEN; - else stream->_flags |= _IO_EOF_SEEN; -#elif defined(__APPLE__) || defined(__FreeBSD__) - else if (bytes < 0) stream->_flags |= __SEOF; - else stream->_flags |= __SERR; -#else - else if (bytes < 0) stream->_flag |= _IOERR; - else stream->_flag |= _IOEOF; -#endif -#endif + if (bytes > 0 && size) rc = bytes/size; + else if (bytes < 0) fseterr(stream); + else fseteof(stream); return rc; } @@ -477,18 +519,10 @@ size_t XrdPosix_Fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream bytes = Xroot.Write(fd, ptr, size*nitems); -// Get the right return code. Note that we cannot emulate the flags in sunx86 +// Get the right return code. // if (bytes > 0 && size) rc = bytes/size; -#ifndef SUNX86 -#if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__)) - else stream->_flags |= _IO_ERR_SEEN; -#elif defined(__APPLE__) || defined(__FreeBSD__) - else stream->_flags |= __SERR; -#else - else stream->_flag |= _IOERR; -#endif -#endif + else fseterr(stream); return rc; } diff --git a/src/XrdPosix/XrdPosixFile.hh b/src/XrdPosix/XrdPosixFile.hh index e5cc6b1bda5..4ca9679f233 100644 --- a/src/XrdPosix/XrdPosixFile.hh +++ b/src/XrdPosix/XrdPosixFile.hh @@ -35,6 +35,7 @@ #include #include #include +#include #include #include "XrdCl/XrdClFileSystem.hh" diff --git a/src/XrdPosix/XrdPosixLinkage.hh b/src/XrdPosix/XrdPosixLinkage.hh index 9031532524c..b5cc6d4b469 100644 --- a/src/XrdPosix/XrdPosixLinkage.hh +++ b/src/XrdPosix/XrdPosixLinkage.hh @@ -40,6 +40,7 @@ #include #include "XrdPosix/XrdPosixOsDep.hh" +#include "XrdPosix/XrdPosixXrootd.hh" #include "XrdSys/XrdSysPlatform.hh" /******************************************************************************/ diff --git a/src/XrdPosix/XrdPosixPreload.cc b/src/XrdPosix/XrdPosixPreload.cc index 867b7347985..e01bc8a2301 100644 --- a/src/XrdPosix/XrdPosixPreload.cc +++ b/src/XrdPosix/XrdPosixPreload.cc @@ -41,6 +41,22 @@ /******************************************************************************/ #include "XrdPosix/XrdPosixExtern.hh" + +#ifdef MUSL +#undef creat64 +#undef fseeko64 +#undef ftello64 +#undef ftruncate64 +#undef lseek64 +#undef open64 +#undef pread64 +#undef pwrite64 +#undef readdir64 +#undef readdir64_r +#undef statfs64 +#undef statvfs64 +#undef truncate64 +#endif /******************************************************************************/ /* G l o b a l D e c l a r a t i o n s */ diff --git a/src/XrdSys/XrdSysPlatform.hh b/src/XrdSys/XrdSysPlatform.hh index a1ac544ad93..eaeaeabac58 100644 --- a/src/XrdSys/XrdSysPlatform.hh +++ b/src/XrdSys/XrdSysPlatform.hh @@ -241,16 +241,8 @@ extern "C" #if defined(_AIX) || \ (defined(XR__SUNGCC3) && !defined(__arch64__)) # define SOCKLEN_t size_t -#elif defined(XR__GLIBC) || \ - defined(__FreeBSD__) || \ - (defined(__FreeBSD_kernel__) && defined(__GLIBC__)) || \ - (defined(XR__SUNGCC3) && defined(__arch64__)) || defined(__APPLE__) || \ - (defined(__sun) && defined(_SOCKLEN_T)) -# ifndef SOCKLEN_t -# define SOCKLEN_t socklen_t -# endif #elif !defined(SOCKLEN_t) -# define SOCKLEN_t int +# define SOCKLEN_t socklen_t #endif #ifdef _LP64 diff --git a/src/XrdSys/XrdSysPthread.hh b/src/XrdSys/XrdSysPthread.hh index 17f8fd0bec8..6d980246094 100644 --- a/src/XrdSys/XrdSysPthread.hh +++ b/src/XrdSys/XrdSysPthread.hh @@ -351,7 +351,7 @@ enum PrefType {prefWR=1}; XrdSysRWLock(PrefType ptype) { -#ifdef __linux__ +#if defined(__linux__) && (defined(__GLIBC__) || defined(__UCLIBC__)) pthread_rwlockattr_t attr; pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP); @@ -367,7 +367,7 @@ enum PrefType {prefWR=1}; inline void ReInitialize(PrefType ptype) { pthread_rwlock_destroy(&lock); -#ifdef __linux__ +#if defined(__linux__) && (defined(__GLIBC__) || defined(__UCLIBC__)) pthread_rwlockattr_t attr; pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP); diff --git a/src/XrdTls/XrdTlsTempCA.cc b/src/XrdTls/XrdTlsTempCA.cc index faf69785ffc..37431dee9f3 100644 --- a/src/XrdTls/XrdTlsTempCA.cc +++ b/src/XrdTls/XrdTlsTempCA.cc @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/XrdVoms/XrdVomsMapfile.cc b/src/XrdVoms/XrdVomsMapfile.cc index 8ffbe921875..fddbfdc06fb 100644 --- a/src/XrdVoms/XrdVomsMapfile.cc +++ b/src/XrdVoms/XrdVomsMapfile.cc @@ -40,7 +40,7 @@ #include #include #include -#include +#include bool XrdVomsMapfile::tried_configure = false; std::unique_ptr XrdVomsMapfile::mapper;