diff options
author | David Kalnischkies <david@kalnischkies.de> | 2016-05-03 23:22:53 +0200 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2016-05-03 23:37:43 +0200 |
commit | 84ac6edfabe1c92d67e8d441e04216ad33c89165 (patch) | |
tree | 10a16608a633aef468e76273c81313493b10adcb | |
parent | ad24ea39b5dd0ce990a20a60b888511261ec21e1 (diff) |
allow redirection for items without a space in the desc again
Broken in a4b8112b19763cbd2c12b81d55bc7d43a591d610.
If an item has a description which includes no space and is redirected
to another mirror the code which wants to rewrite the description
expects a space in there, but can't find it and the unguarded substr
command on the string will fail with an exception thrown…
Guarding it properly and everything is fine.
-rw-r--r-- | apt-pkg/acquire-worker.cc | 19 | ||||
-rwxr-xr-x | test/integration/test-handle-redirect-as-used-mirror-change | 3 |
2 files changed, 14 insertions, 8 deletions
diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc index 69ca6a28e..2ad0eda7f 100644 --- a/apt-pkg/acquire-worker.cc +++ b/apt-pkg/acquire-worker.cc @@ -273,16 +273,19 @@ bool pkgAcquire::Worker::RunMessages() // if we change site, treat it as a mirror change if (URI::SiteOnly(NewURI) != URI::SiteOnly(desc.URI)) { - std::string const OldSite = desc.Description.substr(0, desc.Description.find(" ")); - if (likely(APT::String::Startswith(desc.URI, OldSite))) + auto const firstSpace = desc.Description.find(" "); + if (firstSpace != std::string::npos) { - std::string const OldExtra = desc.URI.substr(OldSite.length() + 1); - if (likely(APT::String::Endswith(NewURI, OldExtra))) + std::string const OldSite = desc.Description.substr(0, firstSpace); + if (likely(APT::String::Startswith(desc.URI, OldSite))) { - std::string const NewSite = NewURI.substr(0, NewURI.length() - OldExtra.length()); - Owner->UsedMirror = URI::ArchiveOnly(NewSite); - if (desc.Description.find(" ") != string::npos) - desc.Description.replace(0, desc.Description.find(" "), Owner->UsedMirror); + std::string const OldExtra = desc.URI.substr(OldSite.length() + 1); + if (likely(APT::String::Endswith(NewURI, OldExtra))) + { + std::string const NewSite = NewURI.substr(0, NewURI.length() - OldExtra.length()); + Owner->UsedMirror = URI::ArchiveOnly(NewSite); + desc.Description.replace(0, firstSpace, Owner->UsedMirror); + } } } } diff --git a/test/integration/test-handle-redirect-as-used-mirror-change b/test/integration/test-handle-redirect-as-used-mirror-change index e9370930a..f4a240323 100755 --- a/test/integration/test-handle-redirect-as-used-mirror-change +++ b/test/integration/test-handle-redirect-as-used-mirror-change @@ -37,3 +37,6 @@ Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/InRelease Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/main/source/Sources.gz Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/main/binary-all/Packages.gz Location: http://0.0.0.0:${APTHTTPPORT}/dists/unstable/main/i18n/Translation-en.gz" grep '^Location:' aptarchive/webserver.log + +testsuccess apthelper download-file "http://localhost:${APTHTTPPORT}/redirectme/dists/unstable/InRelease" inrelease +testsuccess test -s inrelease |