summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <kalnischkies@gmail.com>2013-03-16 12:40:43 +0100
committerDavid Kalnischkies <kalnischkies@gmail.com>2013-03-16 12:40:43 +0100
commitbea263c2c0ecd6715ce996fd9b54599ac2cfa7c2 (patch)
tree6a8b2159018dff65eedf242941c602cd4bfc70ea
parentad000f6b68f9216412a6a70bcfe6cb11fb0c2fe6 (diff)
ensure that we fclose/unlink/free in the new gpg-code as soon as possible
-rw-r--r--apt-pkg/contrib/gpgv.cc27
1 files changed, 22 insertions, 5 deletions
diff --git a/apt-pkg/contrib/gpgv.cc b/apt-pkg/contrib/gpgv.cc
index c236a7289..5921d7c67 100644
--- a/apt-pkg/contrib/gpgv.cc
+++ b/apt-pkg/contrib/gpgv.cc
@@ -214,19 +214,25 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG,
ioprintf(std::cerr, _("Waited for %s but it wasn't there"), "gpgv");
UNLINK_EXIT(EINTERNAL);
}
+#undef UNLINK_EXIT
+ // we don't need the files any longer as we have the filedescriptors still open
+ unlink(sig);
+ unlink(data);
+ free(sig);
+ free(data);
// check if it exit'ed normally …
if (WIFEXITED(Status) == false)
{
ioprintf(std::cerr, _("Sub-process %s exited unexpectedly"), "gpgv");
- UNLINK_EXIT(EINTERNAL);
+ exit(EINTERNAL);
}
// … and with a good exit code
if (WEXITSTATUS(Status) != 0)
{
ioprintf(std::cerr, _("Sub-process %s returned an error code (%u)"), "gpgv", WEXITSTATUS(Status));
- UNLINK_EXIT(WEXITSTATUS(Status));
+ exit(WEXITSTATUS(Status));
}
/* looks like its fine. Our caller will check the status fd,
@@ -236,12 +242,11 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG,
if (RecombineToClearSignedFile(File, dataFd, dataHeader, sigFd) == false)
{
_error->DumpErrors(std::cerr);
- UNLINK_EXIT(EINTERNAL);
+ exit(EINTERNAL);
}
// everything fine, we have a clean file now!
- UNLINK_EXIT(0);
-#undef UNLINK_EXIT
+ exit(0);
}
exit(EINTERNAL); // unreachable safe-guard
}
@@ -259,7 +264,10 @@ bool RecombineToClearSignedFile(std::string const &OutFile, int const ContentFil
FILE *data_file = fdopen(ContentFile, "r");
FILE *sig_file = fdopen(SignatureFile, "r");
if (data_file == NULL || sig_file == NULL)
+ {
+ fclose(clean_file);
return _error->Error("Couldn't open splitfiles to recombine them into %s", OutFile.c_str());
+ }
char *buf = NULL;
size_t buf_size = 0;
while (getline(&buf, &buf_size, data_file) != -1)
@@ -287,13 +295,21 @@ bool SplitClearSignedFile(std::string const &InFile, int const ContentFile,
{
out_content = fdopen(ContentFile, "w");
if (out_content == NULL)
+ {
+ fclose(in);
return _error->Errno("fdopen", "Failed to open file to write content to from %s", InFile.c_str());
+ }
}
if (SignatureFile != -1)
{
out_signature = fdopen(SignatureFile, "w");
if (out_signature == NULL)
+ {
+ fclose(in);
+ if (out_content != NULL)
+ fclose(out_content);
return _error->Errno("fdopen", "Failed to open file to write signature to from %s", InFile.c_str());
+ }
}
bool found_message_start = false;
@@ -358,6 +374,7 @@ bool SplitClearSignedFile(std::string const &InFile, int const ContentFile,
fclose(out_content);
if (out_signature != NULL)
fclose(out_signature);
+ fclose(in);
return true;
}