summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2016-07-29 21:39:20 +0200
committerJulian Andres Klode <jak@debian.org>2016-10-05 12:02:19 +0200
commit1b63558a39ee1eed7eb024cd0e164d73beb165b1 (patch)
treeb902625038ce6ff4d1ae999a8f9017cd4daf105f
parentdf47efeb5764bba8ac4789727f9ffe970e5cd756 (diff)
if the FileFd failed already following calls should fail, too
There is no point in trying to perform Write/Read on a FileFd which already failed as they aren't going to work as expected, so we should make sure that they fail early on and hard. (cherry picked from commit 02c38073af51802c02bb104d4450e0e112d641ad)
-rw-r--r--apt-pkg/contrib/fileutl.cc18
1 files changed, 10 insertions, 8 deletions
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc
index 76eb6c7f0..b8409c35d 100644
--- a/apt-pkg/contrib/fileutl.cc
+++ b/apt-pkg/contrib/fileutl.cc
@@ -2375,7 +2375,7 @@ FileFd::~FileFd()
gracefully. */
bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual)
{
- if (d == nullptr)
+ if (d == nullptr || Failed())
return false;
ssize_t Res = 1;
errno = 0;
@@ -2426,7 +2426,7 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual)
char* FileFd::ReadLine(char *To, unsigned long long const Size)
{
*To = '\0';
- if (d == nullptr)
+ if (d == nullptr || Failed())
return nullptr;
return d->InternalReadLine(To, Size);
}
@@ -2434,6 +2434,8 @@ char* FileFd::ReadLine(char *To, unsigned long long const Size)
// FileFd::Flush - Flush the file /*{{{*/
bool FileFd::Flush()
{
+ if (Failed())
+ return false;
if (d == nullptr)
return true;
@@ -2443,7 +2445,7 @@ bool FileFd::Flush()
// FileFd::Write - Write to the file /*{{{*/
bool FileFd::Write(const void *From,unsigned long long Size)
{
- if (d == nullptr)
+ if (d == nullptr || Failed())
return false;
ssize_t Res = 1;
errno = 0;
@@ -2499,7 +2501,7 @@ bool FileFd::Write(int Fd, const void *From, unsigned long long Size)
// FileFd::Seek - Seek in the file /*{{{*/
bool FileFd::Seek(unsigned long long To)
{
- if (d == nullptr)
+ if (d == nullptr || Failed())
return false;
Flags &= ~HitEof;
return d->InternalSeek(To);
@@ -2508,7 +2510,7 @@ bool FileFd::Seek(unsigned long long To)
// FileFd::Skip - Skip over data in the file /*{{{*/
bool FileFd::Skip(unsigned long long Over)
{
- if (d == nullptr)
+ if (d == nullptr || Failed())
return false;
return d->InternalSkip(Over);
}
@@ -2516,7 +2518,7 @@ bool FileFd::Skip(unsigned long long Over)
// FileFd::Truncate - Truncate the file /*{{{*/
bool FileFd::Truncate(unsigned long long To)
{
- if (d == nullptr)
+ if (d == nullptr || Failed())
return false;
// truncating /dev/null is always successful - as we get an error otherwise
if (To == 0 && FileName == "/dev/null")
@@ -2529,7 +2531,7 @@ bool FileFd::Truncate(unsigned long long To)
/* */
unsigned long long FileFd::Tell()
{
- if (d == nullptr)
+ if (d == nullptr || Failed())
return false;
off_t const Res = d->InternalTell();
if (Res == (off_t)-1)
@@ -2592,7 +2594,7 @@ time_t FileFd::ModificationTime()
unsigned long long FileFd::Size()
{
if (d == nullptr)
- return false;
+ return 0;
return d->InternalSize();
}
/*}}}*/