From 5ee6a46add24318e3076375d858f492df6ba3504 Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Tue, 21 Apr 2026 18:03:25 +0200 Subject: [PATCH 01/14] Update to version 6.0.0 --- ...Sys-XrdSysPlatform.hh-for-MAXPATHLEN.patch | 37 ++++ ...se-timeouts-for-slow-debian-builders.patch | 71 +++++++ 0001-Unbundle-tinyxml.patch | 62 ++++++ ...h-all-work-around-for-missing-gettid.patch | 39 ++++ 0003-Also-check-for-GNU-in-statx.patch | 39 ++++ ...s-tests-when-usr-sbin-is-not-in-PATH.patch | 45 ++++ 0005-Fix-typo-conent-content.patch | 28 +++ ...nge-file-to-avoid-sed-during-install.patch | 25 +++ sources | 2 +- xrootd.spec | 192 ++++++++++-------- 10 files changed, 450 insertions(+), 90 deletions(-) create mode 100644 0001-Add-include-XrdSys-XrdSysPlatform.hh-for-MAXPATHLEN.patch create mode 100644 0001-Increase-timeouts-for-slow-debian-builders.patch create mode 100644 0001-Unbundle-tinyxml.patch create mode 100644 0002-Add-catch-all-work-around-for-missing-gettid.patch create mode 100644 0003-Also-check-for-GNU-in-statx.patch create mode 100644 0004-Fix-kerberos-tests-when-usr-sbin-is-not-in-PATH.patch create mode 100644 0005-Fix-typo-conent-content.patch create mode 100644 0006-Change-file-to-avoid-sed-during-install.patch diff --git a/0001-Add-include-XrdSys-XrdSysPlatform.hh-for-MAXPATHLEN.patch b/0001-Add-include-XrdSys-XrdSysPlatform.hh-for-MAXPATHLEN.patch new file mode 100644 index 0000000..849c380 --- /dev/null +++ b/0001-Add-include-XrdSys-XrdSysPlatform.hh-for-MAXPATHLEN.patch @@ -0,0 +1,37 @@ +From f0cb3ce78d9e1bd2bcac7c43e8b272b9350ec3f6 Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Mon, 20 Apr 2026 21:16:11 +0200 +Subject: [PATCH 1/6] Add #include "XrdSys/XrdSysPlatform.hh" for MAXPATHLEN + +--- + src/XrdOssArc/XrdOssArcBackup.cc | 1 + + src/XrdOssArc/XrdOssArcConfig.cc | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/src/XrdOssArc/XrdOssArcBackup.cc b/src/XrdOssArc/XrdOssArcBackup.cc +index f24912cb9..f49e7bdab 100644 +--- a/src/XrdOssArc/XrdOssArcBackup.cc ++++ b/src/XrdOssArc/XrdOssArcBackup.cc +@@ -47,6 +47,7 @@ + #include "XrdOuc/XrdOucStream.hh" + + #include "XrdSys/XrdSysError.hh" ++#include "XrdSys/XrdSysPlatform.hh" + #include "XrdSys/XrdSysPthread.hh" + + /******************************************************************************/ +diff --git a/src/XrdOssArc/XrdOssArcConfig.cc b/src/XrdOssArc/XrdOssArcConfig.cc +index 7f6ee0ac8..620c0bed1 100644 +--- a/src/XrdOssArc/XrdOssArcConfig.cc ++++ b/src/XrdOssArc/XrdOssArcConfig.cc +@@ -61,6 +61,7 @@ + #include "XrdOuc/XrdOucUtils.hh" + + #include "XrdSys/XrdSysError.hh" ++#include "XrdSys/XrdSysPlatform.hh" + + /******************************************************************************/ + /* G l o b a l O b j e c t s */ +-- +2.53.0 + diff --git a/0001-Increase-timeouts-for-slow-debian-builders.patch b/0001-Increase-timeouts-for-slow-debian-builders.patch new file mode 100644 index 0000000..ed0ec85 --- /dev/null +++ b/0001-Increase-timeouts-for-slow-debian-builders.patch @@ -0,0 +1,71 @@ +From 461010b0811ae5013de534befd89c4c6dbd58037 Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Mon, 20 Apr 2026 23:14:11 +0200 +Subject: [PATCH] Increase timeouts for slow debian builders + +--- + tests/XRootD/test.sh | 2 +- + tests/XrdClHttp/setup.sh | 4 ++-- + tests/XrdClS3/s3-setup.sh | 4 ++-- + 3 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/tests/XRootD/test.sh b/tests/XRootD/test.sh +index be160a2cf..e85c09053 100755 +--- a/tests/XRootD/test.sh ++++ b/tests/XRootD/test.sh +@@ -58,7 +58,7 @@ export XRD_LOGLEVEL XRD_LOGFILE + # Reduce default timeouts to catch errors quickly and prevent the test + # suite from getting stuck waiting for timeouts while running. + +-: "${XRD_REQUESTTIMEOUT:=15}" ++: "${XRD_REQUESTTIMEOUT:=60}" + : "${XRD_STREAMTIMEOUT:=10}" + : "${XRD_TIMEOUTRESOLUTION:=1}" + +diff --git a/tests/XrdClHttp/setup.sh b/tests/XrdClHttp/setup.sh +index d3f4ca901..df49308f9 100755 +--- a/tests/XrdClHttp/setup.sh ++++ b/tests/XrdClHttp/setup.sh +@@ -445,7 +445,7 @@ echo "Cache started at port $CACHE_PORT" + + if ! "$BINARY_DIR/bin/xrdscitokens-create-token" \ + issuer_public.pem issuer_private.pem test_key \ +- https://localhost:9443 storage.read:/ 600 > "$RUNDIR/token"; then ++ https://localhost:9443 storage.read:/ 3600 > "$RUNDIR/token"; then + echo "Failed to generate read token" + exit 1 + fi +@@ -453,7 +453,7 @@ echo "Sample read token available at $RUNDIR/token" + + if ! "$BINARY_DIR/bin/xrdscitokens-create-token" \ + issuer_public.pem issuer_private.pem test_key \ +- https://localhost:9443 storage.modify:/ 600 > "$RUNDIR/write.token"; then ++ https://localhost:9443 storage.modify:/ 3600 > "$RUNDIR/write.token"; then + echo "Failed to generate write token" + exit 1 + fi +diff --git a/tests/XrdClS3/s3-setup.sh b/tests/XrdClS3/s3-setup.sh +index 962824936..4c1d356a2 100755 +--- a/tests/XrdClS3/s3-setup.sh ++++ b/tests/XrdClS3/s3-setup.sh +@@ -267,7 +267,7 @@ fi + + if ! "$BINARY_DIR/bin/xrdscitokens-create-token" \ + "$RUNDIR/issuer/issuer_public.pem" "$RUNDIR/issuer/issuer_private.pem" test_key \ +- https://localhost:9443 storage.read:/ 600 > "$RUNDIR/token"; then ++ https://localhost:9443 storage.read:/ 3600 > "$RUNDIR/token"; then + echo "Failed to generate read token" + exit 1 + fi +@@ -275,7 +275,7 @@ echo "Sample read token available at $RUNDIR/token" + + if ! "$BINARY_DIR/bin/xrdscitokens-create-token" \ + "$RUNDIR/issuer/issuer_public.pem" "$RUNDIR/issuer/issuer_private.pem" test_key \ +- https://localhost:9443 storage.modify:/ 600 > "$RUNDIR/write.token"; then ++ https://localhost:9443 storage.modify:/ 3600 > "$RUNDIR/write.token"; then + echo "Failed to generate write token" + exit 1 + fi +-- +2.53.0 + diff --git a/0001-Unbundle-tinyxml.patch b/0001-Unbundle-tinyxml.patch new file mode 100644 index 0000000..9c98c2c --- /dev/null +++ b/0001-Unbundle-tinyxml.patch @@ -0,0 +1,62 @@ +From bd81e2e922bd44c755ad77cf29ca45570cc934ec Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Tue, 21 Apr 2026 00:38:07 +0200 +Subject: [PATCH] Unbundle tinyxml + +--- + cmake/FindTinyXml.cmake | 18 ++++++++++++++++++ + src/XrdXml/tinyxml/CMakeLists.txt | 12 ++++++++++++ + 2 files changed, 30 insertions(+) + create mode 100644 cmake/FindTinyXml.cmake + +diff --git a/cmake/FindTinyXml.cmake b/cmake/FindTinyXml.cmake +new file mode 100644 +index 000000000..75c752707 +--- /dev/null ++++ b/cmake/FindTinyXml.cmake +@@ -0,0 +1,18 @@ ++FIND_PATH(TINYXML_INCLUDE_DIR tinyxml.h ++ HINTS ++ ${TINYXML_DIR} ++ $ENV{TINYXML_DIR} ++ /usr ++ PATH_SUFFIXES include ++) ++ ++FIND_LIBRARY(TINYXML_LIBRARIES tinyxml ++ HINTS ++ ${TINYXML_DIR} ++ $ENV{TINYXML_DIR} ++ /usr ++ PATH_SUFFIXES lib ++) ++ ++INCLUDE(FindPackageHandleStandardArgs) ++FIND_PACKAGE_HANDLE_STANDARD_ARGS(TinyXml DEFAULT_MSG TINYXML_LIBRARIES TINYXML_INCLUDE_DIR) +diff --git a/src/XrdXml/tinyxml/CMakeLists.txt b/src/XrdXml/tinyxml/CMakeLists.txt +index db7d4924e..f87ed8f46 100644 +--- a/src/XrdXml/tinyxml/CMakeLists.txt ++++ b/src/XrdXml/tinyxml/CMakeLists.txt +@@ -1,3 +1,13 @@ ++find_package(TinyXml) ++ ++if(TINYXML_FOUND) ++ ++add_library(XrdTinyXml INTERFACE IMPORTED GLOBAL) ++set_property(TARGET XrdTinyXml PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${TINYXML_INCLUDE_DIR}") ++set_property(TARGET XrdTinyXml PROPERTY INTERFACE_LINK_LIBRARIES "${TINYXML_LIBRARIES}") ++ ++else() ++ + add_library(XrdTinyXml OBJECT + tinystr.cpp tinystr.h + tinyxml.cpp tinyxml.h +@@ -13,3 +23,5 @@ set_target_properties(XrdTinyXml + target_include_directories(XrdTinyXml + PUBLIC $ + ) ++ ++endif() +-- +2.53.0 + diff --git a/0002-Add-catch-all-work-around-for-missing-gettid.patch b/0002-Add-catch-all-work-around-for-missing-gettid.patch new file mode 100644 index 0000000..0a208f7 --- /dev/null +++ b/0002-Add-catch-all-work-around-for-missing-gettid.patch @@ -0,0 +1,39 @@ +From 0ef5b1a97d1ca0d8258384353165b8545463876a Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Mon, 20 Apr 2026 21:20:48 +0200 +Subject: [PATCH 2/6] Add catch-all work-around for missing gettid + +Possibly there are better solutions, but this is consistent with the +implementation in src/XrdSys/XrdSysPthread.cc +--- + src/XrdClHttp/XrdClHttpUtil.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/src/XrdClHttp/XrdClHttpUtil.cc b/src/XrdClHttp/XrdClHttpUtil.cc +index a1597b200..7bedb4373 100644 +--- a/src/XrdClHttp/XrdClHttpUtil.cc ++++ b/src/XrdClHttp/XrdClHttpUtil.cc +@@ -86,16 +86,18 @@ struct WaitingForBroker { + namespace { + + pid_t getthreadid() { +-#ifdef __APPLE__ ++#if defined(__APPLE__) + uint64_t pth_threadid; + pthread_threadid_np(pthread_self(), &pth_threadid); + return pth_threadid; +-#else ++#elif defined(__linux__) + // NOTE: glibc 2.30 finally provides a gettid() wrapper; however, + // we currently support RHEL 8, which is based on glibc 2.28. Until + // we drop that platform, it's easier to do the syscall directly on Linux + // instead of additional ifdef calls. + return syscall(SYS_gettid); ++#else ++ return getpid(); + #endif + } + +-- +2.53.0 + diff --git a/0003-Also-check-for-GNU-in-statx.patch b/0003-Also-check-for-GNU-in-statx.patch new file mode 100644 index 0000000..487ec14 --- /dev/null +++ b/0003-Also-check-for-GNU-in-statx.patch @@ -0,0 +1,39 @@ +From 0492078b60e7ffc50ee8fd2282b5960e264a17b4 Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Mon, 20 Apr 2026 21:53:38 +0200 +Subject: [PATCH 3/6] Also check for GNU in statx + +--- + src/XrdSys/XrdSysStatx.hh | 2 +- + tests/XrdSysTests/XrdSysStatxTests.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/XrdSys/XrdSysStatx.hh b/src/XrdSys/XrdSysStatx.hh +index 13b4894e0..dfaa3f7be 100644 +--- a/src/XrdSys/XrdSysStatx.hh ++++ b/src/XrdSys/XrdSysStatx.hh +@@ -35,7 +35,7 @@ + #include + #include + +-#ifdef __linux__ ++#if defined(__linux__) || defined(__GNU__) + #include + using XrdSysStatx = struct statx; + #define HAVE_STATX +diff --git a/tests/XrdSysTests/XrdSysStatxTests.cc b/tests/XrdSysTests/XrdSysStatxTests.cc +index d2d7e729f..23d2aaac6 100644 +--- a/tests/XrdSysTests/XrdSysStatxTests.cc ++++ b/tests/XrdSysTests/XrdSysStatxTests.cc +@@ -27,7 +27,7 @@ TEST_F(XrdSysStatxTests, Stat2StatxBasicFields) { + + EXPECT_EQ(stx.stx_mask, (uint32_t)STATX_BASIC_STATS); + +-#ifdef __linux__ ++#if defined(__linux__) || defined(__GNU__) + EXPECT_EQ(stx.stx_mode, (uint16_t)(S_IFREG | 0755)); + EXPECT_EQ(stx.stx_nlink, (uint32_t)3); + EXPECT_EQ(stx.stx_uid, (uint32_t)1000); +-- +2.53.0 + diff --git a/0004-Fix-kerberos-tests-when-usr-sbin-is-not-in-PATH.patch b/0004-Fix-kerberos-tests-when-usr-sbin-is-not-in-PATH.patch new file mode 100644 index 0000000..67dd202 --- /dev/null +++ b/0004-Fix-kerberos-tests-when-usr-sbin-is-not-in-PATH.patch @@ -0,0 +1,45 @@ +From e079b7cb1af1410ed15c7958e089ece6b36c5900 Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Mon, 20 Apr 2026 21:55:56 +0200 +Subject: [PATCH 4/6] Fix kerberos tests when /usr/sbin is not in PATH + +--- + tests/krb5/kerberos.sh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/tests/krb5/kerberos.sh b/tests/krb5/kerberos.sh +index b4af5e102..5b6405cd9 100755 +--- a/tests/krb5/kerberos.sh ++++ b/tests/krb5/kerberos.sh +@@ -36,16 +36,16 @@ function setup() { + popd >/dev/null || exit 1 + + # Create the KDC database +- kdb5_util create -s -r XROOTD.ORG -P xrootd ++ /usr/sbin/kdb5_util create -s -r XROOTD.ORG -P xrootd + + # Start the KDC daemons +- krb5kdc -P "${PWD}"/krb5kdc.pid ++ /usr/sbin/krb5kdc -P "${PWD}"/krb5kdc.pid + + # Not really needed, since we use kadmin.local + # kadmind -P ${PWD}/kadmind.pid + + # Add principals for the server and client to KDC database +- kadmin.local -r XROOTD.ORG <<-EOF ++ /usr/sbin/kadmin.local -r XROOTD.ORG <<-EOF + add_principal -randkey -kvno 1 host/localhost@XROOTD.ORG + ktadd -k krb5.keytab host/localhost + add_principal xrootd@XROOTD.ORG +@@ -54,7 +54,7 @@ function setup() { + EOF + + # Display KDC database entries +- kdb5_util tabdump -o - keyinfo ++ /usr/sbin/kdb5_util tabdump -o - keyinfo + + # Display contents of server keytab + klist -kte krb5.keytab +-- +2.53.0 + diff --git a/0005-Fix-typo-conent-content.patch b/0005-Fix-typo-conent-content.patch new file mode 100644 index 0000000..3307ead --- /dev/null +++ b/0005-Fix-typo-conent-content.patch @@ -0,0 +1,28 @@ +From 2c5be32cc7afed2c3f67a1bfbc25877f5233cb11 Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Mon, 20 Apr 2026 22:04:23 +0200 +Subject: [PATCH 5/6] =?UTF-8?q?Fix=20typo=20conent=20=E2=86=92=20content?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +--- + src/XrdClHttp/XrdClHttpFile.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/XrdClHttp/XrdClHttpFile.cc b/src/XrdClHttp/XrdClHttpFile.cc +index 3a15470e8..196e4d99c 100644 +--- a/src/XrdClHttp/XrdClHttpFile.cc ++++ b/src/XrdClHttp/XrdClHttpFile.cc +@@ -557,7 +557,7 @@ File::Fcntl(const XrdCl::Buffer &arg, XrdCl::ResponseHandler *handler, + } + } + XrdCl::Buffer *respBuff = new XrdCl::Buffer(); +- m_logger->Debug(kLogXrdClHttp, "Fcntl conent %s", xatt.dump().c_str()); ++ m_logger->Debug(kLogXrdClHttp, "Fcntl content %s", xatt.dump().c_str()); + respBuff->FromString(xatt.dump()); + obj->Set(respBuff); + } +-- +2.53.0 + diff --git a/0006-Change-file-to-avoid-sed-during-install.patch b/0006-Change-file-to-avoid-sed-during-install.patch new file mode 100644 index 0000000..fa7fb1f --- /dev/null +++ b/0006-Change-file-to-avoid-sed-during-install.patch @@ -0,0 +1,25 @@ +From 216526c32b894a5bad7b85897decef711f121018 Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Mon, 20 Apr 2026 22:42:06 +0200 +Subject: [PATCH 6/6] Change file to avoid sed during install + +--- + config/xrootd-http.cfg | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/config/xrootd-http.cfg b/config/xrootd-http.cfg +index cb707bf84..341f3316c 100644 +--- a/config/xrootd-http.cfg ++++ b/config/xrootd-http.cfg +@@ -33,7 +33,7 @@ all.pidpath /run/xrootd + # In order to start the xrdhttp.socket run: + # systemctl start xrdhttp@http.socket + # +-xrd.protocol XrdHttp:80 /usr/lib64/libXrdHttp.so ++xrd.protocol XrdHttp:80 libXrdHttp.so + # More configuration files can be added in /etc/xrootd/config.d/ + # For example /etc/xrootd/config.d/10-mygrid.cfg and + # /etc/xrootd/config.d/98-mysite-specifics.cfg +-- +2.53.0 + diff --git a/sources b/sources index 55d9300..a0d612c 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (xrootd-5.9.2.tar.gz) = 4d904ba6e10dc4f6b8a3e3bfa306744376c0428f2ed0754d913dfaa6339a46d75711c53b44286d532fe6a0f0db6f1dbeaa6d2f723dc4a556b31c7c691e3f90c3 +SHA512 (xrootd-6.0.0.tar.gz) = 1fac24c56464e76c104deabcef0a8910dbdc18f62d93275bf1048142beb0453e05aecddaaf41abe9d183c9bafb015067994a15ae0ffeecdc2875626791d76905 diff --git a/xrootd.spec b/xrootd.spec index 7ade4a9..78a689d 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -13,7 +13,7 @@ Name: xrootd Epoch: 1 -Version: 5.9.2 +Version: 6.0.0 Release: 1%{?dist} Summary: Extended ROOT file server License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib @@ -21,6 +21,16 @@ URL: https://xrootd.web.cern.ch Source0: %{url}/download/v%{version}/%{name}-%{version}.tar.gz Source1: %{name}-sysusers.conf +# https://github.com/xrootd/xrootd/pull/2769 +Patch0: 0001-Add-include-XrdSys-XrdSysPlatform.hh-for-MAXPATHLEN.patch +Patch1: 0002-Add-catch-all-work-around-for-missing-gettid.patch +Patch2: 0003-Also-check-for-GNU-in-statx.patch +Patch3: 0004-Fix-kerberos-tests-when-usr-sbin-is-not-in-PATH.patch +Patch4: 0005-Fix-typo-conent-content.patch +Patch5: 0006-Change-file-to-avoid-sed-during-install.patch +# Unbundle tinyxml library +Patch6: 0001-Unbundle-tinyxml.patch + BuildRequires: cmake BuildRequires: gcc-c++ BuildRequires: make @@ -30,13 +40,12 @@ BuildRequires: krb5-devel BuildRequires: libcurl-devel BuildRequires: tinyxml-devel BuildRequires: libxml2-devel +BuildRequires: libzip-devel BuildRequires: ncurses-devel BuildRequires: openssl-devel BuildRequires: perl-generators BuildRequires: readline-devel BuildRequires: zlib-devel -BuildRequires: doxygen -BuildRequires: graphviz BuildRequires: selinux-policy-devel BuildRequires: systemd-rpm-macros BuildRequires: systemd-devel @@ -44,13 +53,12 @@ BuildRequires: python3-devel BuildRequires: python3-pip BuildRequires: python3-setuptools BuildRequires: python3-wheel -BuildRequires: python3-sphinx BuildRequires: json-c-devel +BuildRequires: json-devel BuildRequires: libmacaroons-devel BuildRequires: libuuid-devel BuildRequires: voms-devel BuildRequires: scitokens-cpp-devel -BuildRequires: davix-devel BuildRequires: libxcrypt-devel %if %{ceph} BuildRequires: librados-devel @@ -59,15 +67,19 @@ BuildRequires: libradosstriper-devel %ifnarch %{ix86} BuildRequires: isa-l-devel %endif +# For documentation +BuildRequires: doxygen +BuildRequires: graphviz +BuildRequires: python3-sphinx # For tests BuildRequires: attr BuildRequires: curl -BuildRequires: davix BuildRequires: gtest-devel BuildRequires: krb5-server BuildRequires: krb5-workstation BuildRequires: openssl BuildRequires: procps +BuildRequires: sqlite Requires: %{name}-server%{?_isa} = %{epoch}:%{version}-%{release} Requires: %{name}-selinux = %{epoch}:%{version}-%{release} @@ -129,6 +141,8 @@ development. %package client-libs Summary: Libraries used by xrootd clients +Provides: xrdcl-http = %{epoch}:%{version}-%{release} +Obsoletes: xrdcl-http < 1:6.0.0 Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release} %description client-libs @@ -223,15 +237,6 @@ SciToken passed during a transfer. Configured appropriately, this allows the XRootD server admin to delegate authorization decisions for a subset of the namespace to an external issuer. -%package -n xrdcl-http -Summary: HTTP client plugin for XRootD -Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release} -Requires: %{name}-client-libs%{?_isa} = %{epoch}:%{version}-%{release} - -%description -n xrdcl-http -xrdcl-http is an XRootD client plugin which allows XRootD to interact -with HTTP repositories. - %if %{ceph} %package ceph Summary: XRootD plugin for interfacing with the Ceph storage platform @@ -261,6 +266,14 @@ This package contains the API documentation of the xrootd libraries. %prep %setup -q +%patch -P0 -p1 +%patch -P1 -p1 +%patch -P2 -p1 +%patch -P3 -p1 +%patch -P4 -p1 +%patch -P5 -p1 +%patch -P6 -p1 + %build %cmake \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ @@ -269,8 +282,8 @@ This package contains the API documentation of the xrootd libraries. %if %{ceph} -DENABLE_CEPH:BOOL=ON \ %endif -%ifarch %{ix86} - -DENABLE_XRDEC:BOOL=OFF \ +%ifnarch %{ix86} + -DENABLE_XRDEC:BOOL=ON \ %endif %if %{?fedora}%{!?fedora:0} || %{?rhel}%{!?rhel:0} >= 9 -DPIP_OPTIONS="--no-deps --use-pep517 --no-build-isolation --disable-pip-version-check --verbose" \ @@ -280,7 +293,7 @@ This package contains the API documentation of the xrootd libraries. -DXRD_PYTHON_REQ_VERSION=%{python3_version} %cmake_build -make -C packaging/common -f /usr/share/selinux/devel/Makefile +make -C config -f /usr/share/selinux/devel/Makefile doxygen Doxyfile # Use local image instead of remote @@ -306,44 +319,43 @@ rm -f %{buildroot}%{_libdir}/cmake/XRootD/uninstall.cmake LD_LIBRARY_PATH=%{buildroot}%{_libdir} \ PYTHONPATH=%{buildroot}%{python3_sitearch} \ PYTHONDONTWRITEBYTECODE=1 \ -make -C bindings/python/docs html +make -C python/docs html # Service unit files mkdir -p %{buildroot}%{_unitdir} -install -m 644 -p packaging/common/xrootd@.service %{buildroot}%{_unitdir} -install -m 644 -p packaging/common/xrootd@.socket %{buildroot}%{_unitdir} -install -m 644 -p packaging/common/xrdhttp@.socket %{buildroot}%{_unitdir} -install -m 644 -p packaging/common/cmsd@.service %{buildroot}%{_unitdir} -install -m 644 -p packaging/common/frm_xfrd@.service %{buildroot}%{_unitdir} -install -m 644 -p packaging/common/frm_purged@.service %{buildroot}%{_unitdir} -mkdir -p %{buildroot}%{_tmpfilesdir} -install -m 644 -p packaging/rhel/xrootd.tmpfiles %{buildroot}%{_tmpfilesdir}/%{name}.conf +install -m 644 -p systemd/xrootd@.service %{buildroot}%{_unitdir} +install -m 644 -p systemd/xrootd@.socket %{buildroot}%{_unitdir} +install -m 644 -p systemd/xrdhttp@.socket %{buildroot}%{_unitdir} +install -m 644 -p systemd/cmsd@.service %{buildroot}%{_unitdir} +install -m 644 -p systemd/frm_xfrd@.service %{buildroot}%{_unitdir} +install -m 644 -p systemd/frm_purged@.service %{buildroot}%{_unitdir} + mkdir -p %{buildroot}%{_sysusersdir} install -m 644 -p %{SOURCE1} %{buildroot}%{_sysusersdir}/%{name}.conf # Server config mkdir -p %{buildroot}%{_sysconfdir}/%{name} -install -m 644 -p packaging/common/%{name}-clustered.cfg \ +install -m 644 -p config/%{name}-clustered.cfg \ %{buildroot}%{_sysconfdir}/%{name}/%{name}-clustered.cfg -install -m 644 -p packaging/common/%{name}-standalone.cfg \ +install -m 644 -p config/%{name}-standalone.cfg \ %{buildroot}%{_sysconfdir}/%{name}/%{name}-standalone.cfg -install -m 644 -p packaging/common/%{name}-filecache-clustered.cfg \ +install -m 644 -p config/%{name}-filecache-clustered.cfg \ %{buildroot}%{_sysconfdir}/%{name}/%{name}-filecache-clustered.cfg -install -m 644 -p packaging/common/%{name}-filecache-standalone.cfg \ +install -m 644 -p config/%{name}-filecache-standalone.cfg \ %{buildroot}%{_sysconfdir}/%{name}/%{name}-filecache-standalone.cfg -sed 's!/usr/lib64/!!' packaging/common/%{name}-http.cfg > \ +install -m 644 -p config/%{name}-http.cfg \ %{buildroot}%{_sysconfdir}/%{name}/%{name}-http.cfg # Client config mkdir -p %{buildroot}%{_sysconfdir}/%{name}/client.plugins.d -install -m 644 -p packaging/common/client.conf \ +install -m 644 -p config/client.conf \ %{buildroot}%{_sysconfdir}/%{name}/client.conf -sed 's!/usr/lib/!!' packaging/common/client-plugin.conf.example > \ - %{buildroot}%{_sysconfdir}/%{name}/client.plugins.d/client-plugin.conf.example -sed -e 's!/usr/lib64/!!' -e 's!-5!!' packaging/common/recorder.conf > \ +install -m 644 -p config/client.plugins.d/http.conf \ + %{buildroot}%{_sysconfdir}/%{name}/client.plugins.d/http.conf +install -m 644 -p config/client.plugins.d/recorder.conf \ %{buildroot}%{_sysconfdir}/%{name}/client.plugins.d/recorder.conf -sed 's!/usr/lib64/!!' packaging/common/http.client.conf.example > \ - %{buildroot}%{_sysconfdir}/%{name}/client.plugins.d/xrdcl-http-plugin.conf +install -m 644 -p config/client.plugins.d/s3.conf \ + %{buildroot}%{_sysconfdir}/%{name}/client.plugins.d/s3.conf chmod 644 %{buildroot}%{_datadir}/%{name}/utils/XrdCmsNotify.pm @@ -358,20 +370,21 @@ mkdir -p %{buildroot}%{_sysconfdir}/%{name}/config.d mkdir -p %{buildroot}%{_localstatedir}/log/%{name} mkdir -p %{buildroot}%{_localstatedir}/spool/%{name} +mkdir -p %{buildroot}%{_rundir}/%{name} mkdir -p %{buildroot}%{_sysconfdir}/logrotate.d -install -m 644 -p packaging/common/%{name}.logrotate \ +install -m 644 -p config/%{name}.logrotate \ %{buildroot}%{_sysconfdir}/logrotate.d/%{name} mkdir -p %{buildroot}%{_datadir}/selinux/packages/%{name} -install -m 644 -p packaging/common/%{name}.pp \ +install -m 644 -p config/%{name}.pp \ %{buildroot}%{_datadir}/selinux/packages/%{name} # Documentation mkdir -p %{buildroot}%{_pkgdocdir} cp -pr doxydoc/html %{buildroot}%{_pkgdocdir} -cp -pr bindings/python/docs/build/html %{buildroot}%{_pkgdocdir}/python +cp -pr python/docs/build/html %{buildroot}%{_pkgdocdir}/python rm %{buildroot}%{_pkgdocdir}/python/.buildinfo %check @@ -424,8 +437,6 @@ rm testfile %sysusers_create_compat %{SOURCE1} %post server -%tmpfiles_create %{name}.conf - if [ $1 -eq 1 ] ; then systemctl daemon-reload >/dev/null 2>&1 || : fi @@ -488,7 +499,6 @@ fi %dir %{_datadir}/%{name} %{_datadir}/%{name}/utils %{_unitdir}/* -%{_tmpfilesdir}/%{name}.conf %{_sysusersdir}/%{name}.conf %config(noreplace) %{_sysconfdir}/logrotate.d/%{name} %dir %{_sysconfdir}/%{name}/config.d @@ -508,18 +518,18 @@ fi %{_libdir}/libXrdUtils.so.* %{_libdir}/libXrdXml.so.* # Plugins -%{_libdir}/libXrdCksCalczcrc32-5.so -%{_libdir}/libXrdCryptossl-5.so -%{_libdir}/libXrdSec-5.so -%{_libdir}/libXrdSecProt-5.so -%{_libdir}/libXrdSecgsi-5.so -%{_libdir}/libXrdSecgsiAUTHZVO-5.so -%{_libdir}/libXrdSecgsiGMAPDN-5.so -%{_libdir}/libXrdSeckrb5-5.so -%{_libdir}/libXrdSecpwd-5.so -%{_libdir}/libXrdSecsss-5.so -%{_libdir}/libXrdSecunix-5.so -%{_libdir}/libXrdSecztn-5.so +%{_libdir}/libXrdCksCalczcrc32-6.so +%{_libdir}/libXrdCryptossl-6.so +%{_libdir}/libXrdSec-6.so +%{_libdir}/libXrdSecProt-6.so +%{_libdir}/libXrdSecgsi-6.so +%{_libdir}/libXrdSecgsiAUTHZVO-6.so +%{_libdir}/libXrdSecgsiGMAPDN-6.so +%{_libdir}/libXrdSeckrb5-6.so +%{_libdir}/libXrdSecpwd-6.so +%{_libdir}/libXrdSecsss-6.so +%{_libdir}/libXrdSecunix-6.so +%{_libdir}/libXrdSecztn-6.so %license COPYING* LICENSE %files devel @@ -554,16 +564,20 @@ fi %{_libdir}/libXrdSsiLib.so.* %{_libdir}/libXrdSsiShMap.so.* # Plugins -%{_libdir}/libXrdClProxyPlugin-5.so -%{_libdir}/libXrdClRecorder-5.so +%{_libdir}/libXrdClHttp-6.so +%{_libdir}/libXrdClProxyPlugin-6.so +%{_libdir}/libXrdClRecorder-6.so +%{_libdir}/libXrdClS3-6.so %dir %{_sysconfdir}/%{name} %config(noreplace) %{_sysconfdir}/%{name}/client.conf %dir %{_sysconfdir}/%{name}/client.plugins.d -%config(noreplace) %{_sysconfdir}/%{name}/client.plugins.d/client-plugin.conf.example +%config(noreplace) %{_sysconfdir}/%{name}/client.plugins.d/http.conf %config(noreplace) %{_sysconfdir}/%{name}/client.plugins.d/recorder.conf +%config(noreplace) %{_sysconfdir}/%{name}/client.plugins.d/s3.conf %files client-devel %{_includedir}/%{name}/XrdCl +%{_includedir}/%{name}/XrdClHttp %{_includedir}/%{name}/XrdPosix %{_libdir}/libXrdCl.so %{_libdir}/libXrdFfs.so @@ -573,26 +587,27 @@ fi %{_libdir}/libXrdHttpUtils.so.* %{_libdir}/libXrdServer.so.* # Plugins -%{_libdir}/libXrdBlacklistDecision-5.so -%{_libdir}/libXrdBwm-5.so -%{_libdir}/libXrdCmsRedirectLocal-5.so -%{_libdir}/libXrdFileCache-5.so -%{_libdir}/libXrdHttp-5.so -%{_libdir}/libXrdHttpCors-5.so -%{_libdir}/libXrdHttpTPC-5.so -%{_libdir}/libXrdMacaroons-5.so -%{_libdir}/libXrdN2No2p-5.so -%{_libdir}/libXrdOfsPrepGPI-5.so -%{_libdir}/libXrdOssCsi-5.so -%{_libdir}/libXrdOssSIgpfsT-5.so -%{_libdir}/libXrdOssStats-5.so -%{_libdir}/libXrdPfc-5.so -%{_libdir}/libXrdPfcPurgeQuota-5.so -%{_libdir}/libXrdPss-5.so -%{_libdir}/libXrdSsi-5.so -%{_libdir}/libXrdSsiLog-5.so -%{_libdir}/libXrdThrottle-5.so -%{_libdir}/libXrdXrootd-5.so +%{_libdir}/libXrdBlacklistDecision-6.so +%{_libdir}/libXrdBwm-6.so +%{_libdir}/libXrdCmsRedirectLocal-6.so +%{_libdir}/libXrdFileCache-6.so +%{_libdir}/libXrdHttp-6.so +%{_libdir}/libXrdHttpCors-6.so +%{_libdir}/libXrdHttpTPC-6.so +%{_libdir}/libXrdMacaroons-6.so +%{_libdir}/libXrdN2No2p-6.so +%{_libdir}/libXrdOfsPrepGPI-6.so +%{_libdir}/libXrdOssArc-6.so +%{_libdir}/libXrdOssCsi-6.so +%{_libdir}/libXrdOssSIgpfsT-6.so +%{_libdir}/libXrdOssStats-6.so +%{_libdir}/libXrdPfc-6.so +%{_libdir}/libXrdPfcPurgeQuota-6.so +%{_libdir}/libXrdPss-6.so +%{_libdir}/libXrdSsi-6.so +%{_libdir}/libXrdSsiLog-6.so +%{_libdir}/libXrdThrottle-6.so +%{_libdir}/libXrdXrootd-6.so %files server-devel %{_includedir}/%{name}/XrdAcc @@ -639,25 +654,21 @@ fi %{_mandir}/man1/xrootdfs.1* %files voms -%{_libdir}/libXrdVoms-5.so -%{_libdir}/libXrdHttpVOMS-5.so -%{_libdir}/libXrdSecgsiVOMS-5.so +%{_libdir}/libXrdVoms-6.so +%{_libdir}/libXrdHttpVOMS-6.so +%{_libdir}/libXrdSecgsiVOMS-6.so %doc %{_mandir}/man1/libXrdVoms.1* %doc %{_mandir}/man1/libXrdSecgsiVOMS.1* %doc src/XrdVoms/README.md %files scitokens -%{_libdir}/libXrdAccSciTokens-5.so +%{_libdir}/libXrdAccSciTokens-6.so %doc src/XrdSciTokens/README.md -%files -n xrdcl-http -%{_libdir}/libXrdClHttp-5.so -%config(noreplace) %{_sysconfdir}/%{name}/client.plugins.d/xrdcl-http-plugin.conf - %if %{ceph} %files ceph -%{_libdir}/libXrdCeph-5.so -%{_libdir}/libXrdCephXattr-5.so +%{_libdir}/libXrdCeph-6.so +%{_libdir}/libXrdCephXattr-6.so %{_libdir}/libXrdCephPosix.so.* %endif @@ -670,6 +681,9 @@ fi %doc %{_pkgdocdir} %changelog +* Sat Apr 11 2026 Mattias Ellert - 1:6.0.0-1 +- Update to version 6.0.0 + * Fri Mar 27 2026 Mattias Ellert - 1:5.9.2-1 - Update to version 5.9.2 - Drop patches accepted upstream or previously backported From 8acacae375b0e25f539031b7d654e99d0f717145 Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Mon, 1 Jun 2026 04:22:36 +0200 Subject: [PATCH 02/14] Update to version 6.0.2 Adapt to OpenSSL 4.0 Drop patches accepted upstream --- ...Sys-XrdSysPlatform.hh-for-MAXPATHLEN.patch | 37 -- ...se-timeouts-for-slow-debian-builders.patch | 71 --- ...g-preventing-the-configuration-of-th.patch | 28 + ...-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch | 566 ++++++++++++++++++ ...h-all-work-around-for-missing-gettid.patch | 39 -- 0002-XrdCrypto-Preserve-ABI.patch | 30 + 0003-Also-check-for-GNU-in-statx.patch | 39 -- ...s-tests-when-usr-sbin-is-not-in-PATH.patch | 45 -- 0005-Fix-typo-conent-content.patch | 28 - ...nge-file-to-avoid-sed-during-install.patch | 25 - sources | 2 +- xrootd.spec | 55 +- 12 files changed, 647 insertions(+), 318 deletions(-) delete mode 100644 0001-Add-include-XrdSys-XrdSysPlatform.hh-for-MAXPATHLEN.patch delete mode 100644 0001-Increase-timeouts-for-slow-debian-builders.patch create mode 100644 0001-XrdClHttp-Fix-bug-preventing-the-configuration-of-th.patch create mode 100644 0001-XrdCrypto-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch delete mode 100644 0002-Add-catch-all-work-around-for-missing-gettid.patch create mode 100644 0002-XrdCrypto-Preserve-ABI.patch delete mode 100644 0003-Also-check-for-GNU-in-statx.patch delete mode 100644 0004-Fix-kerberos-tests-when-usr-sbin-is-not-in-PATH.patch delete mode 100644 0005-Fix-typo-conent-content.patch delete mode 100644 0006-Change-file-to-avoid-sed-during-install.patch diff --git a/0001-Add-include-XrdSys-XrdSysPlatform.hh-for-MAXPATHLEN.patch b/0001-Add-include-XrdSys-XrdSysPlatform.hh-for-MAXPATHLEN.patch deleted file mode 100644 index 849c380..0000000 --- a/0001-Add-include-XrdSys-XrdSysPlatform.hh-for-MAXPATHLEN.patch +++ /dev/null @@ -1,37 +0,0 @@ -From f0cb3ce78d9e1bd2bcac7c43e8b272b9350ec3f6 Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Mon, 20 Apr 2026 21:16:11 +0200 -Subject: [PATCH 1/6] Add #include "XrdSys/XrdSysPlatform.hh" for MAXPATHLEN - ---- - src/XrdOssArc/XrdOssArcBackup.cc | 1 + - src/XrdOssArc/XrdOssArcConfig.cc | 1 + - 2 files changed, 2 insertions(+) - -diff --git a/src/XrdOssArc/XrdOssArcBackup.cc b/src/XrdOssArc/XrdOssArcBackup.cc -index f24912cb9..f49e7bdab 100644 ---- a/src/XrdOssArc/XrdOssArcBackup.cc -+++ b/src/XrdOssArc/XrdOssArcBackup.cc -@@ -47,6 +47,7 @@ - #include "XrdOuc/XrdOucStream.hh" - - #include "XrdSys/XrdSysError.hh" -+#include "XrdSys/XrdSysPlatform.hh" - #include "XrdSys/XrdSysPthread.hh" - - /******************************************************************************/ -diff --git a/src/XrdOssArc/XrdOssArcConfig.cc b/src/XrdOssArc/XrdOssArcConfig.cc -index 7f6ee0ac8..620c0bed1 100644 ---- a/src/XrdOssArc/XrdOssArcConfig.cc -+++ b/src/XrdOssArc/XrdOssArcConfig.cc -@@ -61,6 +61,7 @@ - #include "XrdOuc/XrdOucUtils.hh" - - #include "XrdSys/XrdSysError.hh" -+#include "XrdSys/XrdSysPlatform.hh" - - /******************************************************************************/ - /* G l o b a l O b j e c t s */ --- -2.53.0 - diff --git a/0001-Increase-timeouts-for-slow-debian-builders.patch b/0001-Increase-timeouts-for-slow-debian-builders.patch deleted file mode 100644 index ed0ec85..0000000 --- a/0001-Increase-timeouts-for-slow-debian-builders.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 461010b0811ae5013de534befd89c4c6dbd58037 Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Mon, 20 Apr 2026 23:14:11 +0200 -Subject: [PATCH] Increase timeouts for slow debian builders - ---- - tests/XRootD/test.sh | 2 +- - tests/XrdClHttp/setup.sh | 4 ++-- - tests/XrdClS3/s3-setup.sh | 4 ++-- - 3 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/tests/XRootD/test.sh b/tests/XRootD/test.sh -index be160a2cf..e85c09053 100755 ---- a/tests/XRootD/test.sh -+++ b/tests/XRootD/test.sh -@@ -58,7 +58,7 @@ export XRD_LOGLEVEL XRD_LOGFILE - # Reduce default timeouts to catch errors quickly and prevent the test - # suite from getting stuck waiting for timeouts while running. - --: "${XRD_REQUESTTIMEOUT:=15}" -+: "${XRD_REQUESTTIMEOUT:=60}" - : "${XRD_STREAMTIMEOUT:=10}" - : "${XRD_TIMEOUTRESOLUTION:=1}" - -diff --git a/tests/XrdClHttp/setup.sh b/tests/XrdClHttp/setup.sh -index d3f4ca901..df49308f9 100755 ---- a/tests/XrdClHttp/setup.sh -+++ b/tests/XrdClHttp/setup.sh -@@ -445,7 +445,7 @@ echo "Cache started at port $CACHE_PORT" - - if ! "$BINARY_DIR/bin/xrdscitokens-create-token" \ - issuer_public.pem issuer_private.pem test_key \ -- https://localhost:9443 storage.read:/ 600 > "$RUNDIR/token"; then -+ https://localhost:9443 storage.read:/ 3600 > "$RUNDIR/token"; then - echo "Failed to generate read token" - exit 1 - fi -@@ -453,7 +453,7 @@ echo "Sample read token available at $RUNDIR/token" - - if ! "$BINARY_DIR/bin/xrdscitokens-create-token" \ - issuer_public.pem issuer_private.pem test_key \ -- https://localhost:9443 storage.modify:/ 600 > "$RUNDIR/write.token"; then -+ https://localhost:9443 storage.modify:/ 3600 > "$RUNDIR/write.token"; then - echo "Failed to generate write token" - exit 1 - fi -diff --git a/tests/XrdClS3/s3-setup.sh b/tests/XrdClS3/s3-setup.sh -index 962824936..4c1d356a2 100755 ---- a/tests/XrdClS3/s3-setup.sh -+++ b/tests/XrdClS3/s3-setup.sh -@@ -267,7 +267,7 @@ fi - - if ! "$BINARY_DIR/bin/xrdscitokens-create-token" \ - "$RUNDIR/issuer/issuer_public.pem" "$RUNDIR/issuer/issuer_private.pem" test_key \ -- https://localhost:9443 storage.read:/ 600 > "$RUNDIR/token"; then -+ https://localhost:9443 storage.read:/ 3600 > "$RUNDIR/token"; then - echo "Failed to generate read token" - exit 1 - fi -@@ -275,7 +275,7 @@ echo "Sample read token available at $RUNDIR/token" - - if ! "$BINARY_DIR/bin/xrdscitokens-create-token" \ - "$RUNDIR/issuer/issuer_public.pem" "$RUNDIR/issuer/issuer_private.pem" test_key \ -- https://localhost:9443 storage.modify:/ 600 > "$RUNDIR/write.token"; then -+ https://localhost:9443 storage.modify:/ 3600 > "$RUNDIR/write.token"; then - echo "Failed to generate write token" - exit 1 - fi --- -2.53.0 - diff --git a/0001-XrdClHttp-Fix-bug-preventing-the-configuration-of-th.patch b/0001-XrdClHttp-Fix-bug-preventing-the-configuration-of-th.patch new file mode 100644 index 0000000..9526c32 --- /dev/null +++ b/0001-XrdClHttp-Fix-bug-preventing-the-configuration-of-th.patch @@ -0,0 +1,28 @@ +From 71ea4b5b2c68937500f4c7b70a9d775781776eb5 Mon Sep 17 00:00:00 2001 +From: Brian Bockelman +Date: Thu, 21 May 2026 08:44:03 -0500 +Subject: [PATCH] [XrdClHttp] Fix bug preventing the configuration of threads + +Appears a prior refactoring caused the thread configuration to use +the wrong variable, causing 8 worker threads to be used regardless +of the current configuration. +--- + src/XrdClHttp/XrdClHttpFactory.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/XrdClHttp/XrdClHttpFactory.cc b/src/XrdClHttp/XrdClHttpFactory.cc +index 81413eff4..08d8ef8bd 100644 +--- a/src/XrdClHttp/XrdClHttpFactory.cc ++++ b/src/XrdClHttp/XrdClHttpFactory.cc +@@ -194,7 +194,7 @@ Factory::Initialize() + auto &cache = XrdClHttp::VerbsCache::Instance(); + + // Startup curl workers after we've set the configs to avoid race conditions +- for (unsigned idx=0; idx(m_queue, cache, m_log); + auto wkp = wk.get(); + std::thread t(XrdClHttp::CurlWorker::RunStatic, wkp); +-- +2.54.0 + diff --git a/0001-XrdCrypto-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch b/0001-XrdCrypto-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch new file mode 100644 index 0000000..e46ad9e --- /dev/null +++ b/0001-XrdCrypto-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch @@ -0,0 +1,566 @@ +From 534e1aa2efd8e59271d2410dc4a4d33ab7bc8ed9 Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Sat, 23 May 2026 18:57:54 +0200 +Subject: [PATCH 1/2] [XrdCrypto/XrdTls/XrdVoms] Adapt to OpenSSL 4.0 + +--- + src/XrdCrypto/XrdCryptosslAux.cc | 6 +- + src/XrdCrypto/XrdCryptosslAux.hh | 2 +- + src/XrdCrypto/XrdCryptosslX509.cc | 48 +++++---- + src/XrdCrypto/XrdCryptosslX509Crl.cc | 2 +- + src/XrdCrypto/XrdCryptosslgsiAux.cc | 140 ++++++++++++++++++++------- + src/XrdTls/XrdTlsNotaryUtils.icc | 4 +- + src/XrdVoms/XrdVomsFun.cc | 2 +- + src/XrdVoms/XrdVomsFun.hh | 2 +- + 8 files changed, 145 insertions(+), 61 deletions(-) + +diff --git a/src/XrdCrypto/XrdCryptosslAux.cc b/src/XrdCrypto/XrdCryptosslAux.cc +index 3893bc2b4..a44283985 100644 +--- a/src/XrdCrypto/XrdCryptosslAux.cc ++++ b/src/XrdCrypto/XrdCryptosslAux.cc +@@ -691,13 +691,13 @@ time_t XrdCryptosslASN1toUTC(const ASN1_TIME *tsn1) + // Our result is in agreement with 'date +%s`. + struct tm ltm; + char zz; +- if ((sscanf((const char *)(tsn1->data), ++ if ((sscanf((const char *) ASN1_STRING_get0_data(tsn1), + "%02d%02d%02d%02d%02d%02d%c", + &(ltm.tm_year), &(ltm.tm_mon), &(ltm.tm_mday), + &(ltm.tm_hour), &(ltm.tm_min), &(ltm.tm_sec), + &zz) != 7) || (zz != 'Z')) { + // Try GeneralizedTime +- if ((sscanf((const char *)(tsn1->data), ++ if ((sscanf((const char *) ASN1_STRING_get0_data(tsn1), + "%04d%02d%02d%02d%02d%02d%c", + &(ltm.tm_year), &(ltm.tm_mon), &(ltm.tm_mday), + &(ltm.tm_hour), &(ltm.tm_min), &(ltm.tm_sec), +@@ -733,7 +733,7 @@ time_t XrdCryptosslASN1toUTC(const ASN1_TIME *tsn1) + } + + //____________________________________________________________________________ +-void XrdCryptosslNameOneLine(X509_NAME *nm, XrdOucString &s) ++void XrdCryptosslNameOneLine(const X509_NAME *nm, XrdOucString &s) + { + // Function to convert X509_NAME into a one-line human readable string + +diff --git a/src/XrdCrypto/XrdCryptosslAux.hh b/src/XrdCrypto/XrdCryptosslAux.hh +index 36f3aad1b..de852be3f 100644 +--- a/src/XrdCrypto/XrdCryptosslAux.hh ++++ b/src/XrdCrypto/XrdCryptosslAux.hh +@@ -74,7 +74,7 @@ int XrdCryptosslX509ParseStack(XrdTlsPeerCerts* pc, XrdCryptoX509Chain *chain); + time_t XrdCryptosslASN1toUTC(const ASN1_TIME *tsn1); + + // Function to convert X509_NAME into a one-line human readable string +-void XrdCryptosslNameOneLine(X509_NAME *nm, XrdOucString &s); ++void XrdCryptosslNameOneLine(const X509_NAME *nm, XrdOucString &s); + + // + // X509 proxy auxilliary functions +diff --git a/src/XrdCrypto/XrdCryptosslX509.cc b/src/XrdCrypto/XrdCryptosslX509.cc +index bcc79c89c..d9d2b182f 100644 +--- a/src/XrdCrypto/XrdCryptosslX509.cc ++++ b/src/XrdCrypto/XrdCryptosslX509.cc +@@ -340,7 +340,11 @@ void XrdCryptosslX509::CertType() + + bool done = 0; + // Check the extensions ++#if OPENSSL_VERSION_NUMBER < 0x40000000L + X509_EXTENSION *ext = 0; ++#else ++ const X509_EXTENSION *ext = 0; ++#endif + int idx = -1; + + // For CAs we are looking for a "basicConstraints" +@@ -684,7 +688,11 @@ XrdCryptoX509data XrdCryptosslX509::GetExtension(const char *oid) + + // Loop to identify the one we would like + int i = 0; ++#if OPENSSL_VERSION_NUMBER < 0x40000000L + X509_EXTENSION *wext = 0; ++#else ++ const X509_EXTENSION *wext = 0; ++#endif + for (i = 0; i< numext; i++) { + wext = X509_get_ext(cert, i); + if (usenid) { +@@ -821,7 +829,11 @@ int XrdCryptosslX509::DumpExtensions(bool dumpunknown) + + rc = 1; + // Go through the extensions ++#if OPENSSL_VERSION_NUMBER < 0x40000000L + X509_EXTENSION *xpiext = 0; ++#else ++ const X509_EXTENSION *xpiext = 0; ++#endif + int npiext = X509_get_ext_count(xpi); + PRINT("found "<data; +- long length = X509_EXTENSION_get_data(xpiext)->length; ++ const unsigned char *pp = ASN1_STRING_get0_data(X509_EXTENSION_get_data(xpiext)); ++ long length = ASN1_STRING_length(X509_EXTENSION_get_data(xpiext)); + int ret = FillUnknownExt(&pp, length, dumpunknown); + PRINT("ret: " << ret); + } +@@ -957,10 +969,10 @@ int XrdCryptosslX509::FillUnknownExt(const unsigned char **pp, long length, bool + int i, printable = 1; + opp = op; + os = d2i_ASN1_OCTET_STRING(0, &opp, len + hl); +- if (os && os->length > 0) { +- opp = os->data; ++ if (os && ASN1_STRING_length(os) > 0) { ++ opp = ASN1_STRING_get0_data(os); + /* testing whether the octet string is * printable */ +- for (i=0; ilength; i++) { ++ for (i=0; i < ASN1_STRING_length(os); i++) { + if (( (opp[i] < ' ') && (opp[i] != '\n') && + (opp[i] != '\r') && (opp[i] != '\t')) || (opp[i] > '~')) { + printable = 0; +@@ -969,16 +981,16 @@ int XrdCryptosslX509::FillUnknownExt(const unsigned char **pp, long length, bool + } + if (printable) { + /* printable string */ +- char *s = new char[os->length + 1]; +- memcpy(s, opp, os->length); +- s[os->length] = 0; +- if (dump) PRINT("OBJS:" << s << " (len: "<length<<")"); ++ char *s = new char[ASN1_STRING_length(os) + 1]; ++ memcpy(s, opp, ASN1_STRING_length(os)); ++ s[ASN1_STRING_length(os)] = 0; ++ if (dump) PRINT("OBJS:" << s << " (len: " << ASN1_STRING_length(os) << ")"); + delete [] s; + } else { + /* print the normal dump */ + if (!nl) PRINT("OBJS:"); + BIO *mem = BIO_new(BIO_s_mem()); +- if (BIO_dump_indent(mem, (const char *)opp, os->length, dump_indent) <= 0) { ++ if (BIO_dump_indent(mem, (const char *)opp, ASN1_STRING_length(os), dump_indent) <= 0) { + if (dump) PRINT("ERROR:OBJS: problems dumping to BIO"); + BIO_free(mem); + goto end; +@@ -999,18 +1011,18 @@ int XrdCryptosslX509::FillUnknownExt(const unsigned char **pp, long length, bool + bs = d2i_ASN1_INTEGER(0, &opp, len+hl); + if (bs) { + if (dump) PRINT("AINT:"); +- if (bs->type == V_ASN1_NEG_INTEGER) ++ if (ASN1_STRING_type(bs) == V_ASN1_NEG_INTEGER) + if (dump) PRINT("-"); + BIO *mem = BIO_new(BIO_s_mem()); +- for (i = 0; i < bs->length; i++) { +- if (BIO_printf(mem, "%02X", bs->data[i]) <= 0) { ++ for (i = 0; i < ASN1_STRING_length(bs); i++) { ++ if (BIO_printf(mem, "%02X", ASN1_STRING_get0_data(bs)[i]) <= 0) { + if (dump) PRINT("ERROR:AINT: problems printf-ing to BIO"); + BIO_free(mem); + goto end; + } + } + if (dump) { BIO_PRINT(mem, "AINT:"); } +- if (bs->length == 0) PRINT("00"); ++ if (ASN1_STRING_length(bs) == 0) PRINT("00"); + } else { + if (dump) PRINT("ERROR:AINT: BAD INTEGER"); + } +@@ -1023,18 +1035,18 @@ int XrdCryptosslX509::FillUnknownExt(const unsigned char **pp, long length, bool + bs = d2i_ASN1_ENUMERATED(0, &opp, len+hl); + if (bs) { + if (dump) PRINT("AENU:"); +- if (bs->type == V_ASN1_NEG_ENUMERATED) ++ if (ASN1_STRING_type(bs) == V_ASN1_NEG_ENUMERATED) + if (dump) PRINT("-"); + BIO *mem = BIO_new(BIO_s_mem()); +- for (i = 0; i < bs->length; i++) { +- if (BIO_printf(mem, "%02X", bs->data[i]) <= 0) { ++ for (i = 0; i < ASN1_STRING_length(bs); i++) { ++ if (BIO_printf(mem, "%02X", ASN1_STRING_get0_data(bs)[i]) <= 0) { + if (dump) PRINT("ERROR:AENU: problems printf-ing to BIO"); + BIO_free(mem); + goto end; + } + } + if (dump) { BIO_PRINT(mem, "AENU:"); } +- if (bs->length == 0) PRINT("00"); ++ if (ASN1_STRING_length(bs) == 0) PRINT("00"); + } else { + if (dump) PRINT("ERROR:AENU: BAD ENUMERATED"); + } +diff --git a/src/XrdCrypto/XrdCryptosslX509Crl.cc b/src/XrdCrypto/XrdCryptosslX509Crl.cc +index 61ddaf83c..cc9f324bb 100644 +--- a/src/XrdCrypto/XrdCryptosslX509Crl.cc ++++ b/src/XrdCrypto/XrdCryptosslX509Crl.cc +@@ -105,7 +105,7 @@ XrdCryptosslX509Crl::XrdCryptosslX509Crl(XrdCryptoX509 *cacert) + + // Bio for exporting the extension + BIO *bext = BIO_new(BIO_s_mem()); +- ASN1_OBJECT *obj = X509_EXTENSION_get_object(crlext); ++ const ASN1_OBJECT *obj = X509_EXTENSION_get_object(crlext); + i2a_ASN1_OBJECT(bext, obj); + X509V3_EXT_print(bext, crlext, 0, 4); + // data length +diff --git a/src/XrdCrypto/XrdCryptosslgsiAux.cc b/src/XrdCrypto/XrdCryptosslgsiAux.cc +index 8f4b929c1..a5d20e1af 100644 +--- a/src/XrdCrypto/XrdCryptosslgsiAux.cc ++++ b/src/XrdCrypto/XrdCryptosslgsiAux.cc +@@ -165,12 +165,12 @@ bool XrdCryptosslProxyCertInfo(const void *extdata, int &pathlen, bool *haspolic + OBJ_obj2txt(s, sizeof(s), X509_EXTENSION_get_object(ext), 1); + + // Now extract the path length constraint, if any +- unsigned char *p = X509_EXTENSION_get_data(ext)->data; ++ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(ext)); + PROXY_CERT_INFO_EXTENSION *pci = 0; + if (!strcmp(s, gsiProxyCertInfo_OID)) +- pci = d2i_PROXY_CERT_INFO_EXTENSION(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(ext)->length); ++ pci = d2i_PROXY_CERT_INFO_EXTENSION(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(ext))); + else if (!strcmp(s, gsiProxyCertInfo_OLD_OID)) +- pci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(ext)->length); ++ pci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(ext))); + if (!pci) { + return 0; + } +@@ -208,12 +208,12 @@ void XrdCryptosslSetPathLenConstraint(void *extdata, int pathlen) + OBJ_obj2txt(s, sizeof(s), X509_EXTENSION_get_object(ext), 1); + + // Now extract the path length constraint, if any +- unsigned char *p = X509_EXTENSION_get_data(ext)->data; ++ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(ext)); + PROXY_CERT_INFO_EXTENSION *pci = 0; + if (!strcmp(s, gsiProxyCertInfo_OID)) +- pci = d2i_PROXY_CERT_INFO_EXTENSION(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(ext)->length); ++ pci = d2i_PROXY_CERT_INFO_EXTENSION(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(ext))); + else if (!strcmp(s, gsiProxyCertInfo_OLD_OID)) +- pci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(ext)->length); ++ pci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(ext))); + if (!pci) + return; + +@@ -419,16 +419,32 @@ int XrdCryptosslX509CreateProxy(const char *fnc, const char *fnk, + return -kErrPX_SetAttribute; + } + // Extract data in format for extension +- X509_EXTENSION_get_data(ext)->length = i2d_PROXY_CERT_INFO_EXTENSION(pci, 0); +- if (!(X509_EXTENSION_get_data(ext)->data = (unsigned char *)malloc(X509_EXTENSION_get_data(ext)->length+1))) { ++ int len = i2d_PROXY_CERT_INFO_EXTENSION(pci, 0); ++ unsigned char *data = (unsigned char *) malloc(len); ++ if (!data) { + PRINT("could not allocate data field for extension"); + return -kErrPX_NoResources; + } +- unsigned char *pp = X509_EXTENSION_get_data(ext)->data; ++ unsigned char *pp = data; + if ((i2d_PROXY_CERT_INFO_EXTENSION(pci, &pp)) <= 0) { + PRINT("problem converting data for extension"); + return -kErrPX_Error; + } ++ ASN1_OCTET_STRING *os = ASN1_OCTET_STRING_new(); ++ if (!os) { ++ PRINT("could not allocate data field for extension"); ++ return -kErrPX_NoResources; ++ } ++ if (ASN1_OCTET_STRING_set(os, data, len) == 0) { ++ PRINT("could not allocate data field for extension"); ++ return -kErrPX_NoResources; ++ } ++ free(data); ++ if (X509_EXTENSION_set_data(ext, os) == 0) { ++ PRINT("could not allocate data field for extension"); ++ return -kErrPX_NoResources; ++ } ++ ASN1_STRING_free(os); + // Create a stack + STACK_OF(X509_EXTENSION) *esk = sk_X509_EXTENSION_new_null(); + if (!esk) { +@@ -504,7 +520,11 @@ int XrdCryptosslX509CreateProxy(const char *fnc, const char *fnk, + } + + // First duplicate the extensions of the EE certificate ++#if OPENSSL_VERSION_NUMBER < 0x40000000L + X509_EXTENSION *xEECext = 0; ++#else ++ const X509_EXTENSION *xEECext = 0; ++#endif + int nEECext = X509_get_ext_count(xEEC); + DEBUG("number of extensions found in the original certificate: "<< nEECext); + int i = 0; +@@ -756,7 +776,11 @@ int XrdCryptosslX509CreateProxyReq(XrdCryptoX509 *xcpi, + } + // + // Get signature path depth from present proxy ++#if OPENSSL_VERSION_NUMBER < 0x40000000L + X509_EXTENSION *xpiext = 0; ++#else ++ const X509_EXTENSION *xpiext = 0; ++#endif + int npiext = X509_get_ext_count(xpi); + int i = 0; + bool haskeyusage = 0; +@@ -772,12 +796,12 @@ int XrdCryptosslX509CreateProxyReq(XrdCryptoX509 *xcpi, + // Get signature path depth from present proxy + if (!strcmp(s, gsiProxyCertInfo_OID) || + !strcmp(s, gsiProxyCertInfo_OLD_OID)) { +- unsigned char *p = X509_EXTENSION_get_data(xpiext)->data; ++ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(xpiext)); + PROXY_CERT_INFO_EXTENSION *inpci = 0; + if (!strcmp(s, gsiProxyCertInfo_OID)) +- inpci = d2i_PROXY_CERT_INFO_EXTENSION(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(xpiext)->length); ++ inpci = d2i_PROXY_CERT_INFO_EXTENSION(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(xpiext))); + else +- inpci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(xpiext)->length); ++ inpci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(xpiext))); + if (inpci && + inpci->pcPathLengthConstraint) + indepthlen = ASN1_INTEGER_get(inpci->pcPathLengthConstraint); +@@ -823,16 +847,32 @@ int XrdCryptosslX509CreateProxyReq(XrdCryptoX509 *xcpi, + return -kErrPX_NoResources; + } + // Extract data in format for extension +- X509_EXTENSION_get_data(ext.get())->length = i2d_PROXY_CERT_INFO_EXTENSION(pci.get(), 0); +- if (!(X509_EXTENSION_get_data(ext.get())->data = (unsigned char *)malloc(X509_EXTENSION_get_data(ext.get())->length+1))) { ++ int len = i2d_PROXY_CERT_INFO_EXTENSION(pci.get(), 0); ++ unsigned char *data = (unsigned char *) malloc(len); ++ if (!data) { + PRINT("could not allocate data field for extension"); + return -kErrPX_NoResources; + } +- unsigned char *pp = X509_EXTENSION_get_data(ext.get())->data; ++ unsigned char *pp = data; + if ((i2d_PROXY_CERT_INFO_EXTENSION(pci.get(), &pp)) <= 0) { + PRINT("problem converting data for extension"); + return -kErrPX_Error; + } ++ ASN1_OCTET_STRING *os = ASN1_OCTET_STRING_new(); ++ if (!os) { ++ PRINT("could not allocate data field for extension"); ++ return -kErrPX_NoResources; ++ } ++ if (ASN1_OCTET_STRING_set(os, data, len) == 0) { ++ PRINT("could not allocate data field for extension"); ++ return -kErrPX_NoResources; ++ } ++ free(data); ++ if (X509_EXTENSION_set_data(ext.get(), os) == 0) { ++ PRINT("could not allocate data field for extension"); ++ return -kErrPX_NoResources; ++ } ++ ASN1_STRING_free(os); + pci = nullptr; + + // Set extension name. +@@ -1030,7 +1070,11 @@ int XrdCryptosslX509SignProxyReq(XrdCryptoX509 *xcpi, XrdCryptoRSA *kcpi, + + // + // Get signature path depth from input proxy ++#if OPENSSL_VERSION_NUMBER < 0x40000000L + X509_EXTENSION *xpiext = 0, *xriext = 0; ++#else ++ const X509_EXTENSION *xpiext = 0, *xriext = 0; ++#endif + int npiext = X509_get_ext_count(xpi); + int i = 0; + bool haskeyusage = 0; +@@ -1038,17 +1082,17 @@ int XrdCryptosslX509SignProxyReq(XrdCryptoX509 *xcpi, XrdCryptoRSA *kcpi, + for (i = 0; i< npiext; i++) { + xpiext = X509_get_ext(xpi, i); + char s[256] = {0}; +- ASN1_OBJECT *obj = X509_EXTENSION_get_object(xpiext); ++ const ASN1_OBJECT *obj = X509_EXTENSION_get_object(xpiext); + if (obj) + OBJ_obj2txt(s, sizeof(s), obj, 1); + if (!strcmp(s, gsiProxyCertInfo_OID) || + !strcmp(s, gsiProxyCertInfo_OLD_OID)) { +- unsigned char *p = X509_EXTENSION_get_data(xpiext)->data; ++ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(xpiext)); + PROXY_CERT_INFO_EXTENSION *inpci = 0; + if (!strcmp(s, gsiProxyCertInfo_OID)) +- inpci = d2i_PROXY_CERT_INFO_EXTENSION(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(xpiext)->length); ++ inpci = d2i_PROXY_CERT_INFO_EXTENSION(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(xpiext))); + else +- inpci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(xpiext)->length); ++ inpci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(xpiext))); + if (inpci && + inpci->pcPathLengthConstraint) + indepthlen = ASN1_INTEGER_get(inpci->pcPathLengthConstraint); +@@ -1101,9 +1145,9 @@ int XrdCryptosslX509SignProxyReq(XrdCryptoX509 *xcpi, XrdCryptoRSA *kcpi, + // Get the content + int reqdepthlen = -1; + if (xriext) { +- unsigned char *p = X509_EXTENSION_get_data(xriext)->data; ++ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(xriext)); + PROXY_CERT_INFO_EXTENSION *reqpci = +- d2i_PROXY_CERT_INFO_EXTENSION(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(xriext)->length); ++ d2i_PROXY_CERT_INFO_EXTENSION(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(xriext))); + if (reqpci && + reqpci->pcPathLengthConstraint) + reqdepthlen = ASN1_INTEGER_get(reqpci->pcPathLengthConstraint); +@@ -1140,16 +1184,32 @@ int XrdCryptosslX509SignProxyReq(XrdCryptoX509 *xcpi, XrdCryptoRSA *kcpi, + return -kErrPX_NoResources; + } + // Extract data in format for extension +- X509_EXTENSION_get_data(ext.get())->length = i2d_PROXY_CERT_INFO_EXTENSION(pci.get(), 0); +- if (!(X509_EXTENSION_get_data(ext.get())->data = (unsigned char *)malloc(X509_EXTENSION_get_data(ext.get())->length+1))) { ++ int len = i2d_PROXY_CERT_INFO_EXTENSION(pci.get(), 0); ++ unsigned char *data = (unsigned char *) malloc(len); ++ if (!data) { + PRINT("could not allocate data field for extension"); + return -kErrPX_NoResources; + } +- unsigned char *pp = X509_EXTENSION_get_data(ext.get())->data; ++ unsigned char *pp = data; + if ((i2d_PROXY_CERT_INFO_EXTENSION(pci.get(), &pp)) <= 0) { + PRINT("problem converting data for extension"); + return -kErrPX_Error; + } ++ ASN1_OCTET_STRING *os = ASN1_OCTET_STRING_new(); ++ if (!os) { ++ PRINT("could not allocate data field for extension"); ++ return -kErrPX_NoResources; ++ } ++ if (ASN1_OCTET_STRING_set(os, data, len) == 0) { ++ PRINT("could not allocate data field for extension"); ++ return -kErrPX_NoResources; ++ } ++ free(data); ++ if (X509_EXTENSION_set_data(ext.get(), os) == 0) { ++ PRINT("could not allocate data field for extension"); ++ return -kErrPX_NoResources; ++ } ++ ASN1_STRING_free(os); + pci = nullptr; + + // Set extension name. +@@ -1215,7 +1275,11 @@ int XrdCryptosslX509GetVOMSAttr(XrdCryptoX509 *xcpi, XrdOucString &vat) + rc = 1; + bool getvat = 0; + // Go through the extensions ++#if OPENSSL_VERSION_NUMBER < 0x40000000L + X509_EXTENSION *xpiext = 0; ++#else ++ const X509_EXTENSION *xpiext = 0; ++#endif + int npiext = X509_get_ext_count(xpi); + int i = 0; + for (i = 0; i< npiext; i++) { +@@ -1227,8 +1291,8 @@ int XrdCryptosslX509GetVOMSAttr(XrdCryptoX509 *xcpi, XrdOucString &vat) + if (strcmp(s, XRDGSI_VOMS_ACSEQ_OID)) continue; + // This is the VOMS extension we are interested for + rc = 0; +- const unsigned char *pp = (const unsigned char *) X509_EXTENSION_get_data(xpiext)->data; +- long length = X509_EXTENSION_get_data(xpiext)->length; ++ const unsigned char *pp = ASN1_STRING_get0_data(X509_EXTENSION_get_data(xpiext)); ++ long length = ASN1_STRING_length(X509_EXTENSION_get_data(xpiext)); + int ret = XrdCryptosslX509FillVOMS(&pp, length, getvat, vat); + DEBUG("ret: " << ret << " - vat: " << vat); + } +@@ -1316,10 +1380,10 @@ int XrdCryptosslX509FillVOMS(const unsigned char **pp, + int i, printable = 1; + opp = op; + os = d2i_ASN1_OCTET_STRING(0, &opp, len + hl); +- if (os && os->length > 0) { +- opp = os->data; ++ if (os && ASN1_STRING_length(os) > 0) { ++ opp = ASN1_STRING_get0_data(os); + // Testing whether the octet string is printable +- for (i=0; ilength; i++) { ++ for (i=0; i < ASN1_STRING_length(os); i++) { + if (( (opp[i] < ' ') && (opp[i] != '\n') && + (opp[i] != '\r') && (opp[i] != '\t')) || (opp[i] > '~')) { + printable = 0; +@@ -1333,7 +1397,7 @@ int XrdCryptosslX509FillVOMS(const unsigned char **pp, + vat += (const char *)opp; + gotvat = 1; + } +- DEBUG("OBJS:" << (const char *)opp << " (len: "<length<<")"); ++ DEBUG("OBJS:" << (const char *)opp << " (len: " << ASN1_STRING_length(os) << ")"); + } + } + if (os) { +@@ -1385,11 +1449,19 @@ int XrdCryptosslX509CheckProxy3(XrdCryptoX509 *xcpi, XrdOucString &emsg) { + } + TRACE(ALL,"certificate has "<data; +- pci = d2i_PROXY_CERT_INFO_EXTENSION(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(ext)->length); ++ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(ext)); ++ pci = d2i_PROXY_CERT_INFO_EXTENSION(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(ext))); + } else { + PRINT("WARNING: multiple proxyCertInfo extensions found: taking the first"); + } +@@ -1408,8 +1480,8 @@ int XrdCryptosslX509CheckProxy3(XrdCryptoX509 *xcpi, XrdOucString &emsg) { + if (ext == 0) { + ext = xext; + // Now get the extension +- unsigned char *p = X509_EXTENSION_get_data(ext)->data; +- pci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(ext)->length); ++ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(ext)); ++ pci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(ext))); + } else { + PRINT("WARNING: multiple proxyCertInfo extensions found: taking the first"); + } +diff --git a/src/XrdTls/XrdTlsNotaryUtils.icc b/src/XrdTls/XrdTlsNotaryUtils.icc +index 44125d988..3ded4f993 100644 +--- a/src/XrdTls/XrdTlsNotaryUtils.icc ++++ b/src/XrdTls/XrdTlsNotaryUtils.icc +@@ -56,8 +56,8 @@ SOFTWARE. + */ + static HostnameValidationResult matches_common_name(const char *hostname, const X509 *server_cert) { + int common_name_loc = -1; +- X509_NAME_ENTRY *common_name_entry = NULL; +- ASN1_STRING *common_name_asn1 = NULL; ++ const X509_NAME_ENTRY *common_name_entry = NULL; ++ const ASN1_STRING *common_name_asn1 = NULL; + char *common_name_str = NULL; + + // Find the position of the CN field in the Subject field of the certificate +diff --git a/src/XrdVoms/XrdVomsFun.cc b/src/XrdVoms/XrdVomsFun.cc +index a4bc9b8b7..fe6e8ebb7 100644 +--- a/src/XrdVoms/XrdVomsFun.cc ++++ b/src/XrdVoms/XrdVomsFun.cc +@@ -110,7 +110,7 @@ XrdVomsFun::XrdVomsFun(XrdSysError &erp) + + // Function to convert X509_NAME into a one-line human readable string + // +-void XrdVomsFun::NameOneLine(X509_NAME *nm, XrdOucString &s) ++void XrdVomsFun::NameOneLine(const X509_NAME *nm, XrdOucString &s) + { + BIO *mbio = BIO_new(BIO_s_mem()); + X509_NAME_print_ex(mbio, nm, 0, XN_FLAG_COMPAT); +diff --git a/src/XrdVoms/XrdVomsFun.hh b/src/XrdVoms/XrdVomsFun.hh +index ff5df58ef..5c1129ab8 100644 +--- a/src/XrdVoms/XrdVomsFun.hh ++++ b/src/XrdVoms/XrdVomsFun.hh +@@ -65,7 +65,7 @@ int VOMSInit(const char *cfg); + private: + + void FmtExtract(XrdOucString &out, XrdOucString in, const char *tag); +-void NameOneLine(X509_NAME *nm, XrdOucString &s); ++void NameOneLine(const X509_NAME *nm, XrdOucString &s); + void FmtReplace(XrdSecEntity &ent); + + // These settings are configurable +-- +2.54.0 + diff --git a/0002-Add-catch-all-work-around-for-missing-gettid.patch b/0002-Add-catch-all-work-around-for-missing-gettid.patch deleted file mode 100644 index 0a208f7..0000000 --- a/0002-Add-catch-all-work-around-for-missing-gettid.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 0ef5b1a97d1ca0d8258384353165b8545463876a Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Mon, 20 Apr 2026 21:20:48 +0200 -Subject: [PATCH 2/6] Add catch-all work-around for missing gettid - -Possibly there are better solutions, but this is consistent with the -implementation in src/XrdSys/XrdSysPthread.cc ---- - src/XrdClHttp/XrdClHttpUtil.cc | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/src/XrdClHttp/XrdClHttpUtil.cc b/src/XrdClHttp/XrdClHttpUtil.cc -index a1597b200..7bedb4373 100644 ---- a/src/XrdClHttp/XrdClHttpUtil.cc -+++ b/src/XrdClHttp/XrdClHttpUtil.cc -@@ -86,16 +86,18 @@ struct WaitingForBroker { - namespace { - - pid_t getthreadid() { --#ifdef __APPLE__ -+#if defined(__APPLE__) - uint64_t pth_threadid; - pthread_threadid_np(pthread_self(), &pth_threadid); - return pth_threadid; --#else -+#elif defined(__linux__) - // NOTE: glibc 2.30 finally provides a gettid() wrapper; however, - // we currently support RHEL 8, which is based on glibc 2.28. Until - // we drop that platform, it's easier to do the syscall directly on Linux - // instead of additional ifdef calls. - return syscall(SYS_gettid); -+#else -+ return getpid(); - #endif - } - --- -2.53.0 - diff --git a/0002-XrdCrypto-Preserve-ABI.patch b/0002-XrdCrypto-Preserve-ABI.patch new file mode 100644 index 0000000..02aa7a5 --- /dev/null +++ b/0002-XrdCrypto-Preserve-ABI.patch @@ -0,0 +1,30 @@ +From 09a98373bc442d515f347593c113842733ea60b7 Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Sat, 23 May 2026 20:59:04 +0200 +Subject: [PATCH 2/2] [XrdCrypto] Preserve ABI + +Add back now unused non-const version of function +--- + src/XrdCrypto/XrdCryptosslAux.cc | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/XrdCrypto/XrdCryptosslAux.cc b/src/XrdCrypto/XrdCryptosslAux.cc +index a44283985..e0ce35285 100644 +--- a/src/XrdCrypto/XrdCryptosslAux.cc ++++ b/src/XrdCrypto/XrdCryptosslAux.cc +@@ -755,3 +755,12 @@ void XrdCryptosslNameOneLine(const X509_NAME *nm, XrdOucString &s) + // Done + return; + } ++ ++//____________________________________________________________________________ ++void XrdCryptosslNameOneLine(X509_NAME *nm, XrdOucString &s) ++{ ++ // Copy of above function with non-const first argument ++ // This function is unused -- only added to preserve old ABI ++ // Can be removed if soname changes ++ XrdCryptosslNameOneLine(const_cast(nm), s); ++} +-- +2.54.0 + diff --git a/0003-Also-check-for-GNU-in-statx.patch b/0003-Also-check-for-GNU-in-statx.patch deleted file mode 100644 index 487ec14..0000000 --- a/0003-Also-check-for-GNU-in-statx.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 0492078b60e7ffc50ee8fd2282b5960e264a17b4 Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Mon, 20 Apr 2026 21:53:38 +0200 -Subject: [PATCH 3/6] Also check for GNU in statx - ---- - src/XrdSys/XrdSysStatx.hh | 2 +- - tests/XrdSysTests/XrdSysStatxTests.cc | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/XrdSys/XrdSysStatx.hh b/src/XrdSys/XrdSysStatx.hh -index 13b4894e0..dfaa3f7be 100644 ---- a/src/XrdSys/XrdSysStatx.hh -+++ b/src/XrdSys/XrdSysStatx.hh -@@ -35,7 +35,7 @@ - #include - #include - --#ifdef __linux__ -+#if defined(__linux__) || defined(__GNU__) - #include - using XrdSysStatx = struct statx; - #define HAVE_STATX -diff --git a/tests/XrdSysTests/XrdSysStatxTests.cc b/tests/XrdSysTests/XrdSysStatxTests.cc -index d2d7e729f..23d2aaac6 100644 ---- a/tests/XrdSysTests/XrdSysStatxTests.cc -+++ b/tests/XrdSysTests/XrdSysStatxTests.cc -@@ -27,7 +27,7 @@ TEST_F(XrdSysStatxTests, Stat2StatxBasicFields) { - - EXPECT_EQ(stx.stx_mask, (uint32_t)STATX_BASIC_STATS); - --#ifdef __linux__ -+#if defined(__linux__) || defined(__GNU__) - EXPECT_EQ(stx.stx_mode, (uint16_t)(S_IFREG | 0755)); - EXPECT_EQ(stx.stx_nlink, (uint32_t)3); - EXPECT_EQ(stx.stx_uid, (uint32_t)1000); --- -2.53.0 - diff --git a/0004-Fix-kerberos-tests-when-usr-sbin-is-not-in-PATH.patch b/0004-Fix-kerberos-tests-when-usr-sbin-is-not-in-PATH.patch deleted file mode 100644 index 67dd202..0000000 --- a/0004-Fix-kerberos-tests-when-usr-sbin-is-not-in-PATH.patch +++ /dev/null @@ -1,45 +0,0 @@ -From e079b7cb1af1410ed15c7958e089ece6b36c5900 Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Mon, 20 Apr 2026 21:55:56 +0200 -Subject: [PATCH 4/6] Fix kerberos tests when /usr/sbin is not in PATH - ---- - tests/krb5/kerberos.sh | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/tests/krb5/kerberos.sh b/tests/krb5/kerberos.sh -index b4af5e102..5b6405cd9 100755 ---- a/tests/krb5/kerberos.sh -+++ b/tests/krb5/kerberos.sh -@@ -36,16 +36,16 @@ function setup() { - popd >/dev/null || exit 1 - - # Create the KDC database -- kdb5_util create -s -r XROOTD.ORG -P xrootd -+ /usr/sbin/kdb5_util create -s -r XROOTD.ORG -P xrootd - - # Start the KDC daemons -- krb5kdc -P "${PWD}"/krb5kdc.pid -+ /usr/sbin/krb5kdc -P "${PWD}"/krb5kdc.pid - - # Not really needed, since we use kadmin.local - # kadmind -P ${PWD}/kadmind.pid - - # Add principals for the server and client to KDC database -- kadmin.local -r XROOTD.ORG <<-EOF -+ /usr/sbin/kadmin.local -r XROOTD.ORG <<-EOF - add_principal -randkey -kvno 1 host/localhost@XROOTD.ORG - ktadd -k krb5.keytab host/localhost - add_principal xrootd@XROOTD.ORG -@@ -54,7 +54,7 @@ function setup() { - EOF - - # Display KDC database entries -- kdb5_util tabdump -o - keyinfo -+ /usr/sbin/kdb5_util tabdump -o - keyinfo - - # Display contents of server keytab - klist -kte krb5.keytab --- -2.53.0 - diff --git a/0005-Fix-typo-conent-content.patch b/0005-Fix-typo-conent-content.patch deleted file mode 100644 index 3307ead..0000000 --- a/0005-Fix-typo-conent-content.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 2c5be32cc7afed2c3f67a1bfbc25877f5233cb11 Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Mon, 20 Apr 2026 22:04:23 +0200 -Subject: [PATCH 5/6] =?UTF-8?q?Fix=20typo=20conent=20=E2=86=92=20content?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - ---- - src/XrdClHttp/XrdClHttpFile.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/XrdClHttp/XrdClHttpFile.cc b/src/XrdClHttp/XrdClHttpFile.cc -index 3a15470e8..196e4d99c 100644 ---- a/src/XrdClHttp/XrdClHttpFile.cc -+++ b/src/XrdClHttp/XrdClHttpFile.cc -@@ -557,7 +557,7 @@ File::Fcntl(const XrdCl::Buffer &arg, XrdCl::ResponseHandler *handler, - } - } - XrdCl::Buffer *respBuff = new XrdCl::Buffer(); -- m_logger->Debug(kLogXrdClHttp, "Fcntl conent %s", xatt.dump().c_str()); -+ m_logger->Debug(kLogXrdClHttp, "Fcntl content %s", xatt.dump().c_str()); - respBuff->FromString(xatt.dump()); - obj->Set(respBuff); - } --- -2.53.0 - diff --git a/0006-Change-file-to-avoid-sed-during-install.patch b/0006-Change-file-to-avoid-sed-during-install.patch deleted file mode 100644 index fa7fb1f..0000000 --- a/0006-Change-file-to-avoid-sed-during-install.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 216526c32b894a5bad7b85897decef711f121018 Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Mon, 20 Apr 2026 22:42:06 +0200 -Subject: [PATCH 6/6] Change file to avoid sed during install - ---- - config/xrootd-http.cfg | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/config/xrootd-http.cfg b/config/xrootd-http.cfg -index cb707bf84..341f3316c 100644 ---- a/config/xrootd-http.cfg -+++ b/config/xrootd-http.cfg -@@ -33,7 +33,7 @@ all.pidpath /run/xrootd - # In order to start the xrdhttp.socket run: - # systemctl start xrdhttp@http.socket - # --xrd.protocol XrdHttp:80 /usr/lib64/libXrdHttp.so -+xrd.protocol XrdHttp:80 libXrdHttp.so - # More configuration files can be added in /etc/xrootd/config.d/ - # For example /etc/xrootd/config.d/10-mygrid.cfg and - # /etc/xrootd/config.d/98-mysite-specifics.cfg --- -2.53.0 - diff --git a/sources b/sources index a0d612c..8c2cb71 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (xrootd-6.0.0.tar.gz) = 1fac24c56464e76c104deabcef0a8910dbdc18f62d93275bf1048142beb0453e05aecddaaf41abe9d183c9bafb015067994a15ae0ffeecdc2875626791d76905 +SHA512 (xrootd-6.0.2.tar.gz) = 29fe0138b06e03210ece9c3130785967016f1e076be888c1f3147e8c9ade7e506eb2047364c76f251bbae3bf8a067abc16f6929c3d8e7f615ee41c8f6f8a8263 diff --git a/xrootd.spec b/xrootd.spec index 78a689d..88f128a 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -13,23 +13,23 @@ Name: xrootd Epoch: 1 -Version: 6.0.0 +Version: 6.0.2 Release: 1%{?dist} Summary: Extended ROOT file server -License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib +License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib AND Apache-2.0 AND MPL-2.0 URL: https://xrootd.web.cern.ch Source0: %{url}/download/v%{version}/%{name}-%{version}.tar.gz Source1: %{name}-sysusers.conf -# https://github.com/xrootd/xrootd/pull/2769 -Patch0: 0001-Add-include-XrdSys-XrdSysPlatform.hh-for-MAXPATHLEN.patch -Patch1: 0002-Add-catch-all-work-around-for-missing-gettid.patch -Patch2: 0003-Also-check-for-GNU-in-statx.patch -Patch3: 0004-Fix-kerberos-tests-when-usr-sbin-is-not-in-PATH.patch -Patch4: 0005-Fix-typo-conent-content.patch -Patch5: 0006-Change-file-to-avoid-sed-during-install.patch # Unbundle tinyxml library -Patch6: 0001-Unbundle-tinyxml.patch +Patch0: 0001-Unbundle-tinyxml.patch +# Adapt to OpenSSL 4 +# https://github.com/xrootd/xrootd/pull/2802 +Patch1: 0001-XrdCrypto-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch +Patch2: 0002-XrdCrypto-Preserve-ABI.patch +# Backport fix from upstream +# https://github.com/xrootd/xrootd/pull/2799 +Patch3: 0001-XrdClHttp-Fix-bug-preventing-the-configuration-of-th.patch BuildRequires: cmake BuildRequires: gcc-c++ @@ -241,6 +241,7 @@ a subset of the namespace to an external issuer. %package ceph Summary: XRootD plugin for interfacing with the Ceph storage platform Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release} +Requires: %{name}-server-libs%{?_isa} = %{epoch}:%{version}-%{release} %description ceph The xrootd-ceph is an OSS layer plugin for the XRootD server for @@ -270,9 +271,6 @@ This package contains the API documentation of the xrootd libraries. %patch -P1 -p1 %patch -P2 -p1 %patch -P3 -p1 -%patch -P4 -p1 -%patch -P5 -p1 -%patch -P6 -p1 %build %cmake \ @@ -408,28 +406,14 @@ done touch testfile if ( setfattr -n user.testattr -v testvalue testfile ) ; then - %ctest -- -E XRootD::badredir +%ifarch %{ix86} %{arm} + %ctest -- -E 'XRootD::badredir|XRootD::posix' +%else + %ctest -- -E 'XRootD::badredir' +%endif else echo "Extended file attributes not supported by file system" - echo "Don't run tests that require them" - exclude="\ -XrdCl::FileCopyTest|\ -XrdCl::FileSystemTest.PlugInTest|\ -XrdCl::FileSystemTest.ServerQueryTest|\ -XrdCl::FileSystemTest.XAttrTest|\ -XrdCl::FileTest.XAttrTest|\ -XrdCl::LocalFileHandlerTest.XAttrTest|\ -XrdCl::ThreadingTest|\ -XrdCl::WorkflowTest.CheckpointTest|\ -XrdCl::WorkflowTest.XAttrWorkflowTest|\ -XrdEc::XrdEcTests|\ -XRootD::authenticated_cluster::test|\ -XRootD::badredir|\ -XRootD::cluster::test|\ -XRootD::http::test|\ -XRootD::posix::test|\ -XRootD::tpc::test" - %ctest -- -E $exclude + echo "*** NOT RUNNING TESTS ***" fi rm testfile @@ -681,6 +665,11 @@ fi %doc %{_pkgdocdir} %changelog +* Thu May 21 2026 Mattias Ellert - 1:6.0.2-1 +- Update to version 6.0.2 +- Adapt to OpenSSL 4.0 +- Drop patches accepted upstream + * Sat Apr 11 2026 Mattias Ellert - 1:6.0.0-1 - Update to version 6.0.0 From 14e91e97a2f6cef3ef540100a9001935b33e1e04 Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Mon, 1 Jun 2026 06:16:08 +0200 Subject: [PATCH 03/14] Update to version 5.9.4 --- sources | 2 +- xrootd.spec | 36 ++++++++++++------------------------ 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/sources b/sources index 55d9300..316c984 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (xrootd-5.9.2.tar.gz) = 4d904ba6e10dc4f6b8a3e3bfa306744376c0428f2ed0754d913dfaa6339a46d75711c53b44286d532fe6a0f0db6f1dbeaa6d2f723dc4a556b31c7c691e3f90c3 +SHA512 (xrootd-5.9.4.tar.gz) = 9fa2b92d53f2897163da203b7fb949b55d79444439b2a305af1a5f2a2a4ff40917c089c5db67dabb48a9b37d8a69e892e9418b977060eb2bbd42f98316d2beca diff --git a/xrootd.spec b/xrootd.spec index 7ade4a9..0e65949 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -13,10 +13,10 @@ Name: xrootd Epoch: 1 -Version: 5.9.2 +Version: 5.9.4 Release: 1%{?dist} Summary: Extended ROOT file server -License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib +License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib AND Apache-2.0 AND MPL-2.0 URL: https://xrootd.web.cern.ch Source0: %{url}/download/v%{version}/%{name}-%{version}.tar.gz Source1: %{name}-sysusers.conf @@ -35,8 +35,6 @@ BuildRequires: openssl-devel BuildRequires: perl-generators BuildRequires: readline-devel BuildRequires: zlib-devel -BuildRequires: doxygen -BuildRequires: graphviz BuildRequires: selinux-policy-devel BuildRequires: systemd-rpm-macros BuildRequires: systemd-devel @@ -44,7 +42,6 @@ BuildRequires: python3-devel BuildRequires: python3-pip BuildRequires: python3-setuptools BuildRequires: python3-wheel -BuildRequires: python3-sphinx BuildRequires: json-c-devel BuildRequires: libmacaroons-devel BuildRequires: libuuid-devel @@ -59,6 +56,10 @@ BuildRequires: libradosstriper-devel %ifnarch %{ix86} BuildRequires: isa-l-devel %endif +# For documentation +BuildRequires: doxygen +BuildRequires: graphviz +BuildRequires: python3-sphinx # For tests BuildRequires: attr BuildRequires: curl @@ -236,6 +237,7 @@ with HTTP repositories. %package ceph Summary: XRootD plugin for interfacing with the Ceph storage platform Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release} +Requires: %{name}-server-libs%{?_isa} = %{epoch}:%{version}-%{release} %description ceph The xrootd-ceph is an OSS layer plugin for the XRootD server for @@ -358,6 +360,7 @@ mkdir -p %{buildroot}%{_sysconfdir}/%{name}/config.d mkdir -p %{buildroot}%{_localstatedir}/log/%{name} mkdir -p %{buildroot}%{_localstatedir}/spool/%{name} +mkdir -p %{buildroot}%{_rundir}/%{name} mkdir -p %{buildroot}%{_sysconfdir}/logrotate.d install -m 644 -p packaging/common/%{name}.logrotate \ @@ -398,25 +401,7 @@ if ( setfattr -n user.testattr -v testvalue testfile ) ; then %ctest -- -E XRootD::badredir else echo "Extended file attributes not supported by file system" - echo "Don't run tests that require them" - exclude="\ -XrdCl::FileCopyTest|\ -XrdCl::FileSystemTest.PlugInTest|\ -XrdCl::FileSystemTest.ServerQueryTest|\ -XrdCl::FileSystemTest.XAttrTest|\ -XrdCl::FileTest.XAttrTest|\ -XrdCl::LocalFileHandlerTest.XAttrTest|\ -XrdCl::ThreadingTest|\ -XrdCl::WorkflowTest.CheckpointTest|\ -XrdCl::WorkflowTest.XAttrWorkflowTest|\ -XrdEc::XrdEcTests|\ -XRootD::authenticated_cluster::test|\ -XRootD::badredir|\ -XRootD::cluster::test|\ -XRootD::http::test|\ -XRootD::posix::test|\ -XRootD::tpc::test" - %ctest -- -E $exclude + echo "*** NOT RUNNING TESTS ***" fi rm testfile @@ -670,6 +655,9 @@ fi %doc %{_pkgdocdir} %changelog +* Mon Jun 01 2026 Mattias Ellert - 1:5.9.4-1 +- Update to version 5.9.4 + * Fri Mar 27 2026 Mattias Ellert - 1:5.9.2-1 - Update to version 5.9.2 - Drop patches accepted upstream or previously backported From c0cfe0cb194b7e79052a464eeb97433341acc61b Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Tue, 2 Jun 2026 13:02:41 +0200 Subject: [PATCH 04/14] Update to version 6.0.3 --- ...g-preventing-the-configuration-of-th.patch | 28 ------------------- sources | 2 +- xrootd.spec | 9 +++--- 3 files changed, 5 insertions(+), 34 deletions(-) delete mode 100644 0001-XrdClHttp-Fix-bug-preventing-the-configuration-of-th.patch diff --git a/0001-XrdClHttp-Fix-bug-preventing-the-configuration-of-th.patch b/0001-XrdClHttp-Fix-bug-preventing-the-configuration-of-th.patch deleted file mode 100644 index 9526c32..0000000 --- a/0001-XrdClHttp-Fix-bug-preventing-the-configuration-of-th.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 71ea4b5b2c68937500f4c7b70a9d775781776eb5 Mon Sep 17 00:00:00 2001 -From: Brian Bockelman -Date: Thu, 21 May 2026 08:44:03 -0500 -Subject: [PATCH] [XrdClHttp] Fix bug preventing the configuration of threads - -Appears a prior refactoring caused the thread configuration to use -the wrong variable, causing 8 worker threads to be used regardless -of the current configuration. ---- - src/XrdClHttp/XrdClHttpFactory.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/XrdClHttp/XrdClHttpFactory.cc b/src/XrdClHttp/XrdClHttpFactory.cc -index 81413eff4..08d8ef8bd 100644 ---- a/src/XrdClHttp/XrdClHttpFactory.cc -+++ b/src/XrdClHttp/XrdClHttpFactory.cc -@@ -194,7 +194,7 @@ Factory::Initialize() - auto &cache = XrdClHttp::VerbsCache::Instance(); - - // Startup curl workers after we've set the configs to avoid race conditions -- for (unsigned idx=0; idx(m_queue, cache, m_log); - auto wkp = wk.get(); - std::thread t(XrdClHttp::CurlWorker::RunStatic, wkp); --- -2.54.0 - diff --git a/sources b/sources index 8c2cb71..21816ab 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (xrootd-6.0.2.tar.gz) = 29fe0138b06e03210ece9c3130785967016f1e076be888c1f3147e8c9ade7e506eb2047364c76f251bbae3bf8a067abc16f6929c3d8e7f615ee41c8f6f8a8263 +SHA512 (xrootd-6.0.3.tar.gz) = 9f0517dcecc679f5aa385831184c9eb93ad7ad2d42bda1340a9cada7f444998fed0a212738142beaf3de6c2f26670137839ca48ca9ac5ab7d5834feb5d309aa8 diff --git a/xrootd.spec b/xrootd.spec index 88f128a..11d07d4 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -13,7 +13,7 @@ Name: xrootd Epoch: 1 -Version: 6.0.2 +Version: 6.0.3 Release: 1%{?dist} Summary: Extended ROOT file server License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib AND Apache-2.0 AND MPL-2.0 @@ -27,9 +27,6 @@ Patch0: 0001-Unbundle-tinyxml.patch # https://github.com/xrootd/xrootd/pull/2802 Patch1: 0001-XrdCrypto-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch Patch2: 0002-XrdCrypto-Preserve-ABI.patch -# Backport fix from upstream -# https://github.com/xrootd/xrootd/pull/2799 -Patch3: 0001-XrdClHttp-Fix-bug-preventing-the-configuration-of-th.patch BuildRequires: cmake BuildRequires: gcc-c++ @@ -270,7 +267,6 @@ This package contains the API documentation of the xrootd libraries. %patch -P0 -p1 %patch -P1 -p1 %patch -P2 -p1 -%patch -P3 -p1 %build %cmake \ @@ -665,6 +661,9 @@ fi %doc %{_pkgdocdir} %changelog +* Tue Jun 02 2026 Mattias Ellert - 1:6.0.3-1 +- Update to version 6.0.3 + * Thu May 21 2026 Mattias Ellert - 1:6.0.2-1 - Update to version 6.0.2 - Adapt to OpenSSL 4.0 From 8597a43e9496f24092ab3f544f604f67299453b3 Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Tue, 2 Jun 2026 16:57:55 +0200 Subject: [PATCH 05/14] Update to version 5.9.5 --- sources | 2 +- xrootd.spec | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/sources b/sources index 316c984..d240694 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (xrootd-5.9.4.tar.gz) = 9fa2b92d53f2897163da203b7fb949b55d79444439b2a305af1a5f2a2a4ff40917c089c5db67dabb48a9b37d8a69e892e9418b977060eb2bbd42f98316d2beca +SHA512 (xrootd-5.9.5.tar.gz) = 74829f253d34a801cff585c28340dd42cb77eea94cd456243d788e59c3d8ac6fe72a016f82bc56308a59974eba9519cdc087829763c64d5b0b9ba940d2d2eb94 diff --git a/xrootd.spec b/xrootd.spec index 0e65949..a05c14a 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -13,7 +13,7 @@ Name: xrootd Epoch: 1 -Version: 5.9.4 +Version: 5.9.5 Release: 1%{?dist} Summary: Extended ROOT file server License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib AND Apache-2.0 AND MPL-2.0 @@ -655,6 +655,9 @@ fi %doc %{_pkgdocdir} %changelog +* Tue Jun 02 2026 Mattias Ellert - 1:5.9.5-1 +- Update to version 5.9.5 + * Mon Jun 01 2026 Mattias Ellert - 1:5.9.4-1 - Update to version 5.9.4 From ecd1ba1adf318a6858ad0e9c29a71b1aad645c9a Mon Sep 17 00:00:00 2001 From: Python Maint Date: Fri, 5 Jun 2026 00:05:44 +0200 Subject: [PATCH 06/14] Rebuilt for Python 3.15 --- xrootd.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xrootd.spec b/xrootd.spec index 11d07d4..493ec25 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -14,7 +14,7 @@ Name: xrootd Epoch: 1 Version: 6.0.3 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Extended ROOT file server License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib AND Apache-2.0 AND MPL-2.0 URL: https://xrootd.web.cern.ch @@ -661,6 +661,9 @@ fi %doc %{_pkgdocdir} %changelog +* Thu Jun 04 2026 Python Maint - 1:6.0.3-2 +- Rebuilt for Python 3.15 + * Tue Jun 02 2026 Mattias Ellert - 1:6.0.3-1 - Update to version 6.0.3 From 11db6b2e2b7b84207e2a1f4b0c41336740445178 Mon Sep 17 00:00:00 2001 From: Yaakov Selkowitz Date: Fri, 12 Jun 2026 20:09:07 -0400 Subject: [PATCH 07/14] Rebuilt for openssl 4.0 --- xrootd.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xrootd.spec b/xrootd.spec index 493ec25..9215d80 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -14,7 +14,7 @@ Name: xrootd Epoch: 1 Version: 6.0.3 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Extended ROOT file server License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib AND Apache-2.0 AND MPL-2.0 URL: https://xrootd.web.cern.ch @@ -661,6 +661,9 @@ fi %doc %{_pkgdocdir} %changelog +* Sat Jun 13 2026 Yaakov Selkowitz - 1:6.0.3-3 +- Rebuilt for openssl 4.0 + * Thu Jun 04 2026 Python Maint - 1:6.0.3-2 - Rebuilt for Python 3.15 From fac6715ea9dd0e1faf8422f146d1275eeed6d0e7 Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Wed, 24 Jun 2026 07:04:28 +0200 Subject: [PATCH 08/14] Update to version 6.1.0 Drop patches accepted upstream --- ...-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch | 566 ------------------ 0002-XrdCrypto-Preserve-ABI.patch | 30 - sources | 2 +- xrootd.spec | 16 +- 4 files changed, 9 insertions(+), 605 deletions(-) delete mode 100644 0001-XrdCrypto-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch delete mode 100644 0002-XrdCrypto-Preserve-ABI.patch diff --git a/0001-XrdCrypto-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch b/0001-XrdCrypto-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch deleted file mode 100644 index e46ad9e..0000000 --- a/0001-XrdCrypto-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch +++ /dev/null @@ -1,566 +0,0 @@ -From 534e1aa2efd8e59271d2410dc4a4d33ab7bc8ed9 Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Sat, 23 May 2026 18:57:54 +0200 -Subject: [PATCH 1/2] [XrdCrypto/XrdTls/XrdVoms] Adapt to OpenSSL 4.0 - ---- - src/XrdCrypto/XrdCryptosslAux.cc | 6 +- - src/XrdCrypto/XrdCryptosslAux.hh | 2 +- - src/XrdCrypto/XrdCryptosslX509.cc | 48 +++++---- - src/XrdCrypto/XrdCryptosslX509Crl.cc | 2 +- - src/XrdCrypto/XrdCryptosslgsiAux.cc | 140 ++++++++++++++++++++------- - src/XrdTls/XrdTlsNotaryUtils.icc | 4 +- - src/XrdVoms/XrdVomsFun.cc | 2 +- - src/XrdVoms/XrdVomsFun.hh | 2 +- - 8 files changed, 145 insertions(+), 61 deletions(-) - -diff --git a/src/XrdCrypto/XrdCryptosslAux.cc b/src/XrdCrypto/XrdCryptosslAux.cc -index 3893bc2b4..a44283985 100644 ---- a/src/XrdCrypto/XrdCryptosslAux.cc -+++ b/src/XrdCrypto/XrdCryptosslAux.cc -@@ -691,13 +691,13 @@ time_t XrdCryptosslASN1toUTC(const ASN1_TIME *tsn1) - // Our result is in agreement with 'date +%s`. - struct tm ltm; - char zz; -- if ((sscanf((const char *)(tsn1->data), -+ if ((sscanf((const char *) ASN1_STRING_get0_data(tsn1), - "%02d%02d%02d%02d%02d%02d%c", - &(ltm.tm_year), &(ltm.tm_mon), &(ltm.tm_mday), - &(ltm.tm_hour), &(ltm.tm_min), &(ltm.tm_sec), - &zz) != 7) || (zz != 'Z')) { - // Try GeneralizedTime -- if ((sscanf((const char *)(tsn1->data), -+ if ((sscanf((const char *) ASN1_STRING_get0_data(tsn1), - "%04d%02d%02d%02d%02d%02d%c", - &(ltm.tm_year), &(ltm.tm_mon), &(ltm.tm_mday), - &(ltm.tm_hour), &(ltm.tm_min), &(ltm.tm_sec), -@@ -733,7 +733,7 @@ time_t XrdCryptosslASN1toUTC(const ASN1_TIME *tsn1) - } - - //____________________________________________________________________________ --void XrdCryptosslNameOneLine(X509_NAME *nm, XrdOucString &s) -+void XrdCryptosslNameOneLine(const X509_NAME *nm, XrdOucString &s) - { - // Function to convert X509_NAME into a one-line human readable string - -diff --git a/src/XrdCrypto/XrdCryptosslAux.hh b/src/XrdCrypto/XrdCryptosslAux.hh -index 36f3aad1b..de852be3f 100644 ---- a/src/XrdCrypto/XrdCryptosslAux.hh -+++ b/src/XrdCrypto/XrdCryptosslAux.hh -@@ -74,7 +74,7 @@ int XrdCryptosslX509ParseStack(XrdTlsPeerCerts* pc, XrdCryptoX509Chain *chain); - time_t XrdCryptosslASN1toUTC(const ASN1_TIME *tsn1); - - // Function to convert X509_NAME into a one-line human readable string --void XrdCryptosslNameOneLine(X509_NAME *nm, XrdOucString &s); -+void XrdCryptosslNameOneLine(const X509_NAME *nm, XrdOucString &s); - - // - // X509 proxy auxilliary functions -diff --git a/src/XrdCrypto/XrdCryptosslX509.cc b/src/XrdCrypto/XrdCryptosslX509.cc -index bcc79c89c..d9d2b182f 100644 ---- a/src/XrdCrypto/XrdCryptosslX509.cc -+++ b/src/XrdCrypto/XrdCryptosslX509.cc -@@ -340,7 +340,11 @@ void XrdCryptosslX509::CertType() - - bool done = 0; - // Check the extensions -+#if OPENSSL_VERSION_NUMBER < 0x40000000L - X509_EXTENSION *ext = 0; -+#else -+ const X509_EXTENSION *ext = 0; -+#endif - int idx = -1; - - // For CAs we are looking for a "basicConstraints" -@@ -684,7 +688,11 @@ XrdCryptoX509data XrdCryptosslX509::GetExtension(const char *oid) - - // Loop to identify the one we would like - int i = 0; -+#if OPENSSL_VERSION_NUMBER < 0x40000000L - X509_EXTENSION *wext = 0; -+#else -+ const X509_EXTENSION *wext = 0; -+#endif - for (i = 0; i< numext; i++) { - wext = X509_get_ext(cert, i); - if (usenid) { -@@ -821,7 +829,11 @@ int XrdCryptosslX509::DumpExtensions(bool dumpunknown) - - rc = 1; - // Go through the extensions -+#if OPENSSL_VERSION_NUMBER < 0x40000000L - X509_EXTENSION *xpiext = 0; -+#else -+ const X509_EXTENSION *xpiext = 0; -+#endif - int npiext = X509_get_ext_count(xpi); - PRINT("found "<data; -- long length = X509_EXTENSION_get_data(xpiext)->length; -+ const unsigned char *pp = ASN1_STRING_get0_data(X509_EXTENSION_get_data(xpiext)); -+ long length = ASN1_STRING_length(X509_EXTENSION_get_data(xpiext)); - int ret = FillUnknownExt(&pp, length, dumpunknown); - PRINT("ret: " << ret); - } -@@ -957,10 +969,10 @@ int XrdCryptosslX509::FillUnknownExt(const unsigned char **pp, long length, bool - int i, printable = 1; - opp = op; - os = d2i_ASN1_OCTET_STRING(0, &opp, len + hl); -- if (os && os->length > 0) { -- opp = os->data; -+ if (os && ASN1_STRING_length(os) > 0) { -+ opp = ASN1_STRING_get0_data(os); - /* testing whether the octet string is * printable */ -- for (i=0; ilength; i++) { -+ for (i=0; i < ASN1_STRING_length(os); i++) { - if (( (opp[i] < ' ') && (opp[i] != '\n') && - (opp[i] != '\r') && (opp[i] != '\t')) || (opp[i] > '~')) { - printable = 0; -@@ -969,16 +981,16 @@ int XrdCryptosslX509::FillUnknownExt(const unsigned char **pp, long length, bool - } - if (printable) { - /* printable string */ -- char *s = new char[os->length + 1]; -- memcpy(s, opp, os->length); -- s[os->length] = 0; -- if (dump) PRINT("OBJS:" << s << " (len: "<length<<")"); -+ char *s = new char[ASN1_STRING_length(os) + 1]; -+ memcpy(s, opp, ASN1_STRING_length(os)); -+ s[ASN1_STRING_length(os)] = 0; -+ if (dump) PRINT("OBJS:" << s << " (len: " << ASN1_STRING_length(os) << ")"); - delete [] s; - } else { - /* print the normal dump */ - if (!nl) PRINT("OBJS:"); - BIO *mem = BIO_new(BIO_s_mem()); -- if (BIO_dump_indent(mem, (const char *)opp, os->length, dump_indent) <= 0) { -+ if (BIO_dump_indent(mem, (const char *)opp, ASN1_STRING_length(os), dump_indent) <= 0) { - if (dump) PRINT("ERROR:OBJS: problems dumping to BIO"); - BIO_free(mem); - goto end; -@@ -999,18 +1011,18 @@ int XrdCryptosslX509::FillUnknownExt(const unsigned char **pp, long length, bool - bs = d2i_ASN1_INTEGER(0, &opp, len+hl); - if (bs) { - if (dump) PRINT("AINT:"); -- if (bs->type == V_ASN1_NEG_INTEGER) -+ if (ASN1_STRING_type(bs) == V_ASN1_NEG_INTEGER) - if (dump) PRINT("-"); - BIO *mem = BIO_new(BIO_s_mem()); -- for (i = 0; i < bs->length; i++) { -- if (BIO_printf(mem, "%02X", bs->data[i]) <= 0) { -+ for (i = 0; i < ASN1_STRING_length(bs); i++) { -+ if (BIO_printf(mem, "%02X", ASN1_STRING_get0_data(bs)[i]) <= 0) { - if (dump) PRINT("ERROR:AINT: problems printf-ing to BIO"); - BIO_free(mem); - goto end; - } - } - if (dump) { BIO_PRINT(mem, "AINT:"); } -- if (bs->length == 0) PRINT("00"); -+ if (ASN1_STRING_length(bs) == 0) PRINT("00"); - } else { - if (dump) PRINT("ERROR:AINT: BAD INTEGER"); - } -@@ -1023,18 +1035,18 @@ int XrdCryptosslX509::FillUnknownExt(const unsigned char **pp, long length, bool - bs = d2i_ASN1_ENUMERATED(0, &opp, len+hl); - if (bs) { - if (dump) PRINT("AENU:"); -- if (bs->type == V_ASN1_NEG_ENUMERATED) -+ if (ASN1_STRING_type(bs) == V_ASN1_NEG_ENUMERATED) - if (dump) PRINT("-"); - BIO *mem = BIO_new(BIO_s_mem()); -- for (i = 0; i < bs->length; i++) { -- if (BIO_printf(mem, "%02X", bs->data[i]) <= 0) { -+ for (i = 0; i < ASN1_STRING_length(bs); i++) { -+ if (BIO_printf(mem, "%02X", ASN1_STRING_get0_data(bs)[i]) <= 0) { - if (dump) PRINT("ERROR:AENU: problems printf-ing to BIO"); - BIO_free(mem); - goto end; - } - } - if (dump) { BIO_PRINT(mem, "AENU:"); } -- if (bs->length == 0) PRINT("00"); -+ if (ASN1_STRING_length(bs) == 0) PRINT("00"); - } else { - if (dump) PRINT("ERROR:AENU: BAD ENUMERATED"); - } -diff --git a/src/XrdCrypto/XrdCryptosslX509Crl.cc b/src/XrdCrypto/XrdCryptosslX509Crl.cc -index 61ddaf83c..cc9f324bb 100644 ---- a/src/XrdCrypto/XrdCryptosslX509Crl.cc -+++ b/src/XrdCrypto/XrdCryptosslX509Crl.cc -@@ -105,7 +105,7 @@ XrdCryptosslX509Crl::XrdCryptosslX509Crl(XrdCryptoX509 *cacert) - - // Bio for exporting the extension - BIO *bext = BIO_new(BIO_s_mem()); -- ASN1_OBJECT *obj = X509_EXTENSION_get_object(crlext); -+ const ASN1_OBJECT *obj = X509_EXTENSION_get_object(crlext); - i2a_ASN1_OBJECT(bext, obj); - X509V3_EXT_print(bext, crlext, 0, 4); - // data length -diff --git a/src/XrdCrypto/XrdCryptosslgsiAux.cc b/src/XrdCrypto/XrdCryptosslgsiAux.cc -index 8f4b929c1..a5d20e1af 100644 ---- a/src/XrdCrypto/XrdCryptosslgsiAux.cc -+++ b/src/XrdCrypto/XrdCryptosslgsiAux.cc -@@ -165,12 +165,12 @@ bool XrdCryptosslProxyCertInfo(const void *extdata, int &pathlen, bool *haspolic - OBJ_obj2txt(s, sizeof(s), X509_EXTENSION_get_object(ext), 1); - - // Now extract the path length constraint, if any -- unsigned char *p = X509_EXTENSION_get_data(ext)->data; -+ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(ext)); - PROXY_CERT_INFO_EXTENSION *pci = 0; - if (!strcmp(s, gsiProxyCertInfo_OID)) -- pci = d2i_PROXY_CERT_INFO_EXTENSION(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(ext)->length); -+ pci = d2i_PROXY_CERT_INFO_EXTENSION(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(ext))); - else if (!strcmp(s, gsiProxyCertInfo_OLD_OID)) -- pci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(ext)->length); -+ pci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(ext))); - if (!pci) { - return 0; - } -@@ -208,12 +208,12 @@ void XrdCryptosslSetPathLenConstraint(void *extdata, int pathlen) - OBJ_obj2txt(s, sizeof(s), X509_EXTENSION_get_object(ext), 1); - - // Now extract the path length constraint, if any -- unsigned char *p = X509_EXTENSION_get_data(ext)->data; -+ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(ext)); - PROXY_CERT_INFO_EXTENSION *pci = 0; - if (!strcmp(s, gsiProxyCertInfo_OID)) -- pci = d2i_PROXY_CERT_INFO_EXTENSION(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(ext)->length); -+ pci = d2i_PROXY_CERT_INFO_EXTENSION(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(ext))); - else if (!strcmp(s, gsiProxyCertInfo_OLD_OID)) -- pci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(ext)->length); -+ pci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(ext))); - if (!pci) - return; - -@@ -419,16 +419,32 @@ int XrdCryptosslX509CreateProxy(const char *fnc, const char *fnk, - return -kErrPX_SetAttribute; - } - // Extract data in format for extension -- X509_EXTENSION_get_data(ext)->length = i2d_PROXY_CERT_INFO_EXTENSION(pci, 0); -- if (!(X509_EXTENSION_get_data(ext)->data = (unsigned char *)malloc(X509_EXTENSION_get_data(ext)->length+1))) { -+ int len = i2d_PROXY_CERT_INFO_EXTENSION(pci, 0); -+ unsigned char *data = (unsigned char *) malloc(len); -+ if (!data) { - PRINT("could not allocate data field for extension"); - return -kErrPX_NoResources; - } -- unsigned char *pp = X509_EXTENSION_get_data(ext)->data; -+ unsigned char *pp = data; - if ((i2d_PROXY_CERT_INFO_EXTENSION(pci, &pp)) <= 0) { - PRINT("problem converting data for extension"); - return -kErrPX_Error; - } -+ ASN1_OCTET_STRING *os = ASN1_OCTET_STRING_new(); -+ if (!os) { -+ PRINT("could not allocate data field for extension"); -+ return -kErrPX_NoResources; -+ } -+ if (ASN1_OCTET_STRING_set(os, data, len) == 0) { -+ PRINT("could not allocate data field for extension"); -+ return -kErrPX_NoResources; -+ } -+ free(data); -+ if (X509_EXTENSION_set_data(ext, os) == 0) { -+ PRINT("could not allocate data field for extension"); -+ return -kErrPX_NoResources; -+ } -+ ASN1_STRING_free(os); - // Create a stack - STACK_OF(X509_EXTENSION) *esk = sk_X509_EXTENSION_new_null(); - if (!esk) { -@@ -504,7 +520,11 @@ int XrdCryptosslX509CreateProxy(const char *fnc, const char *fnk, - } - - // First duplicate the extensions of the EE certificate -+#if OPENSSL_VERSION_NUMBER < 0x40000000L - X509_EXTENSION *xEECext = 0; -+#else -+ const X509_EXTENSION *xEECext = 0; -+#endif - int nEECext = X509_get_ext_count(xEEC); - DEBUG("number of extensions found in the original certificate: "<< nEECext); - int i = 0; -@@ -756,7 +776,11 @@ int XrdCryptosslX509CreateProxyReq(XrdCryptoX509 *xcpi, - } - // - // Get signature path depth from present proxy -+#if OPENSSL_VERSION_NUMBER < 0x40000000L - X509_EXTENSION *xpiext = 0; -+#else -+ const X509_EXTENSION *xpiext = 0; -+#endif - int npiext = X509_get_ext_count(xpi); - int i = 0; - bool haskeyusage = 0; -@@ -772,12 +796,12 @@ int XrdCryptosslX509CreateProxyReq(XrdCryptoX509 *xcpi, - // Get signature path depth from present proxy - if (!strcmp(s, gsiProxyCertInfo_OID) || - !strcmp(s, gsiProxyCertInfo_OLD_OID)) { -- unsigned char *p = X509_EXTENSION_get_data(xpiext)->data; -+ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(xpiext)); - PROXY_CERT_INFO_EXTENSION *inpci = 0; - if (!strcmp(s, gsiProxyCertInfo_OID)) -- inpci = d2i_PROXY_CERT_INFO_EXTENSION(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(xpiext)->length); -+ inpci = d2i_PROXY_CERT_INFO_EXTENSION(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(xpiext))); - else -- inpci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(xpiext)->length); -+ inpci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(xpiext))); - if (inpci && - inpci->pcPathLengthConstraint) - indepthlen = ASN1_INTEGER_get(inpci->pcPathLengthConstraint); -@@ -823,16 +847,32 @@ int XrdCryptosslX509CreateProxyReq(XrdCryptoX509 *xcpi, - return -kErrPX_NoResources; - } - // Extract data in format for extension -- X509_EXTENSION_get_data(ext.get())->length = i2d_PROXY_CERT_INFO_EXTENSION(pci.get(), 0); -- if (!(X509_EXTENSION_get_data(ext.get())->data = (unsigned char *)malloc(X509_EXTENSION_get_data(ext.get())->length+1))) { -+ int len = i2d_PROXY_CERT_INFO_EXTENSION(pci.get(), 0); -+ unsigned char *data = (unsigned char *) malloc(len); -+ if (!data) { - PRINT("could not allocate data field for extension"); - return -kErrPX_NoResources; - } -- unsigned char *pp = X509_EXTENSION_get_data(ext.get())->data; -+ unsigned char *pp = data; - if ((i2d_PROXY_CERT_INFO_EXTENSION(pci.get(), &pp)) <= 0) { - PRINT("problem converting data for extension"); - return -kErrPX_Error; - } -+ ASN1_OCTET_STRING *os = ASN1_OCTET_STRING_new(); -+ if (!os) { -+ PRINT("could not allocate data field for extension"); -+ return -kErrPX_NoResources; -+ } -+ if (ASN1_OCTET_STRING_set(os, data, len) == 0) { -+ PRINT("could not allocate data field for extension"); -+ return -kErrPX_NoResources; -+ } -+ free(data); -+ if (X509_EXTENSION_set_data(ext.get(), os) == 0) { -+ PRINT("could not allocate data field for extension"); -+ return -kErrPX_NoResources; -+ } -+ ASN1_STRING_free(os); - pci = nullptr; - - // Set extension name. -@@ -1030,7 +1070,11 @@ int XrdCryptosslX509SignProxyReq(XrdCryptoX509 *xcpi, XrdCryptoRSA *kcpi, - - // - // Get signature path depth from input proxy -+#if OPENSSL_VERSION_NUMBER < 0x40000000L - X509_EXTENSION *xpiext = 0, *xriext = 0; -+#else -+ const X509_EXTENSION *xpiext = 0, *xriext = 0; -+#endif - int npiext = X509_get_ext_count(xpi); - int i = 0; - bool haskeyusage = 0; -@@ -1038,17 +1082,17 @@ int XrdCryptosslX509SignProxyReq(XrdCryptoX509 *xcpi, XrdCryptoRSA *kcpi, - for (i = 0; i< npiext; i++) { - xpiext = X509_get_ext(xpi, i); - char s[256] = {0}; -- ASN1_OBJECT *obj = X509_EXTENSION_get_object(xpiext); -+ const ASN1_OBJECT *obj = X509_EXTENSION_get_object(xpiext); - if (obj) - OBJ_obj2txt(s, sizeof(s), obj, 1); - if (!strcmp(s, gsiProxyCertInfo_OID) || - !strcmp(s, gsiProxyCertInfo_OLD_OID)) { -- unsigned char *p = X509_EXTENSION_get_data(xpiext)->data; -+ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(xpiext)); - PROXY_CERT_INFO_EXTENSION *inpci = 0; - if (!strcmp(s, gsiProxyCertInfo_OID)) -- inpci = d2i_PROXY_CERT_INFO_EXTENSION(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(xpiext)->length); -+ inpci = d2i_PROXY_CERT_INFO_EXTENSION(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(xpiext))); - else -- inpci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(xpiext)->length); -+ inpci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(xpiext))); - if (inpci && - inpci->pcPathLengthConstraint) - indepthlen = ASN1_INTEGER_get(inpci->pcPathLengthConstraint); -@@ -1101,9 +1145,9 @@ int XrdCryptosslX509SignProxyReq(XrdCryptoX509 *xcpi, XrdCryptoRSA *kcpi, - // Get the content - int reqdepthlen = -1; - if (xriext) { -- unsigned char *p = X509_EXTENSION_get_data(xriext)->data; -+ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(xriext)); - PROXY_CERT_INFO_EXTENSION *reqpci = -- d2i_PROXY_CERT_INFO_EXTENSION(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(xriext)->length); -+ d2i_PROXY_CERT_INFO_EXTENSION(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(xriext))); - if (reqpci && - reqpci->pcPathLengthConstraint) - reqdepthlen = ASN1_INTEGER_get(reqpci->pcPathLengthConstraint); -@@ -1140,16 +1184,32 @@ int XrdCryptosslX509SignProxyReq(XrdCryptoX509 *xcpi, XrdCryptoRSA *kcpi, - return -kErrPX_NoResources; - } - // Extract data in format for extension -- X509_EXTENSION_get_data(ext.get())->length = i2d_PROXY_CERT_INFO_EXTENSION(pci.get(), 0); -- if (!(X509_EXTENSION_get_data(ext.get())->data = (unsigned char *)malloc(X509_EXTENSION_get_data(ext.get())->length+1))) { -+ int len = i2d_PROXY_CERT_INFO_EXTENSION(pci.get(), 0); -+ unsigned char *data = (unsigned char *) malloc(len); -+ if (!data) { - PRINT("could not allocate data field for extension"); - return -kErrPX_NoResources; - } -- unsigned char *pp = X509_EXTENSION_get_data(ext.get())->data; -+ unsigned char *pp = data; - if ((i2d_PROXY_CERT_INFO_EXTENSION(pci.get(), &pp)) <= 0) { - PRINT("problem converting data for extension"); - return -kErrPX_Error; - } -+ ASN1_OCTET_STRING *os = ASN1_OCTET_STRING_new(); -+ if (!os) { -+ PRINT("could not allocate data field for extension"); -+ return -kErrPX_NoResources; -+ } -+ if (ASN1_OCTET_STRING_set(os, data, len) == 0) { -+ PRINT("could not allocate data field for extension"); -+ return -kErrPX_NoResources; -+ } -+ free(data); -+ if (X509_EXTENSION_set_data(ext.get(), os) == 0) { -+ PRINT("could not allocate data field for extension"); -+ return -kErrPX_NoResources; -+ } -+ ASN1_STRING_free(os); - pci = nullptr; - - // Set extension name. -@@ -1215,7 +1275,11 @@ int XrdCryptosslX509GetVOMSAttr(XrdCryptoX509 *xcpi, XrdOucString &vat) - rc = 1; - bool getvat = 0; - // Go through the extensions -+#if OPENSSL_VERSION_NUMBER < 0x40000000L - X509_EXTENSION *xpiext = 0; -+#else -+ const X509_EXTENSION *xpiext = 0; -+#endif - int npiext = X509_get_ext_count(xpi); - int i = 0; - for (i = 0; i< npiext; i++) { -@@ -1227,8 +1291,8 @@ int XrdCryptosslX509GetVOMSAttr(XrdCryptoX509 *xcpi, XrdOucString &vat) - if (strcmp(s, XRDGSI_VOMS_ACSEQ_OID)) continue; - // This is the VOMS extension we are interested for - rc = 0; -- const unsigned char *pp = (const unsigned char *) X509_EXTENSION_get_data(xpiext)->data; -- long length = X509_EXTENSION_get_data(xpiext)->length; -+ const unsigned char *pp = ASN1_STRING_get0_data(X509_EXTENSION_get_data(xpiext)); -+ long length = ASN1_STRING_length(X509_EXTENSION_get_data(xpiext)); - int ret = XrdCryptosslX509FillVOMS(&pp, length, getvat, vat); - DEBUG("ret: " << ret << " - vat: " << vat); - } -@@ -1316,10 +1380,10 @@ int XrdCryptosslX509FillVOMS(const unsigned char **pp, - int i, printable = 1; - opp = op; - os = d2i_ASN1_OCTET_STRING(0, &opp, len + hl); -- if (os && os->length > 0) { -- opp = os->data; -+ if (os && ASN1_STRING_length(os) > 0) { -+ opp = ASN1_STRING_get0_data(os); - // Testing whether the octet string is printable -- for (i=0; ilength; i++) { -+ for (i=0; i < ASN1_STRING_length(os); i++) { - if (( (opp[i] < ' ') && (opp[i] != '\n') && - (opp[i] != '\r') && (opp[i] != '\t')) || (opp[i] > '~')) { - printable = 0; -@@ -1333,7 +1397,7 @@ int XrdCryptosslX509FillVOMS(const unsigned char **pp, - vat += (const char *)opp; - gotvat = 1; - } -- DEBUG("OBJS:" << (const char *)opp << " (len: "<length<<")"); -+ DEBUG("OBJS:" << (const char *)opp << " (len: " << ASN1_STRING_length(os) << ")"); - } - } - if (os) { -@@ -1385,11 +1449,19 @@ int XrdCryptosslX509CheckProxy3(XrdCryptoX509 *xcpi, XrdOucString &emsg) { - } - TRACE(ALL,"certificate has "<data; -- pci = d2i_PROXY_CERT_INFO_EXTENSION(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(ext)->length); -+ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(ext)); -+ pci = d2i_PROXY_CERT_INFO_EXTENSION(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(ext))); - } else { - PRINT("WARNING: multiple proxyCertInfo extensions found: taking the first"); - } -@@ -1408,8 +1480,8 @@ int XrdCryptosslX509CheckProxy3(XrdCryptoX509 *xcpi, XrdOucString &emsg) { - if (ext == 0) { - ext = xext; - // Now get the extension -- unsigned char *p = X509_EXTENSION_get_data(ext)->data; -- pci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, (const unsigned char **)(&p), X509_EXTENSION_get_data(ext)->length); -+ const unsigned char *p = ASN1_STRING_get0_data(X509_EXTENSION_get_data(ext)); -+ pci = d2i_PROXY_CERT_INFO_EXTENSION_OLD(0, &p, ASN1_STRING_length(X509_EXTENSION_get_data(ext))); - } else { - PRINT("WARNING: multiple proxyCertInfo extensions found: taking the first"); - } -diff --git a/src/XrdTls/XrdTlsNotaryUtils.icc b/src/XrdTls/XrdTlsNotaryUtils.icc -index 44125d988..3ded4f993 100644 ---- a/src/XrdTls/XrdTlsNotaryUtils.icc -+++ b/src/XrdTls/XrdTlsNotaryUtils.icc -@@ -56,8 +56,8 @@ SOFTWARE. - */ - static HostnameValidationResult matches_common_name(const char *hostname, const X509 *server_cert) { - int common_name_loc = -1; -- X509_NAME_ENTRY *common_name_entry = NULL; -- ASN1_STRING *common_name_asn1 = NULL; -+ const X509_NAME_ENTRY *common_name_entry = NULL; -+ const ASN1_STRING *common_name_asn1 = NULL; - char *common_name_str = NULL; - - // Find the position of the CN field in the Subject field of the certificate -diff --git a/src/XrdVoms/XrdVomsFun.cc b/src/XrdVoms/XrdVomsFun.cc -index a4bc9b8b7..fe6e8ebb7 100644 ---- a/src/XrdVoms/XrdVomsFun.cc -+++ b/src/XrdVoms/XrdVomsFun.cc -@@ -110,7 +110,7 @@ XrdVomsFun::XrdVomsFun(XrdSysError &erp) - - // Function to convert X509_NAME into a one-line human readable string - // --void XrdVomsFun::NameOneLine(X509_NAME *nm, XrdOucString &s) -+void XrdVomsFun::NameOneLine(const X509_NAME *nm, XrdOucString &s) - { - BIO *mbio = BIO_new(BIO_s_mem()); - X509_NAME_print_ex(mbio, nm, 0, XN_FLAG_COMPAT); -diff --git a/src/XrdVoms/XrdVomsFun.hh b/src/XrdVoms/XrdVomsFun.hh -index ff5df58ef..5c1129ab8 100644 ---- a/src/XrdVoms/XrdVomsFun.hh -+++ b/src/XrdVoms/XrdVomsFun.hh -@@ -65,7 +65,7 @@ int VOMSInit(const char *cfg); - private: - - void FmtExtract(XrdOucString &out, XrdOucString in, const char *tag); --void NameOneLine(X509_NAME *nm, XrdOucString &s); -+void NameOneLine(const X509_NAME *nm, XrdOucString &s); - void FmtReplace(XrdSecEntity &ent); - - // These settings are configurable --- -2.54.0 - diff --git a/0002-XrdCrypto-Preserve-ABI.patch b/0002-XrdCrypto-Preserve-ABI.patch deleted file mode 100644 index 02aa7a5..0000000 --- a/0002-XrdCrypto-Preserve-ABI.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 09a98373bc442d515f347593c113842733ea60b7 Mon Sep 17 00:00:00 2001 -From: Mattias Ellert -Date: Sat, 23 May 2026 20:59:04 +0200 -Subject: [PATCH 2/2] [XrdCrypto] Preserve ABI - -Add back now unused non-const version of function ---- - src/XrdCrypto/XrdCryptosslAux.cc | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/src/XrdCrypto/XrdCryptosslAux.cc b/src/XrdCrypto/XrdCryptosslAux.cc -index a44283985..e0ce35285 100644 ---- a/src/XrdCrypto/XrdCryptosslAux.cc -+++ b/src/XrdCrypto/XrdCryptosslAux.cc -@@ -755,3 +755,12 @@ void XrdCryptosslNameOneLine(const X509_NAME *nm, XrdOucString &s) - // Done - return; - } -+ -+//____________________________________________________________________________ -+void XrdCryptosslNameOneLine(X509_NAME *nm, XrdOucString &s) -+{ -+ // Copy of above function with non-const first argument -+ // This function is unused -- only added to preserve old ABI -+ // Can be removed if soname changes -+ XrdCryptosslNameOneLine(const_cast(nm), s); -+} --- -2.54.0 - diff --git a/sources b/sources index 21816ab..f669827 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (xrootd-6.0.3.tar.gz) = 9f0517dcecc679f5aa385831184c9eb93ad7ad2d42bda1340a9cada7f444998fed0a212738142beaf3de6c2f26670137839ca48ca9ac5ab7d5834feb5d309aa8 +SHA512 (xrootd-6.1.0.tar.gz) = bd471f3267de4aa520d091caca5c630adc42481da1ad4de534b515ec3cb7f4c3b428dbdfd92ed05ba8897811153b29eb425bc4a002546c81996aeafd1385d0c2 diff --git a/xrootd.spec b/xrootd.spec index 9215d80..872661c 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -13,8 +13,8 @@ Name: xrootd Epoch: 1 -Version: 6.0.3 -Release: 3%{?dist} +Version: 6.1.0 +Release: 1%{?dist} Summary: Extended ROOT file server License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib AND Apache-2.0 AND MPL-2.0 URL: https://xrootd.web.cern.ch @@ -23,10 +23,6 @@ Source1: %{name}-sysusers.conf # Unbundle tinyxml library Patch0: 0001-Unbundle-tinyxml.patch -# Adapt to OpenSSL 4 -# https://github.com/xrootd/xrootd/pull/2802 -Patch1: 0001-XrdCrypto-XrdTls-XrdVoms-Adapt-to-OpenSSL-4.0.patch -Patch2: 0002-XrdCrypto-Preserve-ABI.patch BuildRequires: cmake BuildRequires: gcc-c++ @@ -72,6 +68,7 @@ BuildRequires: python3-sphinx BuildRequires: attr BuildRequires: curl BuildRequires: gtest-devel +BuildRequires: jq BuildRequires: krb5-server BuildRequires: krb5-workstation BuildRequires: openssl @@ -265,8 +262,6 @@ This package contains the API documentation of the xrootd libraries. %setup -q %patch -P0 -p1 -%patch -P1 -p1 -%patch -P2 -p1 %build %cmake \ @@ -579,6 +574,7 @@ fi %{_libdir}/libXrdOfsPrepGPI-6.so %{_libdir}/libXrdOssArc-6.so %{_libdir}/libXrdOssCsi-6.so +%{_libdir}/libXrdOssMirage-6.so %{_libdir}/libXrdOssSIgpfsT-6.so %{_libdir}/libXrdOssStats-6.so %{_libdir}/libXrdPfc-6.so @@ -661,6 +657,10 @@ fi %doc %{_pkgdocdir} %changelog +* Tue Jun 23 2026 Mattias Ellert - 1:6.1.0-1 +- Update to version 6.1.0 +- Drop patches accepted upstream + * Sat Jun 13 2026 Yaakov Selkowitz - 1:6.0.3-3 - Rebuilt for openssl 4.0 From 0f808a585a12cb83f4310b9d82d00f1945c21e87 Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Wed, 24 Jun 2026 09:55:13 +0200 Subject: [PATCH 09/14] Update to version 5.9.6 --- sources | 2 +- xrootd.spec | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sources b/sources index d240694..8659290 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (xrootd-5.9.5.tar.gz) = 74829f253d34a801cff585c28340dd42cb77eea94cd456243d788e59c3d8ac6fe72a016f82bc56308a59974eba9519cdc087829763c64d5b0b9ba940d2d2eb94 +SHA512 (xrootd-5.9.6.tar.gz) = 577d0345cd8669437b91f1eb95c25e5d823d6de44085fcf75794daf9e4929b09c2652f2fda85c6d1eb0ad5b1f75b92f867c276f8682bccb406c0a1eb10125c10 diff --git a/xrootd.spec b/xrootd.spec index a05c14a..bf0bdff 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -13,7 +13,7 @@ Name: xrootd Epoch: 1 -Version: 5.9.5 +Version: 5.9.6 Release: 1%{?dist} Summary: Extended ROOT file server License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib AND Apache-2.0 AND MPL-2.0 @@ -65,6 +65,7 @@ BuildRequires: attr BuildRequires: curl BuildRequires: davix BuildRequires: gtest-devel +BuildRequires: jq BuildRequires: krb5-server BuildRequires: krb5-workstation BuildRequires: openssl @@ -655,6 +656,9 @@ fi %doc %{_pkgdocdir} %changelog +* Wed Jun 24 2026 Mattias Ellert - 1:5.9.6-1 +- Update to version 5.9.6 + * Tue Jun 02 2026 Mattias Ellert - 1:5.9.5-1 - Update to version 5.9.5 From f904ae3077ef6a0e670c6318a2b31ac7cdea18b0 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 17 Jul 2026 09:26:15 +0000 Subject: [PATCH 10/14] Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild --- xrootd.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xrootd.spec b/xrootd.spec index 872661c..3d52e26 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -14,7 +14,7 @@ Name: xrootd Epoch: 1 Version: 6.1.0 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Extended ROOT file server License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib AND Apache-2.0 AND MPL-2.0 URL: https://xrootd.web.cern.ch @@ -657,6 +657,9 @@ fi %doc %{_pkgdocdir} %changelog +* Fri Jul 17 2026 Fedora Release Engineering - 1:6.1.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild + * Tue Jun 23 2026 Mattias Ellert - 1:6.1.0-1 - Update to version 6.1.0 - Drop patches accepted upstream From 532cdeacb7787ada4b6b047dceb789f737944d64 Mon Sep 17 00:00:00 2001 From: Python Maint Date: Wed, 22 Jul 2026 10:11:56 +0200 Subject: [PATCH 11/14] Rebuilt for Python 3.15.0b4 ABI change --- xrootd.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xrootd.spec b/xrootd.spec index 3d52e26..7a7fdd3 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -14,7 +14,7 @@ Name: xrootd Epoch: 1 Version: 6.1.0 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Extended ROOT file server License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib AND Apache-2.0 AND MPL-2.0 URL: https://xrootd.web.cern.ch @@ -657,6 +657,9 @@ fi %doc %{_pkgdocdir} %changelog +* Wed Jul 22 2026 Python Maint - 1:6.1.0-3 +- Rebuilt for Python 3.15.0b4 ABI change + * Fri Jul 17 2026 Fedora Release Engineering - 1:6.1.0-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild From e4ad3a28d2c1d0ecbdcd9cefa05f05dc8c8b5faa Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Thu, 13 Aug 2026 07:56:03 +0200 Subject: [PATCH 12/14] Update to version 6.1.1 --- 0001-Make-documentation-self-contained.patch | 30 +++++++++++++ 0001-Unbundle-gtest.patch | 25 +++++++++++ sources | 2 +- xrootd.spec | 44 +++++++++++++++----- 4 files changed, 89 insertions(+), 12 deletions(-) create mode 100644 0001-Make-documentation-self-contained.patch create mode 100644 0001-Unbundle-gtest.patch diff --git a/0001-Make-documentation-self-contained.patch b/0001-Make-documentation-self-contained.patch new file mode 100644 index 0000000..bba4217 --- /dev/null +++ b/0001-Make-documentation-self-contained.patch @@ -0,0 +1,30 @@ +From 8b924dbc92d3cce474421fbd7974f3d22d64d51c Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Wed, 12 Aug 2026 17:00:45 +0200 +Subject: [PATCH] Make documentation self-contained + +--- + README.md | 9 +-------- + 1 file changed, 1 insertion(+), 8 deletions(-) + +diff --git a/README.md b/README.md +index bafd1112d..167d476e0 100644 +--- a/README.md ++++ b/README.md +@@ -1,12 +1,5 @@ +-[![Repology](https://img.shields.io/badge/repology-xrootd-blue)](https://repology.org/project/xrootd/packages) +-[![CDash](https://img.shields.io/badge/CDash-XRootD-limegreen)](https://my.cdash.org/index.php?project=XRootD) +-[![ABI](https://github.com/xrootd/xrootd/actions/workflows/ABI.yml/badge.svg)](https://github.com/xrootd/xrootd/actions/workflows/ABI.yml) +-[![CI](https://github.com/xrootd/xrootd/actions/workflows/CI.yml/badge.svg)](https://github.com/xrootd/xrootd/actions/workflows/CI.yml) +-[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/11900/badge)](https://www.bestpractices.dev/projects/11900) +-[![LFX Health Score](https://insights.linuxfoundation.org/api/badge/health-score?project=xrootd)](https://insights.linuxfoundation.org/project/xrootd) +- +

