From 6858104c2a811c5353e4351dec0611244ee2bcac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ladislav=20Slez=C3=A1k?= Date: Wed, 21 Jun 2017 14:48:23 +0200 Subject: [PATCH] Do not crash when the repository URL is not defined (bsc#1043218) - 3.2.4 --- package/yast2-pkg-bindings-devel-doc.spec | 2 +- package/yast2-pkg-bindings.changes | 6 +++++ package/yast2-pkg-bindings.spec | 2 +- src/Callbacks.cc | 27 +++------------------- src/Package.cc | 6 +---- src/Source_Create.cc | 2 +- src/Source_Get.cc | 4 ++-- src/Source_Load.cc | 22 ++++++++++++++---- src/Source_Resolvables.cc | 28 +++++++++++++++-------- src/YRepo.cc | 4 ++-- 10 files changed, 52 insertions(+), 51 deletions(-) diff --git a/package/yast2-pkg-bindings-devel-doc.spec b/package/yast2-pkg-bindings-devel-doc.spec index ec6fa83c..1c5ba532 100644 --- a/package/yast2-pkg-bindings-devel-doc.spec +++ b/package/yast2-pkg-bindings-devel-doc.spec @@ -16,7 +16,7 @@ # Name: yast2-pkg-bindings-devel-doc -Version: 3.2.3 +Version: 3.2.4 Release: 0 License: GPL-2.0 Group: Documentation/HTML diff --git a/package/yast2-pkg-bindings.changes b/package/yast2-pkg-bindings.changes index 34c203bb..f1abe322 100644 --- a/package/yast2-pkg-bindings.changes +++ b/package/yast2-pkg-bindings.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Jun 21 12:16:39 UTC 2017 - lslezak@suse.cz + +- Do not crash when the repository URL is not defined (bsc#1043218) +- 3.2.4 + ------------------------------------------------------------------- Fri Jun 2 08:42:12 UTC 2017 - igonzalezsosa@suse.com diff --git a/package/yast2-pkg-bindings.spec b/package/yast2-pkg-bindings.spec index 578bfa9e..aeeb3831 100644 --- a/package/yast2-pkg-bindings.spec +++ b/package/yast2-pkg-bindings.spec @@ -17,7 +17,7 @@ Name: yast2-pkg-bindings -Version: 3.2.3 +Version: 3.2.4 Release: 0 BuildRoot: %{_tmppath}/%{name}-%{version}-build diff --git a/src/Callbacks.cc b/src/Callbacks.cc index 74ac463a..a3ff6be9 100644 --- a/src/Callbacks.cc +++ b/src/Callbacks.cc @@ -1464,14 +1464,7 @@ namespace ZyppRecipients { if (callback._set) { callback.addInt(_pkg_ref.logFindAlias(repo.alias())); - - std::string url; - if (repo.baseUrlsBegin() != repo.baseUrlsEnd()) - { - url = repo.baseUrlsBegin()->asString(); - } - - callback.addStr(url); + callback.addStr(repo.url().asString()); callback.addStr(task.name()); callback.evaluate(); @@ -1528,14 +1521,7 @@ namespace ZyppRecipients { { // search Yast source ID callback.addInt(_pkg_ref.logFindAlias(source.info().alias())); - - std::string url; - if (source.info().baseUrlsBegin() != source.info().baseUrlsEnd()) - { - url = source.info().baseUrlsBegin()->asString(); - } - - callback.addStr(url); + callback.addStr(source.info().url().asString()); callback.addSymbol(SrcReportErrorAsString(error)); callback.addStr(description); @@ -1564,14 +1550,7 @@ namespace ZyppRecipients { { // search Yast source ID callback.addInt(_pkg_ref.logFindAlias(source.info().alias())); - - std::string url; - if (source.info().baseUrlsBegin() != source.info().baseUrlsEnd()) - { - url = source.info().baseUrlsBegin()->asString(); - } - callback.addStr(url); - + callback.addStr(source.info().url().asString()); callback.addStr(task); callback.addSymbol(SrcReportErrorAsString(error)); callback.addStr(reason); diff --git a/src/Package.cc b/src/Package.cc index 17524eff..5f67ecfa 100644 --- a/src/Package.cc +++ b/src/Package.cc @@ -230,11 +230,7 @@ PkgFunctions::PkgMediaNames () y2warning("Name of repository '%lld' is empty, using URL", index); // use URL as the product name - std::string name; - if ((*repoit)->repoInfo().baseUrlsBegin() != (*repoit)->repoInfo().baseUrlsEnd()) - { - name = (*repoit)->repoInfo().baseUrlsBegin()->asString(); - } + std::string name((*repoit)->repoInfo().url().asString()); // use alias if url is unknown if (name.empty()) diff --git a/src/Source_Create.cc b/src/Source_Create.cc index 2987413d..09f8b6f6 100644 --- a/src/Source_Create.cc +++ b/src/Source_Create.cc @@ -302,7 +302,7 @@ PkgFunctions::createManagedSource( const zypp::Url & url_r, y2milestone("Added source '%s': '%s', enabled: %s, autorefresh: %s", repo.alias().c_str(), - repo.baseUrlsBegin()->asString().c_str(), + repo.url().asString().c_str(), repo.enabled() ? "true" : "false", repo.autorefresh() ? "true" : "false" ); diff --git a/src/Source_Get.cc b/src/Source_Get.cc index 2d6da247..0faeb8ef 100644 --- a/src/Source_Get.cc +++ b/src/Source_Get.cc @@ -283,9 +283,9 @@ PkgFunctions::SourceMediaData (const YCPInteger& id) y2warning("Pkg::SourceMediaData() doesn't return \"media_id\" and \"media_vendor\" values anymore."); // SourceMediaData returns URLs without password - if (repo->repoInfo().baseUrlsBegin() != repo->repoInfo().baseUrlsEnd()) + if (!repo->repoInfo().baseUrlsEmpty()) { - data->add( YCPString("url"), YCPString(repo->repoInfo().baseUrlsBegin()->asString())); + data->add( YCPString("url"), YCPString(repo->repoInfo().url().asString())); // add all base URLs YCPList base_urls; diff --git a/src/Source_Load.cc b/src/Source_Load.cc index 26203c55..779e658c 100644 --- a/src/Source_Load.cc +++ b/src/Source_Load.cc @@ -267,8 +267,14 @@ PkgFunctions::SourceLoadImpl(PkgProgress &progress) // do not autorefresh remote repositories when the network is not running if (!network_is_running) { - zypp::Url url = *((*it)->repoInfo().baseUrlsBegin()); - + if ((*it)->repoInfo().baseUrlsEmpty()) + { + y2warning("No URL defined, skipping repository '%s'", (*it)->repoInfo().alias().c_str()); + continue; + } + + zypp::Url url = (*it)->repoInfo().url(); + if (remoteRepo(url)) { y2warning("No network connection, skipping autorefresh of remote repository %s (%s)", @@ -286,11 +292,17 @@ PkgFunctions::SourceLoadImpl(PkgProgress &progress) refresh_started_called = true; } - zypp::RepoManager::RefreshCheckStatus ref_stat = repomanager->checkIfToRefreshMetadata((*it)->repoInfo(), *((*it)->repoInfo().baseUrlsBegin())); + if ((*it)->repoInfo().baseUrlsEmpty()) + { + y2milestone("Skipping repository '%s' - URL not defined", (*it)->repoInfo().alias().c_str()); + continue; + } + + zypp::RepoManager::RefreshCheckStatus ref_stat = repomanager->checkIfToRefreshMetadata((*it)->repoInfo(), (*it)->repoInfo().url()); if (ref_stat != zypp::RepoManager::REFRESH_NEEDED) { - y2internal("Skipping repository '%s' - refresh is not needed", (*it)->repoInfo().alias().c_str()); + y2milestone("Skipping repository '%s' - refresh is not needed", (*it)->repoInfo().alias().c_str()); continue; } @@ -478,7 +490,7 @@ PkgFunctions::SourceStartManager (const YCPBoolean& enable) stages.push_back(_("Refresh Sources")); stages.push_back(_("Rebuild Cache")); stages.push_back(_("Load Data")); - + // 3 steps per repository (download, cache rebuild, load resolvables) pkgprogress.Start(_("Loading the Package Manager..."), stages, _(HelpTexts::load_resolvables)); } diff --git a/src/Source_Resolvables.cc b/src/Source_Resolvables.cc index c1a5a0fc..c0a45a0d 100644 --- a/src/Source_Resolvables.cc +++ b/src/Source_Resolvables.cc @@ -71,7 +71,7 @@ bool PkgFunctions::LoadResolvablesFrom(YRepo_Ptr repo, const zypp::ProgressData: prog.sendTo(progressrcv); zypp::CombinedProgressData load_subprogress(prog, 100); - try + try { zypp::RepoManager* repomanager = CreateRepoManager(); bool refresh = true; @@ -84,15 +84,23 @@ bool PkgFunctions::LoadResolvablesFrom(YRepo_Ptr repo, const zypp::ProgressData: { if (network_check) { - zypp::Url url = *(repoinfo.baseUrlsBegin()); - - if (remoteRepo(url) && !NetworkDetected()) - { - y2warning("No network connection, skipping autorefresh of remote repository %s (%s)", - repoinfo.alias().c_str(), url.asString().c_str()); - - refresh = false; - } + if (repoinfo.baseUrlsEmpty()) + { + y2milestone("No URL defined, skipping repository '%s'", repoinfo.alias().c_str()); + refresh = false; + } + else + { + zypp::Url url = repoinfo.url(); + + if (remoteRepo(url) && !NetworkDetected()) + { + y2warning("No network connection, skipping autorefresh of remote repository %s (%s)", + repoinfo.alias().c_str(), url.asString().c_str()); + + refresh = false; + } + } } if (refresh) diff --git a/src/YRepo.cc b/src/YRepo.cc index 79760d89..3739f795 100644 --- a/src/YRepo.cc +++ b/src/YRepo.cc @@ -52,8 +52,8 @@ zypp::MediaSetAccess_Ptr & YRepo::mediaAccess() if (!_maccess) { y2milestone("Creating new MediaSetAccess for url %s", - (*_repo.baseUrlsBegin()).asString().c_str()); - _maccess = new zypp::MediaSetAccess(_repo.name(), *_repo.baseUrlsBegin()); // FIXME handle multiple baseUrls + _repo.url().asString().c_str()); + _maccess = new zypp::MediaSetAccess(_repo.name(), _repo.url()); // FIXME handle multiple baseUrls } return _maccess;