]> git.saurik.com Git - apt.git/commitdiff
replace usage of potential dangerous mktemp with mkstemp
authorAngel Guzman Maeso <shakaran@gmail.com>
Tue, 27 Aug 2013 19:29:01 +0000 (21:29 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Tue, 27 Aug 2013 19:29:01 +0000 (21:29 +0200)
Avoid the warning "the use of `mktemp' is dangerous,
better use `mkstemp' or `mkdtemp'". It is not strictly necessary to
change the usage from a security point of view here, but mktemp is
also removed from the standard since POSIX.1-2008.

The mkostemp call returns a file descriptor the logic for
TemporaryFileName has been changed accordingly to get the same results.
The file permissions are corrected by using fchmod() as the default for
FileFd is 666 while mkstemp creates files with 600 by default.

apt-pkg/contrib/fileutl.cc

index 47a91c294a28a9e413bf5d7533af83a36dae81f9..3eeef58cf7731d549171100427ae73fae34a6d9e 100644 (file)
@@ -946,9 +946,6 @@ bool FileFd::Open(string FileName,unsigned int const Mode,APT::Configuration::Co
    if ((Mode & Atomic) == Atomic)
    {
       Flags |= Replace;
-      char *name = strdup((FileName + ".XXXXXX").c_str());
-      TemporaryFileName = string(mktemp(name));
-      free(name);
    }
    else if ((Mode & (Exclusive | Create)) == (Exclusive | Create))
    {
@@ -974,8 +971,25 @@ bool FileFd::Open(string FileName,unsigned int const Mode,APT::Configuration::Co
    else if_FLAGGED_SET(Atomic, O_EXCL);
    #undef if_FLAGGED_SET
 
-   if (TemporaryFileName.empty() == false)
-      iFd = open(TemporaryFileName.c_str(), fileflags, Perms);
+   if ((Mode & Atomic) == Atomic)
+   {
+      char *name = strdup((FileName + ".XXXXXX").c_str());
+
+      if((iFd = mkostemp(name, fileflags)) == -1)
+      {
+          free(name);
+          return FileFdErrno("mkostemp", "Could not create temporary file for %s", FileName.c_str());
+      }
+
+      TemporaryFileName = string(name);
+
+      if(fchmod(iFd, Perms) == -1)
+      {
+          free(name);
+          return FileFdErrno("fchmod", "Could not assign permissions to temporary file %s with error %s", FileName.c_str(), strerror(errno));
+      }
+      free(name);
+   }
    else
       iFd = open(FileName.c_str(), fileflags, Perms);