replaced temporary file creation to be significantly safer
authorewt <devnull@localhost>
Thu, 28 Aug 1997 19:13:54 +0000 (19:13 +0000)
committerewt <devnull@localhost>
Thu, 28 Aug 1997 19:13:54 +0000 (19:13 +0000)
CVS patchset: 1809
CVS date: 1997/08/28 19:13:54

CHANGES
build/build.c
build/pack.c
checksig.c
lib/misc.c
lib/misc.h
lib/uninstall.c

diff --git a/CHANGES b/CHANGES
index 99dc54b..897a35b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,7 @@
        - hacks to recognize architecture under parisc
        - RPM_INSTALL_PREFIX wasn't being set properly (this should be
          fixed now)
+       - replaced temporary file creation to be race-condition safe
 
 2.4.4 -> 2.4.5:
        - call getpwnam()/endpwent() once before a chroot(), forcing name 
index 7673a7a..bf16ece 100644 (file)
@@ -56,6 +56,7 @@ struct Script *openScript(Spec spec, int builddir, char *name)
     struct Script *script = malloc(sizeof(struct Script));
     struct PackageRec *main_package = spec->packages;
     char *s, * arch, * os;
+    int fd;
     int_32 foo;
 
     rpmGetArchInfo(&arch, NULL);
@@ -66,8 +67,9 @@ struct Script *openScript(Spec spec, int builddir, char *name)
        exit(RPMERR_INTERNAL);
     }
     
