summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <mvo@ubuntu.com>2014-10-07 22:36:09 +0200
committerMichael Vogt <mvo@ubuntu.com>2014-10-07 22:36:09 +0200
commitee27950632c149bb14c9c490e92147579ba4fc2a (patch)
tree2ad71178166534b7ebfd2813e7376139e1ec0de6
parent27e6c17a18216e2a02de39a6d1722b83ac823d42 (diff)
Send "Fail-Reason: MaximumSizeExceeded" from the method
Communicate the fail reason from the methods to the parent and Rename() failed files.
-rw-r--r--apt-pkg/acquire-item.cc6
-rw-r--r--methods/ftp.cc8
-rw-r--r--methods/ftp.h3
-rw-r--r--methods/http.cc1
-rw-r--r--methods/https.cc4
-rwxr-xr-xtest/integration/test-apt-update-expected-size5
6 files changed, 21 insertions, 6 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc
index 1dcbde223..f630129b9 100644
--- a/apt-pkg/acquire-item.cc
+++ b/apt-pkg/acquire-item.cc
@@ -148,8 +148,12 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
else
Status = StatIdle;
- // report mirror failure back to LP if we actually use a mirror
+ // check fail reason
string FailReason = LookupTag(Message, "FailReason");
+ if(FailReason == "MaximumSizeExceeded")
+ Rename(DestFile, DestFile+".FAILED");
+
+ // report mirror failure back to LP if we actually use a mirror
if(FailReason.size() != 0)
ReportMirrorFailure(FailReason);
else
diff --git a/methods/ftp.cc b/methods/ftp.cc
index bc84dda7d..5b739ea06 100644
--- a/methods/ftp.cc
+++ b/methods/ftp.cc
@@ -849,7 +849,8 @@ bool FTPConn::Finalize()
/* This opens a data connection, sends REST and RETR and then
transfers the file over. */
bool FTPConn::Get(const char *Path,FileFd &To,unsigned long long Resume,
- Hashes &Hash,bool &Missing, unsigned long long MaximumSize)
+ Hashes &Hash,bool &Missing, unsigned long long MaximumSize,
+ pkgAcqMethod *Owner)
{
Missing = false;
if (CreateDataFd() == false)
@@ -925,8 +926,11 @@ bool FTPConn::Get(const char *Path,FileFd &To,unsigned long long Resume,
}
if (MaximumSize > 0 && To.Tell() > MaximumSize)
+ {
+ Owner->SetFailReason("MaximumSizeExceeded");
return _error->Error("Writing more data than expected (%llu > %llu)",
To.Tell(), MaximumSize);
+ }
}
// All done
@@ -1067,7 +1071,7 @@ bool FtpMethod::Fetch(FetchItem *Itm)
FailFd = Fd.Fd();
bool Missing;
- if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing,Itm->MaximumSize) == false)
+ if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing,Itm->MaximumSize,this) == false)
{
Fd.Close();
diff --git a/methods/ftp.h b/methods/ftp.h
index a31ebc999..2efd28ec6 100644
--- a/methods/ftp.h
+++ b/methods/ftp.h
@@ -62,7 +62,8 @@ class FTPConn
bool Size(const char *Path,unsigned long long &Size);
bool ModTime(const char *Path, time_t &Time);
bool Get(const char *Path,FileFd &To,unsigned long long Resume,
- Hashes &MD5,bool &Missing, unsigned long long MaximumSize);
+ Hashes &MD5,bool &Missing, unsigned long long MaximumSize,
+ pkgAcqMethod *Owner);
FTPConn(URI Srv);
~FTPConn();
diff --git a/methods/http.cc b/methods/http.cc
index f8faa0cf8..c00b439b7 100644
--- a/methods/http.cc
+++ b/methods/http.cc
@@ -657,6 +657,7 @@ bool HttpServerState::Go(bool ToFile, FileFd * const File)
if (MaximumSize > 0 && File && File->Tell() > MaximumSize)
{
+ Owner->SetFailReason("MaximumSizeExceeded");
return _error->Error("Writing more data than expected (%llu > %llu)",
File->Tell(), MaximumSize);
}
diff --git a/methods/https.cc b/methods/https.cc
index 787e4a507..16d564b34 100644
--- a/methods/https.cc
+++ b/methods/https.cc
@@ -83,9 +83,11 @@ HttpsMethod::write_data(void *buffer, size_t size, size_t nmemb, void *userp)
return false;
if(me->Queue->MaximumSize > 0 && me->File->Tell() > me->Queue->MaximumSize)
+ {
+ me->SetFailReason("MaximumSizeExceeded");
return _error->Error("Writing more data than expected (%llu > %llu)",
me->TotalWritten, me->Queue->MaximumSize);
-
+ }
return size*nmemb;
}
diff --git a/test/integration/test-apt-update-expected-size b/test/integration/test-apt-update-expected-size
index f8ec24dcc..58920f544 100755
--- a/test/integration/test-apt-update-expected-size
+++ b/test/integration/test-apt-update-expected-size
@@ -19,7 +19,7 @@ testsuccess aptget update
mv aptarchive/dists/unstable/InRelease aptarchive/dists/unstable/InRelease.good
dd if=/dev/zero of=aptarchive/dists/unstable/InRelease bs=1M count=2 2>/dev/null
touch -d '+1hour' aptarchive/dists/unstable/InRelease
-aptget update -o acquire::MaxReleaseFileSize=$((1*1000*1000)) -o Debug::pkgAcquire::worker=0 > output.log
+aptget update -o Apt::Get::List-Cleanup=0 -o acquire::MaxReleaseFileSize=$((1*1000*1000)) -o Debug::pkgAcquire::worker=0 > output.log
msgtest 'Check that the max write warning is triggered'
if grep -q "Writing more data than expected" output.log; then
msgpass
@@ -27,8 +27,11 @@ else
cat output.log
msgfail
fi
+# ensure the failed InRelease file got renamed
+testsuccess ls rootdir/var/lib/apt/lists/partial/*InRelease.FAILED
mv aptarchive/dists/unstable/InRelease.good aptarchive/dists/unstable/InRelease
+
# append junk at the end of the Packages.gz/Packages
SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages)"
echo "1234567890" >> aptarchive/dists/unstable/main/binary-i386/Packages.gz