Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libzypp for openSUSE:Factory checked in at 2023-04-29 17:27:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libzypp (Old) and /work/SRC/openSUSE:Factory/.libzypp.new.1533 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libzypp" Sat Apr 29 17:27:57 2023 rev:471 rq:1083529 version:17.31.11 Changes: -------- --- /work/SRC/openSUSE:Factory/libzypp/libzypp.changes 2023-04-14 13:12:20.467310970 +0200 +++ /work/SRC/openSUSE:Factory/.libzypp.new.1533/libzypp.changes 2023-04-29 17:28:05.698530714 +0200 @@ -1,0 +2,22 @@ +Fri Apr 28 13:40:07 CEST 2023 - m...@suse.de + +- MediaCurl: Fix endless loop if wrong credentials are stored in + credentials.cat (bsc#1210870) + Since libzypp-17.31.7 wrong credentials stored in credentials.cat + may lead to an endless loop. Rather than asking for the right + credentials, the stored ones are used again and again. +- zypp.conf: Introduce 'download.connect_timeout' [60 sec.] + (bsc#1208329) + Maximum time in seconds that you allow the connection phase to + the server to take. This only limits the connection phase, it has + no impact once it has connected. (see also CURLOPT_CONNECTTIMEOUT) +- commit: Try to provide /dev fs if not present (fixes #444) +- fix build with boost 1.82. +- version 17.31.11 (22) + +------------------------------------------------------------------- +Mon Apr 24 08:30:44 CEST 2023 - aschn...@suse.com + +- fix build with boost 1.82 + +------------------------------------------------------------------- Old: ---- libzypp-17.31.10.tar.bz2 New: ---- libzypp-17.31.11.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libzypp.spec ++++++ --- /var/tmp/diff_new_pack.ZyPK3u/_old 2023-04-29 17:28:06.286533176 +0200 +++ /var/tmp/diff_new_pack.ZyPK3u/_new 2023-04-29 17:28:06.294533210 +0200 @@ -42,7 +42,7 @@ %bcond_with enable_preview_single_rpmtrans_as_default_for_zypper Name: libzypp -Version: 17.31.10 +Version: 17.31.11 Release: 0 License: GPL-2.0+ Url: https://github.com/openSUSE/libzypp ++++++ libzypp-17.31.10.tar.bz2 -> libzypp-17.31.11.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/VERSION.cmake new/libzypp-17.31.11/VERSION.cmake --- old/libzypp-17.31.10/VERSION.cmake 2023-04-13 16:51:38.000000000 +0200 +++ new/libzypp-17.31.11/VERSION.cmake 2023-04-28 13:42:03.000000000 +0200 @@ -61,8 +61,8 @@ SET(LIBZYPP_MAJOR "17") SET(LIBZYPP_COMPATMINOR "22") SET(LIBZYPP_MINOR "31") -SET(LIBZYPP_PATCH "10") +SET(LIBZYPP_PATCH "11") # -# LAST RELEASED: 17.31.10 (22) +# LAST RELEASED: 17.31.11 (22) # (The number in parenthesis is LIBZYPP_COMPATMINOR) #======= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/package/libzypp.changes new/libzypp-17.31.11/package/libzypp.changes --- old/libzypp-17.31.10/package/libzypp.changes 2023-04-13 16:51:38.000000000 +0200 +++ new/libzypp-17.31.11/package/libzypp.changes 2023-04-28 13:42:03.000000000 +0200 @@ -1,4 +1,26 @@ ------------------------------------------------------------------- +Fri Apr 28 13:40:07 CEST 2023 - m...@suse.de + +- MediaCurl: Fix endless loop if wrong credentials are stored in + credentials.cat (bsc#1210870) + Since libzypp-17.31.7 wrong credentials stored in credentials.cat + may lead to an endless loop. Rather than asking for the right + credentials, the stored ones are used again and again. +- zypp.conf: Introduce 'download.connect_timeout' [60 sec.] + (bsc#1208329) + Maximum time in seconds that you allow the connection phase to + the server to take. This only limits the connection phase, it has + no impact once it has connected. (see also CURLOPT_CONNECTTIMEOUT) +- commit: Try to provide /dev fs if not present (fixes #444) +- fix build with boost 1.82. +- version 17.31.11 (22) + +------------------------------------------------------------------- +Mon Apr 24 08:30:44 CEST 2023 - aschn...@suse.com + +- fix build with boost 1.82 + +------------------------------------------------------------------- Thu Apr 13 16:48:40 CEST 2023 - m...@suse.de - BuildRequires: libsolv-devel >= 0.7.24 for x86_64_v[234] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/po/nl.po new/libzypp-17.31.11/po/nl.po --- old/libzypp-17.31.10/po/nl.po 2023-03-13 16:50:22.000000000 +0100 +++ new/libzypp-17.31.11/po/nl.po 2023-04-15 23:42:04.000000000 +0200 @@ -16,7 +16,7 @@ "Project-Id-Version: zypp.nl\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-12-22 14:35+0100\n" -"PO-Revision-Date: 2023-03-10 19:14+0000\n" +"PO-Revision-Date: 2023-04-15 21:14+0000\n" "Last-Translator: Heimen Stoffels <vistau...@fastmail.com>\n" "Language-Team: Dutch <https://l10n.opensuse.org/projects/libzypp/master/nl/>" "\n" @@ -3855,7 +3855,7 @@ #: zypp/RepoManager.cc:1837 zypp/RepoManager.cc:2039 #, c-format, boost-format msgid "Can't delete '%s'" -msgstr "Kan '%s' niet verwijderen" +msgstr "â%sâ kan niet worden verwijderd" #: zypp/RepoManager.cc:2027 zypp/RepoManager.cc:2477 msgid "Can't figure out where the service is stored." @@ -4225,7 +4225,7 @@ #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" -msgstr "%s afbreken door enige van zijn afhankelijkheden te negeren" +msgstr "doorbreek â%sâ door enkele afhankelijkheden te negeren" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" @@ -4261,7 +4261,7 @@ #: zypp/solver/detail/SATResolver.cc:1154 #, boost-format msgid "problem with the installed %1%" -msgstr "probleem met de geïnstalleerde %1%" +msgstr "er is een probleem met het geïnstalleerde pakket â%1%â" #: zypp/solver/detail/SATResolver.cc:1157 msgid "conflicting requests" @@ -4529,7 +4529,7 @@ #: zypp/solver/detail/SATResolver.cc:1538 #, boost-format msgid "keep obsolete %1%" -msgstr "verouderde %1% behouden" +msgstr "behoud het verouderde pakket â%1%â" #: zypp/solver/detail/SATResolver.cc:1543 #, boost-format @@ -4591,7 +4591,7 @@ #: zypp/solver/detail/SATResolver.cc:1626 #, boost-format msgid "deinstallation of %1%" -msgstr "%1% verwijderen" +msgstr "verwijder â%1%â" #: zypp/target/RpmPostTransCollector.cc:98 #, boost-format diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/zypp/PurgeKernels.cc new/libzypp-17.31.11/zypp/PurgeKernels.cc --- old/libzypp-17.31.10/zypp/PurgeKernels.cc 2023-03-13 16:50:22.000000000 +0100 +++ new/libzypp-17.31.11/zypp/PurgeKernels.cc 2023-04-24 11:42:04.000000000 +0200 @@ -28,6 +28,7 @@ #include <sys/utsname.h> #include <functional> #include <array> +#include <climits> #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "PurgeKernels" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/zypp/RepoInfo.cc new/libzypp-17.31.11/zypp/RepoInfo.cc --- old/libzypp-17.31.10/zypp/RepoInfo.cc 2023-03-13 16:50:22.000000000 +0100 +++ new/libzypp-17.31.11/zypp/RepoInfo.cc 2023-04-28 11:42:04.000000000 +0200 @@ -1050,20 +1050,24 @@ bool RepoInfo::requireStatusWithMediaFile () const { + // We skip the check for downloading media unless a local copy of the + // media file exists and states that there is more than one medium. bool canSkipMediaCheck = std::all_of( baseUrlsBegin(), baseUrlsEnd(), []( const zypp::Url &url ) { return url.schemeIsDownloading(); }); - - const auto &mDataPath = metadataPath(); - if ( canSkipMediaCheck && !mDataPath.empty() ) { - zypp::Pathname mediafile = mDataPath/"media.1/media"; - - zypp::repo::SUSEMediaVerifier lverifier { mediafile }; - if ( lverifier ) { - canSkipMediaCheck = lverifier.totalMedia() == 1; + if ( canSkipMediaCheck ) { + const auto &mDataPath = metadataPath(); + if ( not mDataPath.empty() ) { + PathInfo mediafile { mDataPath/"media.1/media" }; + if ( mediafile.isExist() ) { + repo::SUSEMediaVerifier lverifier { mediafile.path() }; + if ( lverifier && lverifier.totalMedia() > 1 ) { + canSkipMediaCheck = false; + } + } } } - - DBG << "Can SKIP media.1/media check for status calc: " << canSkipMediaCheck << " for repo " << alias() << std::endl; - return !canSkipMediaCheck; + if ( canSkipMediaCheck ) + DBG << "Can SKIP media.1/media check for status calc of repo " << alias() << endl; + return not canSkipMediaCheck; } ///////////////////////////////////////////////////////////////// diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/zypp/media/MediaCurl.cc new/libzypp-17.31.11/zypp/media/MediaCurl.cc --- old/libzypp-17.31.10/zypp/media/MediaCurl.cc 2023-03-31 18:42:04.000000000 +0200 +++ new/libzypp-17.31.11/zypp/media/MediaCurl.cc 2023-04-28 11:42:04.000000000 +0200 @@ -429,9 +429,6 @@ } vol_settings.addHeader("Pragma:"); - _settings.setTimeout(ZConfig::instance().download_transfer_timeout()); - _settings.setConnectTimeout(CONNECT_TIMEOUT); - _settings.setUserAgentString(agentString()); // fill some settings from url query parameters @@ -744,27 +741,27 @@ Url fileurl(getFileUrl(filename)); - bool retry = false; + bool firstAuth = true; // bsc#1210870: authenticate must not return stored credentials more than once. unsigned internalTry = 0; static constexpr unsigned maxInternalTry = 3; do { - retry = false; try { doGetFileCopy( srcFile, target, report ); + break; // success! } // retry with proper authentication data catch (MediaUnauthorizedException & ex_r) { - if(authenticate(ex_r.hint(), !retry)) - retry = true; - else - { - report->finish(fileurl, zypp::media::DownloadProgressReport::ACCESS_DENIED, ex_r.asUserHistory()); - ZYPP_RETHROW(ex_r); + if ( authenticate(ex_r.hint(), firstAuth) ) { + firstAuth = false; // must not return stored credentials again + continue; // retry } + + report->finish(fileurl, zypp::media::DownloadProgressReport::ACCESS_DENIED, ex_r.asUserHistory()); + ZYPP_RETHROW(ex_r); } // unexpected exception catch (MediaException & excpt_r) @@ -774,8 +771,7 @@ if ( internalTry < maxInternalTry ) { // just report (NO_ERROR); no interactive request to the user report->problem(fileurl, media::DownloadProgressReport::NO_ERROR, excpt_r.asUserHistory()+_("Will try again...")); - retry = true; - continue; + continue; // retry } excpt_r.addHistory( str::Format(_("Giving up after %1% attempts.")) % maxInternalTry ); } @@ -790,8 +786,7 @@ ZYPP_RETHROW(excpt_r); } } - while (retry); - + while ( true ); report->finish(fileurl, zypp::media::DownloadProgressReport::NO_ERROR, ""); } @@ -1083,49 +1078,6 @@ /////////////////////////////////////////////////////////////////// - -#if DETECT_DIR_INDEX -bool MediaCurl::detectDirIndex() const -{ - if(_url.getScheme() != "http" && _url.getScheme() != "https") - return false; - // - // try to check the effective url and set the not_a_file flag - // if the url path ends with a "/", what usually means, that - // we've received a directory index (index.html content). - // - // Note: This may be dangerous and break file retrieving in - // case of some server redirections ... ? - // - bool not_a_file = false; - char *ptr = NULL; - CURLcode ret = curl_easy_getinfo( _curl, - CURLINFO_EFFECTIVE_URL, - &ptr); - if ( ret == CURLE_OK && ptr != NULL) - { - try - { - Url eurl( ptr); - std::string path( eurl.getPathName()); - if( !path.empty() && path != "/" && *path.rbegin() == '/') - { - DBG << "Effective url (" - << eurl - << ") seems to provide the index of a directory" - << endl; - not_a_file = true; - } - } - catch( ... ) - {} - } - return not_a_file; -} -#endif - -/////////////////////////////////////////////////////////////////// - void MediaCurl::doGetFileCopy( const OnMediaLocation &srcFile , const Pathname & target, callback::SendReport<DownloadProgressReport> & report, RequestOptions options ) const { Pathname dest = target.absolutename(); @@ -1332,13 +1284,6 @@ ZYPP_RETHROW(e); } } - -#if DETECT_DIR_INDEX - if (!ret && detectDirIndex()) - { - ZYPP_THROW(MediaNotAFileException(_url, filename)); - } -#endif // DETECT_DIR_INDEX } /////////////////////////////////////////////////////////////////// diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/zypp/target/TargetImpl.cc new/libzypp-17.31.11/zypp/target/TargetImpl.cc --- old/libzypp-17.31.10/zypp/target/TargetImpl.cc 2023-03-13 16:50:22.000000000 +0100 +++ new/libzypp-17.31.11/zypp/target/TargetImpl.cc 2023-04-26 18:42:04.000000000 +0200 @@ -232,21 +232,49 @@ /////////////////////////////////////////////////////////////////// namespace { + class AssertMountedBase + { + NON_COPYABLE(AssertMountedBase); + NON_MOVABLE(AssertMountedBase); + protected: + AssertMountedBase() + {} + + ~AssertMountedBase() + { + if ( ! _mountpoint.empty() ) { + // we mounted it so we unmount... + MIL << "We mounted " << _mountpoint << " so we unmount it" << endl; + execute({ "umount", "-R", "-l", _mountpoint.asString() }); + } + } + + protected: + int execute( ExternalProgram::Arguments && cmd_r ) const + { + ExternalProgram prog( cmd_r, ExternalProgram::Stderr_To_Stdout ); + for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() ) + { DBG << line; } + return prog.close(); + } + + protected: + Pathname _mountpoint; + + }; + /// \brief Try to provide /proc fs if not present. /// bsc#1181328: Some systemd tools require /proc to be mounted - class AssertProcMounted + class AssertProcMounted : private AssertMountedBase { - NON_COPYABLE(AssertProcMounted); - NON_MOVABLE(AssertProcMounted); public: - AssertProcMounted( Pathname root_r ) { root_r /= "/proc"; if ( ! PathInfo(root_r/"self").isDir() ) { MIL << "Try to make sure proc is mounted at" << root_r << endl; if ( filesystem::assert_dir(root_r) == 0 - && execute({ "mount", "-t", "proc", "proc", root_r.asString() }) == 0 ) { + && execute({ "mount", "-t", "proc", "/proc", root_r.asString() }) == 0 ) { _mountpoint = std::move(root_r); // so we'll later unmount it } else { @@ -254,28 +282,32 @@ } } } + }; - ~AssertProcMounted( ) + /// \brief Try to provide /dev fs if not present. + /// #444: Some packages expect /dev to be mounted + class AssertDevMounted : private AssertMountedBase + { + public: + AssertDevMounted( Pathname root_r ) { - if ( ! _mountpoint.empty() ) { - // we mounted it so we unmount... - MIL << "We mounted " << _mountpoint << " so we unmount it" << endl; - execute({ "umount", "-l", _mountpoint.asString() }); + root_r /= "/dev"; + if ( ! PathInfo(root_r/"null").isChr() ) { + MIL << "Try to make sure dev is mounted at" << root_r << endl; + // https://unix.stackexchange.com/questions/263972/unmount-a-rbind-mount-without-affecting-the-original-mount + // Without --make-rslave unmounting <sandbox-root>/dev/pts + // may unmount /dev/pts and you're out of ptys. + if ( filesystem::assert_dir(root_r) == 0 + && execute({ "mount", "--rbind", "--make-rslave", "/dev", root_r.asString() }) == 0 ) { + _mountpoint = std::move(root_r); // so we'll later unmount it + } + else { + WAR << "Mounting dev at " << root_r << " failed" << endl; + } } } - - private: - int execute( ExternalProgram::Arguments && cmd_r ) const - { - ExternalProgram prog( cmd_r, ExternalProgram::Stderr_To_Stdout ); - for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() ) - { DBG << line; } - return prog.close(); - } - - private: - Pathname _mountpoint; }; + } // namespace /////////////////////////////////////////////////////////////////// @@ -1582,6 +1614,7 @@ // bsc#1181328: Some systemd tools require /proc to be mounted AssertProcMounted assertProcMounted( _root ); + AssertDevMounted assertDevMounted( _root ); // also /dev RpmPostTransCollector postTransCollector( _root ); std::vector<sat::Solvable> successfullyInstalledPackages; @@ -1929,6 +1962,7 @@ // bsc#1181328: Some systemd tools require /proc to be mounted AssertProcMounted assertProcMounted( _root ); + AssertDevMounted assertDevMounted( _root ); // also /dev // Why nodeps? // diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/zypp-core/Pathname.cc new/libzypp-17.31.11/zypp-core/Pathname.cc --- old/libzypp-17.31.10/zypp-core/Pathname.cc 2023-03-13 16:50:22.000000000 +0100 +++ new/libzypp-17.31.11/zypp-core/Pathname.cc 2023-04-24 11:42:04.000000000 +0200 @@ -10,6 +10,7 @@ * */ #include <iostream> +#include <climits> #include <zypp-core/base/String.h> #include <zypp-core/Pathname.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/zypp-curl/curlhelper.cc new/libzypp-17.31.11/zypp-curl/curlhelper.cc --- old/libzypp-17.31.10/zypp-curl/curlhelper.cc 2023-03-31 18:42:04.000000000 +0200 +++ new/libzypp-17.31.11/zypp-curl/curlhelper.cc 2023-04-14 16:42:04.000000000 +0200 @@ -24,6 +24,8 @@ #include <list> #include <string> +#define TRANSFER_TIMEOUT_MAX 60 * 60 + using std::endl; using namespace zypp; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/zypp-curl/ng/network/request.cc new/libzypp-17.31.11/zypp-curl/ng/network/request.cc --- old/libzypp-17.31.10/zypp-curl/ng/network/request.cc 2023-03-31 18:42:04.000000000 +0200 +++ new/libzypp-17.31.11/zypp-curl/ng/network/request.cc 2023-04-14 16:42:04.000000000 +0200 @@ -210,9 +210,6 @@ locSet.addHeader("Pragma:"); - locSet.setTimeout( zypp::MediaConfig::instance().download_transfer_timeout() ); - locSet.setConnectTimeout( CONNECT_TIMEOUT ); - /** Force IPv4/v6 */ switch ( zypp::env::ZYPP_MEDIA_CURL_IPRESOLVE() ) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/zypp-curl/private/curlhelper_p.h new/libzypp-17.31.11/zypp-curl/private/curlhelper_p.h --- old/libzypp-17.31.10/zypp-curl/private/curlhelper_p.h 2023-03-31 18:42:04.000000000 +0200 +++ new/libzypp-17.31.11/zypp-curl/private/curlhelper_p.h 2023-04-14 16:42:04.000000000 +0200 @@ -18,10 +18,6 @@ #include <zypp-core/Url.h> #include <zypp-curl/TransferSettings> -#define CONNECT_TIMEOUT 60 -#define TRANSFER_TIMEOUT_MAX 60 * 60 -#define DETECT_DIR_INDEX 0 - #define EXPLICITLY_NO_PROXY "_none_" #undef CURLVERSION_AT_LEAST diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/zypp-curl/transfersettings.cc new/libzypp-17.31.11/zypp-curl/transfersettings.cc --- old/libzypp-17.31.10/zypp-curl/transfersettings.cc 2023-03-13 16:50:22.000000000 +0100 +++ new/libzypp-17.31.11/zypp-curl/transfersettings.cc 2023-04-14 16:42:04.000000000 +0200 @@ -37,7 +37,7 @@ public: Impl() : _useproxy( false ), _timeout( MediaConfig::instance().download_transfer_timeout() ), - _connect_timeout( 60 ), + _connect_timeout( MediaConfig::instance().download_connect_timeout() ), _maxConcurrentConnections( MediaConfig::instance().download_max_concurrent_connections() ), _minDownloadSpeed(MediaConfig::instance().download_min_download_speed()), _maxDownloadSpeed(MediaConfig::instance().download_max_download_speed()), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/zypp-media/mediaconfig.cc new/libzypp-17.31.11/zypp-media/mediaconfig.cc --- old/libzypp-17.31.10/zypp-media/mediaconfig.cc 2023-03-13 16:50:22.000000000 +0100 +++ new/libzypp-17.31.11/zypp-media/mediaconfig.cc 2023-04-28 11:42:04.000000000 +0200 @@ -25,6 +25,7 @@ , download_max_download_speed ( 0 ) , download_max_silent_tries ( 5 ) , download_transfer_timeout ( 180 ) + , download_connect_timeout ( 60 ) { } Pathname credentials_global_dir_path; @@ -35,6 +36,8 @@ int download_max_download_speed; int download_max_silent_tries; int download_transfer_timeout; + int download_connect_timeout; + }; MediaConfig::MediaConfig() : d_ptr( new MediaConfigPrivate() ) @@ -73,6 +76,12 @@ str::strtonum(value, d->download_max_silent_tries); return true; + } else if ( entry == "download.connect_timeout" ) { + str::strtonum(value, d->download_connect_timeout); + if ( d->download_connect_timeout < 0 ) + d->download_connect_timeout = 0; + return true; + } else if ( entry == "download.transfer_timeout" ) { str::strtonum(value, d->download_transfer_timeout); if ( d->download_transfer_timeout < 0 ) d->download_transfer_timeout = 0; @@ -112,6 +121,9 @@ long MediaConfig::download_transfer_timeout() const { return d_func()->download_transfer_timeout; } + long MediaConfig::download_connect_timeout() const + { return d_func()->download_connect_timeout; } + ZYPP_IMPL_PRIVATE(MediaConfig) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/zypp-media/mediaconfig.h new/libzypp-17.31.11/zypp-media/mediaconfig.h --- old/libzypp-17.31.10/zypp-media/mediaconfig.h 2023-03-13 16:50:22.000000000 +0100 +++ new/libzypp-17.31.11/zypp-media/mediaconfig.h 2023-04-14 16:42:04.000000000 +0200 @@ -85,6 +85,11 @@ */ long download_transfer_timeout() const; + /*! + * Maximum time in seconds that you allow the connection phase to the server to take. + */ + long download_connect_timeout() const; + private: MediaConfig(); std::unique_ptr<MediaConfigPrivate> d_ptr; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-17.31.10/zypp.conf new/libzypp-17.31.11/zypp.conf --- old/libzypp-17.31.10/zypp.conf 2023-03-13 16:50:22.000000000 +0100 +++ new/libzypp-17.31.11/zypp.conf 2023-04-28 11:42:04.000000000 +0200 @@ -182,6 +182,17 @@ # download.max_silent_tries = 5 ## +## Maximum time in seconds that you allow the connection phase to the server to take. +## +## This only limits the connection phase, it has no impact once it has connected. +## (see also CURLOPT_CONNECTTIMEOUT) +## +## Valid values: Integer +## Default value: 60 +## +# download.connect_timeout = 60 + +## ## Maximum time in seconds that you allow a transfer operation to take. ## ## This is useful for preventing your batch jobs from hanging for hours due