-    script->name = tempnam(rpmGetVar(RPMVAR_TMPPATH), "rpmbuild");
-    script->file = fopen(script->name, "w");
+    if (makeTempFile(NULL, &script->name, &fd))
+       exit(1);
+    script->file = fdopen(fd, "w");
 
     /* Prepare the script */
     fprintf(script->file,
index 67d7e33..51df4dd 100644 (file)
@@ -71,17 +71,16 @@ static int generateRPM(char *name,       /* name-version-release         */
                   &archiveSize, 1);
 
     /* Write the header */
-    sigtarget = tempnam(rpmGetVar(RPMVAR_TMPPATH), "rpmbuild");
-    if ((fd = open(sigtarget, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) {
-       fprintf(stderr, "Could not open %s\n", sigtarget);
+    if (makeTempFile(NULL, &sigtarget, &fd))
        return 1;
-    }
+
     headerWrite(fd, header, HEADER_MAGIC_YES);
     
     /* Write the archive and get the size */
     if (cpio_gzip(fd, stempdir, fileList, &archiveSize, prefix)) {
        close(fd);
        unlink(sigtarget);
+       free(sigtarget);
        return 1;
     }
 
@@ -99,12 +98,14 @@ static int generateRPM(char *name,       /* name-version-release         */
     if ((fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) {
        fprintf(stderr, "Could not open %s\n", filename);
        unlink(sigtarget);
+       free(sigtarget);
        unlink(filename);
        return 1;
     }
     if (writeMagic(fd, name, type)) {
        close(fd);
        unlink(sigtarget);
+       free(sigtarget);
        unlink(filename);
        return 1;
     }
@@ -122,6 +123,7 @@ static int generateRPM(char *name,       /* name-version-release         */
     if (rpmWriteSignature(fd, sig)) {
        close(fd);
        unlink(sigtarget);
+       free(sigtarget);
        unlink(filename);
        rpmFreeSignature(sig);
        return 1;
@@ -136,6 +138,7 @@ static int generateRPM(char *name,       /* name-version-release         */
            close(ifd);
            close(fd);
            unlink(sigtarget);
+           free(sigtarget);
            unlink(filename);
            return 1;
         }
@@ -144,6 +147,7 @@ static int generateRPM(char *name,       /* name-version-release         */
            close(ifd);
            close(fd);
            unlink(sigtarget);
+           free(sigtarget);
            unlink(filename);
            return 1;
         }
@@ -151,6 +155,7 @@ static int generateRPM(char *name,       /* name-version-release         */
     close(ifd);
     close(fd);
     unlink(sigtarget);
+    free(sigtarget);
 
     rpmMessage(RPMMESS_VERBOSE, "Wrote: %s\n", filename);
     
index 363a9c9..1c8e0dc 100644 (file)
 #include "rpmlead.h"
 #include "signature.h"
 #include "messages.h"
+#include "lib/misc.h"
 
 int doReSign(int add, char *passPhrase, char **argv)
 {
     int fd, ofd, count;
     struct rpmlead lead;
     unsigned short sigtype;
-    char *rpm, sigtarget[1024];
+    char *rpm, *sigtarget;
     char tmprpm[1024];
     unsigned char buffer[8192];
     Header sig;
@@ -51,19 +52,22 @@ int doReSign(int add, char *passPhrase, char **argv)
        }
 
        /* Write the rest to a temp file */
-       strcpy(sigtarget, tempnam(rpmGetVar(RPMVAR_TMPPATH), "rpmsigtarget"));
-       ofd = open(sigtarget, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+       if (makeTempFile(NULL, &sigtarget, &ofd))
+           exit(1);
+
        while ((count = read(fd, buffer, sizeof(buffer))) > 0) {
            if (count == -1) {
                perror(_("Couldn't read the header/archive"));
                close(ofd);
                unlink(sigtarget);
+               free(sigtarget);
                exit(1);
            }
            if (write(ofd, buffer, count) < 0) {
                perror(_("Couldn't write header/archive to temp file"));
                close(ofd);
                unlink(sigtarget);
+               free(sigtarget);
                exit(1);
            }
        }
@@ -79,6 +83,7 @@ int doReSign(int add, char *passPhrase, char **argv)
            close(ofd);
            unlink(sigtarget);
            unlink(tmprpm);
+           free(sigtarget);
            exit(1);
        }
 
@@ -97,6 +102,7 @@ int doReSign(int add, char *passPhrase, char **argv)
            close(ofd);
            unlink(sigtarget);
            unlink(tmprpm);
+           free(sigtarget);
            rpmFreeSignature(sig);
            exit(1);
        }
@@ -111,6 +117,7 @@ int doReSign(int add, char *passPhrase, char **argv)
                close(fd);
                unlink(sigtarget);
                unlink(tmprpm);
+               free(sigtarget);
                exit(1);
            }
            if (write(ofd, buffer, count) < 0) {
@@ -119,12 +126,14 @@ int doReSign(int add, char *passPhrase, char **argv)
                close(fd);
                unlink(sigtarget);
                unlink(tmprpm);
+               free(sigtarget);
                exit(1);
            }
        }
        close(fd);
        close(ofd);
        unlink(sigtarget);
+       free(sigtarget);
 
        /* Move it in to place */
        unlink(rpm);
@@ -139,7 +148,7 @@ int doCheckSig(int flags, char **argv)
     int fd, ofd, res, res2, res3, missingKeys;
     struct rpmlead lead;
     char *rpm;
-    char result[1024], sigtarget[1024];
+    char result[1024], * sigtarget;
     unsigned char buffer[8192];
     Header sig;
     HeaderIterator sigIter;
@@ -175,13 +184,14 @@ int doCheckSig(int flags, char **argv)
            continue;
        }
        /* Write the rest to a temp file */
-       strcpy(sigtarget, tempnam(rpmGetVar(RPMVAR_TMPPATH), "rpmsigtarget"));
-       ofd = open(sigtarget, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+       if (makeTempFile(NULL, &sigtarget, &ofd))
+           exit(1);
        while ((count = read(fd, buffer, sizeof(buffer))) > 0) {
            if (count == -1) {
                perror(_("Couldn't read the header/archive"));
                close(ofd);
                unlink(sigtarget);
+               free(sigtarget);
                exit(1);
            }
            if (write(ofd, buffer, count) < 0) {
@@ -189,6 +199,7 @@ int doCheckSig(int flags, char **argv)
                perror("");
                close(ofd);
                unlink(sigtarget);
+               free(sigtarget);
                exit(1);
            }
        }
@@ -269,6 +280,7 @@ int doCheckSig(int flags, char **argv)
        headerFreeIterator(sigIter);
        res += res2;
        unlink(sigtarget);
+       free(sigtarget);
 
        if (res2) {
            if (rpmIsVerbose()) {
index 9d54803..dcb6efe 100644 (file)
@@ -7,14 +7,18 @@
 
 #include <errno.h>
 #include <ctype.h>
+#include <fcntl.h>
 #include <grp.h>
 #include <pwd.h>
 #include <stdlib.h>
+#include <sys/time.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <stdio.h>
 #include <string.h>
+#include <unistd.h>
 
+#include "intl.h"
 #include "misc.h"
 #include "rpmlib.h"
 #include "messages.h"
@@ -326,3 +330,38 @@ char * gidToGname(gid_t gid) {
        return lastGname;
     }
 }
+
+int makeTempFile(char * prefix, char ** fnptr, int * fdptr) {
+    char * fn;
+    int fd;
+    int ran;
+    char * tmpdir = rpmGetVar(RPMVAR_TMPPATH);
+    struct stat sb;
+
+    if (!prefix) prefix = "";
+
+    fn = malloc(strlen(prefix) + 25 + strlen(tmpdir));
+
+    srandom(time(NULL));
+    ran = random() % 100000;
+    do {
+       sprintf(fn, "%s%s/rpm-tmp.%d", prefix, tmpdir, ran++);
+    } while (!access(fn, X_OK));
+    
+    fd = open(fn, O_CREAT | O_RDWR | O_EXCL, 0700);
+
+    if (fd < 0) {
+       rpmError(RPMERR_SCRIPT, _("error creating temporary file %s"), fn);
+       return 1;
+    }
+
+    if (!stat(fn, &sb) && S_ISLNK(sb.st_mode)) {
+       rpmError(RPMERR_SCRIPT, _("error creating temporary file %s"), fn);
+       return 1;
+    }
+
+    if (fnptr) *fnptr = fn;
+    *fdptr = fd;
+
+    return 0;
+}
index d170da9..c2fd7fe 100644 (file)
@@ -25,4 +25,6 @@ int gnameToGid(char * thisGname, gid_t * gid);
 char * uidToUname(uid_t uid);
 char * gidToGname(gid_t gid);
 
+int makeTempFile(char * prefix, char ** fnptr, int * fdptr);
+
 #endif
index c509ca6..5ef7f71 100644 (file)
@@ -325,8 +325,6 @@ int runScript(char * prefix, Header h, int scriptTag, int progTag,
     int isdebug = rpmIsDebug();
     int child;
     int status;
-    int ran;
-    struct stat sb;
     char upgradeArg[20];
     char * installPrefix = NULL;
     char * installPrefixEnv = NULL;
@@ -360,39 +358,8 @@ int runScript(char * prefix, Header h, int scriptTag, int progTag,
     rpmMessage(RPMMESS_DEBUG, "running inst helper %s\n", program);
 
     if (script) {
-       if (prefix) {
-           fn = alloca(strlen(prefix) + 15);
-           strcpy(fn, prefix);
-           strcat(fn, "/");
-       } else {
-           fn = alloca(15);
-           *fn = '\0';
-       }
-
-       srandom(time(NULL));
-       strcat(fn, "/tmp/rpm123456");
-       ran = random() % 100000;
-       do {
-           fn[strlen(fn) - 6] = '\0';
-           sprintf(upgradeArg, "%06d", ran++);
-           strcat(fn, upgradeArg);
-       } while (!access(fn, X_OK));
-       
-       rpmMessage(RPMMESS_DEBUG, "script found - running from file %s\n", fn);
-       fd = open(fn, O_CREAT | O_RDWR | O_EXCL, 0700);
-
-       if (fd < 0) {
-           rpmError(RPMERR_SCRIPT, 
-                       _("error creating file %s for (un)install script"), fn);
+       if (makeTempFile(prefix, &fn, &fd))
            return 1;
-       }
-
-       if (!stat(fn, &sb) && S_ISLNK(sb.st_mode)) {
-           rpmError(RPMERR_SCRIPT, 
-                       _("error creating file %s for (un)install script"), fn);
-           return 1;
-       }
-
        write(fd, "#!", 2);
        write(fd, program, strlen(program));
 
@@ -418,10 +385,6 @@ int runScript(char * prefix, Header h, int scriptTag, int progTag,
     *argvPtr++ = NULL;
        
     if (!(child = fork())) {
-       if (installPrefixEnv) {
-           doputenv(installPrefixEnv);
-       }
-
        /* make stdin inaccessible */
        pipe(pipes);
        close(pipes[1]);
@@ -441,6 +404,7 @@ int runScript(char * prefix, Header h, int scriptTag, int progTag,
     waitpid(child, &status, 0);
 
     if (script && !isdebug) unlink(fn);
+    free(fn);
 
     if (!WIFEXITED(status) || WEXITSTATUS(status)) {
        rpmError(RPMERR_SCRIPT, _("execution of script failed"));