From: Michael Vogt <mvo@ubuntu.com>
Date: Tue, 7 Oct 2014 20:36:09 +0000 (+0200)
Subject: Send "Fail-Reason: MaximumSizeExceeded" from the method
X-Git-Tag: 1.1.exp4~5^2~2
X-Git-Url: https://git.saurik.com/apt.git/commitdiff_plain/ee27950632c149bb14c9c490e92147579ba4fc2a?hp=--cc

Send "Fail-Reason: MaximumSizeExceeded" from the method

Communicate the fail reason from the methods to the parent
and Rename() failed files.
---

ee27950632c149bb14c9c490e92147579ba4fc2a
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