]> git.saurik.com Git - apt.git/commitdiff
improve error reporting in case of errors in combination with zlib
authorDavid Kalnischkies <kalnischkies@gmail.com>
Tue, 17 Jan 2012 23:40:38 +0000 (00:40 +0100)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Tue, 17 Jan 2012 23:40:38 +0000 (00:40 +0100)
apt-pkg/contrib/fileutl.cc
apt-pkg/contrib/mmap.cc

index b350973af5488488439351b6282c7461ffebfb68..2bbf3a1b14b4397fcff48486073fe96de5df3cec 100644 (file)
@@ -867,6 +867,7 @@ bool FileFd::Open(string FileName,unsigned int const Mode,APT::Configuration::Co
    else
       iFd = open(FileName.c_str(), fileflags, Perms);
 
+   this->FileName = FileName;
    if (iFd == -1 || OpenInternDescriptor(Mode, compressor) == false)
    {
       if (iFd != -1)
@@ -877,7 +878,6 @@ bool FileFd::Open(string FileName,unsigned int const Mode,APT::Configuration::Co
       return _error->Errno("open",_("Could not open file %s"), FileName.c_str());
    }
 
-   this->FileName = FileName;
    SetCloseExec(iFd,true);
    return true;
 }
@@ -916,13 +916,13 @@ bool FileFd::OpenDescriptor(int Fd, unsigned int const Mode, APT::Configuration:
    d->openmode = Mode;
    Flags = (AutoClose) ? FileFd::AutoClose : 0;
    iFd = Fd;
+   this->FileName = "";
    if (OpenInternDescriptor(Mode, compressor) == false)
    {
       if (AutoClose)
         close (iFd);
       return _error->Errno("gzdopen",_("Could not open file descriptor %d"), Fd);
    }
-   this->FileName = "";
    return true;
 }
 bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::Compressor const &compressor)
@@ -1057,11 +1057,21 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual)
       else
 #endif
          Res = read(iFd,To,Size);
-      if (Res < 0 && errno == EINTR)
-        continue;
+
       if (Res < 0)
       {
+        if (errno == EINTR)
+           continue;
         Flags |= Fail;
+#if APT_USE_ZLIB
+        if (d->gz != NULL)
+        {
+           int err;
+           char const * const errmsg = gzerror(d->gz, &err);
+           if (err != Z_ERRNO)
+              return _error->Error("gzread: %s (%d: %s)", _("Read error"), err, errmsg);
+        }
+#endif
         return _error->Errno("read",_("Read error"));
       }
       
@@ -1405,7 +1415,7 @@ bool FileFd::Close()
 #if APT_USE_ZLIB
       if (d != NULL && d->gz != NULL) {
         int const e = gzclose(d->gz);
-        // gzdopen() on empty files always fails with "buffer error" here, ignore that
+        // gzdclose() on empty files always fails with "buffer error" here, ignore that
         if (e != 0 && e != Z_BUF_ERROR)
            Res &= _error->Errno("close",_("Problem closing the gzip file %s"), FileName.c_str());
       } else
index a67ab36985d6037177b2c3a907f4a187ae302e9c..160718ea5ae503caf1848afd63514fbeae0d9a4d 100644 (file)
@@ -85,7 +85,7 @@ bool MMap::Map(FileFd &Fd)
         return _error->Error("Compressed file %s can only be mapped readonly", Fd.Name().c_str());
       Base = new unsigned char[iSize];
       if (Fd.Seek(0L) == false || Fd.Read(Base, iSize) == false)
-        return false;
+        return _error->Error("Compressed file %s can't be read into mmap", Fd.Name().c_str());
       return true;
    }