]> git.saurik.com Git - apt.git/blobdiff - methods/ftp.cc
dispose http(s) 416 error page as non-content
[apt.git] / methods / ftp.cc
index 5a87ded1c43d3e0265f9b78bec5b0e766338b826..0504e58724f253025f1191282d2e0803af59b1f9 100644 (file)
 #include <apt-pkg/hashes.h>
 #include <apt-pkg/netrc.h>
 #include <apt-pkg/configuration.h>
+#include <apt-pkg/strutl.h>
 
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <unistd.h>
@@ -42,6 +46,7 @@
 #include "rfc2553emu.h"
 #include "connect.h"
 #include "ftp.h"
+
 #include <apti18n.h>
                                                                        /*}}}*/
 
@@ -70,9 +75,10 @@ time_t FtpMethod::FailTime = 0;
 // FTPConn::FTPConn - Constructor                                      /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-FTPConn::FTPConn(URI Srv) : Len(0), ServerFd(-1), DataFd(-1), 
+FTPConn::FTPConn(URI Srv) : Len(0), ServerFd(-1), DataFd(-1),
                             DataListenFd(-1), ServerName(Srv),
-                           ForceExtended(false), TryPassive(true)
+                           ForceExtended(false), TryPassive(true),
+                           PeerAddrLen(0), ServerAddrLen(0)
 {
    Debug = _config->FindB("Debug::Acquire::Ftp",false);
    PasvAddr = 0;
@@ -843,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)
+                 Hashes &Hash,bool &Missing, unsigned long long MaximumSize,
+                  pkgAcqMethod *Owner)
 {
    Missing = false;
    if (CreateDataFd() == false)
@@ -916,7 +923,14 @@ bool FTPConn::Get(const char *Path,FileFd &To,unsigned long long Resume,
       {
         Close();
         return false;
-      }      
+      }
+
+      if (MaximumSize > 0 && To.Tell() > MaximumSize)
+      {
+         Owner->SetFailReason("MaximumSizeExceeded");
+         return _error->Error("Writing more data than expected (%llu > %llu)",
+                              To.Tell(), MaximumSize);
+      }
    }
 
    // All done
@@ -974,6 +988,10 @@ bool FtpMethod::Configuration(string Message)
       return false;
    
    TimeOut = _config->FindI("Acquire::Ftp::Timeout",TimeOut);
+
+   // no more active ftp, sorry
+   DropPrivsOrDie();
+
    return true;
 }
                                                                        /*}}}*/
@@ -1057,7 +1075,7 @@ bool FtpMethod::Fetch(FetchItem *Itm)
       FailFd = Fd.Fd();
       
       bool Missing;
-      if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing) == false)
+      if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing,Itm->MaximumSize,this) == false)
       {
         Fd.Close();
 
@@ -1098,7 +1116,7 @@ bool FtpMethod::Fetch(FetchItem *Itm)
 }
                                                                        /*}}}*/
 
-int main(int argc,const char *argv[])
+int main(intconst char *argv[])
 { 
    setlocale(LC_ALL, "");
 
@@ -1126,6 +1144,6 @@ int main(int argc,const char *argv[])
    }
    
    FtpMethod Mth;
-   
+
    return Mth.Run();
 }