summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <kalnischkies@gmail.com>2012-05-10 03:09:18 +0200
committerDavid Kalnischkies <kalnischkies@gmail.com>2012-05-10 03:09:18 +0200
commitff477ee133fb448622cc86f658f1a9b23577e413 (patch)
tree22579678af4ee84f4afe793381a84f9307f313de
parentf0e835998f21c315c5154da4e7f5c51b18929b3a (diff)
ensure that d is set before accessing it
-rw-r--r--apt-pkg/contrib/fileutl.cc91
-rw-r--r--debian/changelog1
2 files changed, 51 insertions, 41 deletions
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc
index 7a24b6bb0..c8e685a5a 100644
--- a/apt-pkg/contrib/fileutl.cc
+++ b/apt-pkg/contrib/fileutl.cc
@@ -1011,16 +1011,18 @@ bool FileFd::OpenDescriptor(int Fd, unsigned int const Mode, APT::Configuration:
}
bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::Compressor const &compressor)
{
+ if (compressor.Name == "." || compressor.Binary.empty() == true)
+ return true;
+
if (d == NULL)
{
d = new FileFdPrivate();
d->openmode = Mode;
d->compressor = compressor;
}
- if (compressor.Name == "." || compressor.Binary.empty() == true)
- return true;
+
#ifdef HAVE_ZLIB
- else if (compressor.Name == "gzip")
+ if (compressor.Name == "gzip")
{
if (d->gz != NULL)
{
@@ -1040,7 +1042,7 @@ bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::C
}
#endif
#ifdef HAVE_BZ2
- else if (compressor.Name == "bzip2")
+ if (compressor.Name == "bzip2")
{
if (d->bz2 != NULL)
{
@@ -1185,12 +1187,12 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual)
do
{
#ifdef HAVE_ZLIB
- if (d->gz != NULL)
+ if (d != NULL && d->gz != NULL)
Res = gzread(d->gz,To,Size);
else
#endif
#ifdef HAVE_BZ2
- if (d->bz2 != NULL)
+ if (d != NULL && d->bz2 != NULL)
Res = BZ2_bzread(d->bz2,To,Size);
else
#endif
@@ -1202,7 +1204,7 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual)
continue;
Flags |= Fail;
#ifdef HAVE_ZLIB
- if (d->gz != NULL)
+ if (d != NULL && d->gz != NULL)
{
int err;
char const * const errmsg = gzerror(d->gz, &err);
@@ -1211,7 +1213,7 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual)
}
#endif
#ifdef HAVE_BZ2
- if (d->bz2 != NULL)
+ if (d != NULL && d->bz2 != NULL)
{
int err;
char const * const errmsg = BZ2_bzerror(d->bz2, &err);
@@ -1224,7 +1226,8 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual)
To = (char *)To + Res;
Size -= Res;
- d->seekpos += Res;
+ if (d != NULL)
+ d->seekpos += Res;
if (Actual != 0)
*Actual += Res;
}
@@ -1252,7 +1255,7 @@ char* FileFd::ReadLine(char *To, unsigned long long const Size)
{
*To = '\0';
#ifdef HAVE_ZLIB
- if (d->gz != NULL)
+ if (d != NULL && d->gz != NULL)
return gzgets(d->gz, To, Size);
#endif
@@ -1283,12 +1286,12 @@ bool FileFd::Write(const void *From,unsigned long long Size)
do
{
#ifdef HAVE_ZLIB
- if (d->gz != NULL)
+ if (d != NULL && d->gz != NULL)
Res = gzwrite(d->gz,From,Size);
else
#endif
#ifdef HAVE_BZ2
- if (d->bz2 != NULL)
+ if (d != NULL && d->bz2 != NULL)
Res = BZ2_bzwrite(d->bz2,(void*)From,Size);
else
#endif
@@ -1299,7 +1302,7 @@ bool FileFd::Write(const void *From,unsigned long long Size)
{
Flags |= Fail;
#ifdef HAVE_ZLIB
- if (d->gz != NULL)
+ if (d != NULL && d->gz != NULL)
{
int err;
char const * const errmsg = gzerror(d->gz, &err);
@@ -1308,7 +1311,7 @@ bool FileFd::Write(const void *From,unsigned long long Size)
}
#endif
#ifdef HAVE_BZ2
- if (d->bz2 != NULL)
+ if (d != NULL && d->bz2 != NULL)
{
int err;
char const * const errmsg = BZ2_bzerror(d->bz2, &err);
@@ -1321,7 +1324,8 @@ bool FileFd::Write(const void *From,unsigned long long Size)
From = (char *)From + Res;
Size -= Res;
- d->seekpos += Res;
+ if (d != NULL)
+ d->seekpos += Res;
}
while (Res > 0 && Size > 0);
@@ -1359,11 +1363,11 @@ bool FileFd::Write(int Fd, const void *From, unsigned long long Size)
/* */
bool FileFd::Seek(unsigned long long To)
{
- if (d->pipe == true
+ if (d != NULL && (d->pipe == true
#ifdef HAVE_BZ2
- || d->bz2 != NULL
+ || d->bz2 != NULL
#endif
- )
+ ))
{
// Our poor man seeking in pipes is costly, so try to avoid it
unsigned long long seekpos = Tell();
@@ -1414,7 +1418,7 @@ bool FileFd::Seek(unsigned long long To)
}
int res;
#ifdef HAVE_ZLIB
- if (d->gz)
+ if (d != NULL && d->gz)
res = gzseek(d->gz,To,SEEK_SET);
else
#endif
@@ -1425,7 +1429,8 @@ bool FileFd::Seek(unsigned long long To)
return _error->Error("Unable to seek to %llu", To);
}
- d->seekpos = To;
+ if (d != NULL)
+ d->seekpos = To;
return true;
}
/*}}}*/
@@ -1434,11 +1439,11 @@ bool FileFd::Seek(unsigned long long To)
/* */
bool FileFd::Skip(unsigned long long Over)
{
- if (d->pipe == true
+ if (d != NULL && (d->pipe == true
#ifdef HAVE_BZ2
- || d->bz2 != NULL
+ || d->bz2 != NULL
#endif
- )
+ ))
{
d->seekpos += Over;
char buffer[1024];
@@ -1457,7 +1462,7 @@ bool FileFd::Skip(unsigned long long Over)
int res;
#ifdef HAVE_ZLIB
- if (d->gz != NULL)
+ if (d != NULL && d->gz != NULL)
res = gzseek(d->gz,Over,SEEK_CUR);
else
#endif
@@ -1467,7 +1472,8 @@ bool FileFd::Skip(unsigned long long Over)
Flags |= Fail;
return _error->Error("Unable to seek ahead %llu",Over);
}
- d->seekpos = res;
+ if (d != NULL)
+ d->seekpos = res;
return true;
}
@@ -1478,7 +1484,7 @@ bool FileFd::Skip(unsigned long long Over)
bool FileFd::Truncate(unsigned long long To)
{
#if defined HAVE_ZLIB || defined HAVE_BZ2
- if (d->gz != NULL || d->bz2 != NULL)
+ if (d != NULL && (d->gz != NULL || d->bz2 != NULL))
{
Flags |= Fail;
return _error->Error("Truncating compressed files is not implemented (%s)", FileName.c_str());
@@ -1502,16 +1508,16 @@ unsigned long long FileFd::Tell()
// seeking around, but not all users of FileFd use always Seek() and co
// so d->seekpos isn't always true and we can just use it as a hint if
// we have nothing else, but not always as an authority…
- if (d->pipe == true
+ if (d != NULL && (d->pipe == true
#ifdef HAVE_BZ2
- || d->bz2 != NULL
+ || d->bz2 != NULL
#endif
- )
+ ))
return d->seekpos;
off_t Res;
#ifdef HAVE_ZLIB
- if (d->gz != NULL)
+ if (d != NULL && d->gz != NULL)
Res = gztell(d->gz);
else
#endif
@@ -1521,7 +1527,8 @@ unsigned long long FileFd::Tell()
Flags |= Fail;
_error->Errno("lseek","Failed to determine the current file position");
}
- d->seekpos = Res;
+ if (d != NULL)
+ d->seekpos = Res;
return Res;
}
/*}}}*/
@@ -1531,18 +1538,19 @@ unsigned long long FileFd::Tell()
unsigned long long FileFd::FileSize()
{
struct stat Buf;
- if (d->pipe == false && fstat(iFd,&Buf) != 0)
+ if ((d == NULL || d->pipe == false) && fstat(iFd,&Buf) != 0)
{
Flags |= Fail;
return _error->Errno("fstat","Unable to determine the file size");
}
// for compressor pipes st_size is undefined and at 'best' zero
- if (d->pipe == true || S_ISFIFO(Buf.st_mode))
+ if ((d != NULL && d->pipe == true) || S_ISFIFO(Buf.st_mode))
{
// we set it here, too, as we get the info here for free
// in theory the Open-methods should take care of it already
- d->pipe = true;
+ if (d != NULL)
+ d->pipe = true;
if (stat(FileName.c_str(), &Buf) != 0)
{
Flags |= Fail;
@@ -1562,11 +1570,11 @@ unsigned long long FileFd::Size()
// for compressor pipes st_size is undefined and at 'best' zero,
// so we 'read' the content and 'seek' back - see there
- if (d->pipe == true
+ if (d != NULL && (d->pipe == true
#ifdef HAVE_BZ2
- || (d->bz2 && size > 0)
+ || (d->bz2 && size > 0)
#endif
- )
+ ))
{
unsigned long long const oldSeek = Tell();
char ignore[1000];
@@ -1581,7 +1589,7 @@ unsigned long long FileFd::Size()
// only check gzsize if we are actually a gzip file, just checking for
// "gz" is not sufficient as uncompressed files could be opened with
// gzopen in "direct" mode as well
- else if (d->gz && !gzdirect(d->gz) && size > 0)
+ else if (d != NULL && d->gz && !gzdirect(d->gz) && size > 0)
{
off_t const oldPos = lseek(iFd,0,SEEK_CUR);
/* unfortunately zlib.h doesn't provide a gzsize(), so we have to do
@@ -1626,7 +1634,7 @@ unsigned long long FileFd::Size()
time_t FileFd::ModificationTime()
{
struct stat Buf;
- if (d->pipe == false && fstat(iFd,&Buf) != 0)
+ if ((d == NULL || d->pipe == false) && fstat(iFd,&Buf) != 0)
{
Flags |= Fail;
_error->Errno("fstat","Unable to determine the modification time of file %s", FileName.c_str());
@@ -1634,11 +1642,12 @@ time_t FileFd::ModificationTime()
}
// for compressor pipes st_size is undefined and at 'best' zero
- if (d->pipe == true || S_ISFIFO(Buf.st_mode))
+ if ((d != NULL && d->pipe == true) || S_ISFIFO(Buf.st_mode))
{
// we set it here, too, as we get the info here for free
// in theory the Open-methods should take care of it already
- d->pipe = true;
+ if (d != NULL)
+ d->pipe = true;
if (stat(FileName.c_str(), &Buf) != 0)
{
Flags |= Fail;
diff --git a/debian/changelog b/debian/changelog
index 1874d54b2..040ca9544 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -45,6 +45,7 @@ apt (0.9.3) UNRELEASED; urgency=low
as it seems (Closes: #554387, #670979)
- collect zombie (de)compressor processes on reopen
- ensure that in error conditions the Fail flag is set
+ - ensure that d is set before accessing it
* apt-pkg/aptconfiguration.cc:
- use NULL instead of "" for no (un)compress parameters