+- ++ +

+ + ## XRootD: eXtended ROOT Daemon +-- +2.55.0 + diff --git a/0001-Unbundle-gtest.patch b/0001-Unbundle-gtest.patch new file mode 100644 index 0000000..1bbac2e --- /dev/null +++ b/0001-Unbundle-gtest.patch @@ -0,0 +1,25 @@ +From cd11f615e749a1fcdd353edd30505c4e8da897db Mon Sep 17 00:00:00 2001 +From: Mattias Ellert +Date: Tue, 11 Aug 2026 23:53:15 +0200 +Subject: [PATCH] Unbundle gtest + +--- + cmake/XRootDFindLibs.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/cmake/XRootDFindLibs.cmake b/cmake/XRootDFindLibs.cmake +index e47dfb83e..3788f5ed4 100644 +--- a/cmake/XRootDFindLibs.cmake ++++ b/cmake/XRootDFindLibs.cmake +@@ -89,7 +89,7 @@ if( ENABLE_XRDOSSARC ) + endif() + + if( ENABLE_TESTS ) +- add_subdirectory(vendor/googletest EXCLUDE_FROM_ALL) ++ find_package( GTest REQUIRED ) + + set( BUILD_TESTS TRUE ) + +-- +2.55.0 + diff --git a/sources b/sources index f669827..a960b85 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (xrootd-6.1.0.tar.gz) = bd471f3267de4aa520d091caca5c630adc42481da1ad4de534b515ec3cb7f4c3b428dbdfd92ed05ba8897811153b29eb425bc4a002546c81996aeafd1385d0c2 +SHA512 (xrootd-6.1.1.tar.gz) = ac1286cc54c60611bf17b6140b8cd7ef17a8318a4082cae38e5da040199ce4405490e583b376074c3ed29cf2d87c9bbda5da15c6a3091c83c7877abdc3343ebf diff --git a/xrootd.spec b/xrootd.spec index 7a7fdd3..d2d55a4 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -8,13 +8,10 @@ %global ceph 0 %endif -# Needed for EPEL 8 -%undefine __cmake_in_source_build - Name: xrootd Epoch: 1 -Version: 6.1.0 -Release: 3%{?dist} +Version: 6.1.1 +Release: 1%{?dist} Summary: Extended ROOT file server License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib AND Apache-2.0 AND MPL-2.0 URL: https://xrootd.web.cern.ch @@ -23,6 +20,10 @@ Source1: %{name}-sysusers.conf # Unbundle tinyxml library Patch0: 0001-Unbundle-tinyxml.patch +# Unbundle googletest/googlemock +Patch1: 0001-Unbundle-gtest.patch +# Make documentation self-contained +Patch2: 0001-Make-documentation-self-contained.patch BuildRequires: cmake BuildRequires: gcc-c++ @@ -37,6 +38,10 @@ BuildRequires: libzip-devel BuildRequires: ncurses-devel BuildRequires: openssl-devel BuildRequires: perl-generators +%if %{?fedora}%{!?fedora:0} +# picojson not in RHEL/EPEL +BuildRequires: picojson-devel +%endif BuildRequires: readline-devel BuildRequires: zlib-devel BuildRequires: selinux-policy-devel @@ -68,6 +73,7 @@ BuildRequires: python3-sphinx BuildRequires: attr BuildRequires: curl BuildRequires: gtest-devel +BuildRequires: gmock-devel BuildRequires: jq BuildRequires: krb5-server BuildRequires: krb5-workstation @@ -262,6 +268,17 @@ This package contains the API documentation of the xrootd libraries. %setup -q %patch -P0 -p1 +%patch -P1 -p1 +%patch -P2 -p1 + +# Delete bundled dependencies +rm src/XrdXml/tinyxml/tiny* +rm -r vendor/bats +rm -r vendor/googletest +%if %{?fedora}%{!?fedora:0} +# picojson not in RHEL/EPEL +rm -r vendor/picojson +%endif %build %cmake \ @@ -285,9 +302,6 @@ This package contains the API documentation of the xrootd libraries. make -C config -f /usr/share/selinux/devel/Makefile doxygen Doxyfile -# Use local image instead of remote -sed 's!src=".*/xrootd-logo.png"!src="xrootd-logo.png"!' \ - -i doxydoc/html/index.html cp -p docs/images/xrootd-logo.png doxydoc/html %install @@ -394,14 +408,18 @@ for x in authenticated_cluster badredir cluster TPCTests xcachewithcsi ; do done # The badredir test fails when there is no network - exclude +# The posix test is broken for 32 bit archs ... +# https://github.com/xrootd/xrootd/issues/2559 touch testfile if ( setfattr -n user.testattr -v testvalue testfile ) ; then + %ctest -- -E \ +XRootD::badredir\|\ %ifarch %{ix86} %{arm} - %ctest -- -E 'XRootD::badredir|XRootD::posix' -%else - %ctest -- -E 'XRootD::badredir' +XRootD::posix\|\ %endif +XrdCl::FileSystemTest.PlugInTest\|\ +XrdCl::FileTest.PlugInTest else echo "Extended file attributes not supported by file system" echo "*** NOT RUNNING TESTS ***" @@ -525,6 +543,7 @@ fi %{_libdir}/libXrdUtils.so %{_libdir}/libXrdXml.so %{_libdir}/cmake/XRootD +%{_mandir}/man1/xrootd-config.1* %files client-libs %{_libdir}/libXrdCl.so.* @@ -657,6 +676,9 @@ fi %doc %{_pkgdocdir} %changelog +* Wed Aug 12 2026 Mattias Ellert - 1:6.1.1-1 +- Update to version 6.1.1 + * Wed Jul 22 2026 Python Maint - 1:6.1.0-3 - Rebuilt for Python 3.15.0b4 ABI change From 857f3803746e944bb9a7b9cd020610f698eff8f9 Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Thu, 13 Aug 2026 08:07:12 +0200 Subject: [PATCH 13/14] Update to version 5.9.7 --- sources | 2 +- xrootd.spec | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/sources b/sources index 8659290..ba3c8b5 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (xrootd-5.9.6.tar.gz) = 577d0345cd8669437b91f1eb95c25e5d823d6de44085fcf75794daf9e4929b09c2652f2fda85c6d1eb0ad5b1f75b92f867c276f8682bccb406c0a1eb10125c10 +SHA512 (xrootd-5.9.7.tar.gz) = f6a118a556b87881c821d32546e3a9d784578ffba99327821f0dec8de6b29360756cfd99bdc1adf4611490baee24bf9667657519be3a70efbd86345f9ed6a8a7 diff --git a/xrootd.spec b/xrootd.spec index bf0bdff..7363367 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -13,7 +13,7 @@ Name: xrootd Epoch: 1 -Version: 5.9.6 +Version: 5.9.7 Release: 1%{?dist} Summary: Extended ROOT file server License: LGPL-3.0-or-later AND BSD-2-Clause AND BSD-3-Clause AND curl AND MIT AND Zlib AND Apache-2.0 AND MPL-2.0 @@ -33,6 +33,10 @@ BuildRequires: libxml2-devel BuildRequires: ncurses-devel BuildRequires: openssl-devel BuildRequires: perl-generators +%if %{?fedora}%{!?fedora:0} +# picojson not in RHEL/EPEL +BuildRequires: picojson-devel +%endif BuildRequires: readline-devel BuildRequires: zlib-devel BuildRequires: selinux-policy-devel @@ -264,6 +268,13 @@ This package contains the API documentation of the xrootd libraries. %prep %setup -q +# Delete bundled dependencies +rm src/XrdXml/tinyxml/tiny* +%if %{?fedora}%{!?fedora:0} +# picojson not in RHEL/EPEL +rm -r src/XrdSciTokens/vendor/picojson +%endif + %build %cmake \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ @@ -321,6 +332,7 @@ install -m 644 -p packaging/common/frm_xfrd@.service %{buildroot}%{_unitdir} install -m 644 -p packaging/common/frm_purged@.service %{buildroot}%{_unitdir} mkdir -p %{buildroot}%{_tmpfilesdir} install -m 644 -p packaging/rhel/xrootd.tmpfiles %{buildroot}%{_tmpfilesdir}/%{name}.conf + mkdir -p %{buildroot}%{_sysusersdir} install -m 644 -p %{SOURCE1} %{buildroot}%{_sysusersdir}/%{name}.conf @@ -399,7 +411,10 @@ done touch testfile if ( setfattr -n user.testattr -v testvalue testfile ) ; then - %ctest -- -E XRootD::badredir + %ctest -- -E \ +XRootD::badredir\|\ +XrdCl::FileSystemTest.PlugInTest\|\ +XrdCl::FileTest.PlugInTest else echo "Extended file attributes not supported by file system" echo "*** NOT RUNNING TESTS ***" @@ -526,6 +541,7 @@ fi %{_libdir}/libXrdUtils.so %{_libdir}/libXrdXml.so %{_libdir}/cmake/XRootD +%{_mandir}/man1/xrootd-config.1* %files client-libs %{_libdir}/libXrdCl.so.* @@ -656,6 +672,9 @@ fi %doc %{_pkgdocdir} %changelog +* Wed Aug 12 2026 Mattias Ellert - 1:5.9.7-1 +- Update to version 5.9.7 + * Wed Jun 24 2026 Mattias Ellert - 1:5.9.6-1 - Update to version 5.9.6 From 4cc4704b2456757217e913ee1daa3b476d60da04 Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Fri, 14 Aug 2026 16:20:17 +0200 Subject: [PATCH 14/14] Fix specfile for old macros in EPEL 8 and 9 --- xrootd.spec | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/xrootd.spec b/xrootd.spec index 7363367..7960894 100644 --- a/xrootd.spec +++ b/xrootd.spec @@ -411,10 +411,7 @@ done touch testfile if ( setfattr -n user.testattr -v testvalue testfile ) ; then - %ctest -- -E \ -XRootD::badredir\|\ -XrdCl::FileSystemTest.PlugInTest\|\ -XrdCl::FileTest.PlugInTest + %ctest -- -E XRootD::badredir\|XrdCl::FileSystemTest.PlugInTest\|XrdCl::FileTest.PlugInTest else echo "Extended file attributes not supported by file system" echo "*** NOT RUNNING TESTS ***"