Avoid using tmpnam(3) in db2's hash.c
authorRobbie Harwood <rharwood@redhat.com>
Wed, 29 Mar 2017 22:34:37 +0000 (18:34 -0400)
committerGreg Hudson <ghudson@mit.edu>
Fri, 14 Apr 2017 16:02:58 +0000 (12:02 -0400)
As we do not rely on anonymous db2 databases, get rid of the code
using tmpnam() for hash databases and reporting EINVAL if a filename
is not specified.

[ghudson@mit.edu: rewrote commit message; condensed conditionals]

src/plugins/kdb/db2/libdb2/hash/hash.c

index 76f5d470932ed11e58b82dcd7e4f601c7e8f726a..862dbb164080a670988fa0d3199c7048eb914d13 100644 (file)
@@ -103,26 +103,15 @@ __kdb2_hash_open(file, flags, mode, info, dflags)
        DB *dbp;
        DBT mpool_key;
        HTAB *hashp;
-       int32_t bpages, csize, new_table, save_errno, specified_file;
+       int32_t bpages, csize, new_table, save_errno;
 
-       if ((flags & O_ACCMODE) == O_WRONLY) {
+       if (!file || (flags & O_ACCMODE) == O_WRONLY) {
                errno = EINVAL;
                return (NULL);
        }
        if (!(hashp = (HTAB *)calloc(1, sizeof(HTAB))))
                return (NULL);
        hashp->fp = -1;
-
-       /* set this now, before file goes away... */
-       specified_file = (file != NULL);
-       if (!file) {
-               file = tmpnam(NULL);
-               /* store the file name so that we can unlink it later */
-               hashp->fname = file;
-#ifdef DEBUG
-               fprintf(stderr, "Using file name %s.\n", file);
-#endif
-       }
        /*
         * Even if user wants write only, we need to be able to read
         * the actual file, so we need to open it read/write. But, the
@@ -130,7 +119,7 @@ __kdb2_hash_open(file, flags, mode, info, dflags)
         * we can check accesses.
         */
        hashp->flags = flags;
-       hashp->save_file = specified_file && (hashp->flags & O_RDWR);
+       hashp->save_file = hashp->flags & O_RDWR;
 
        new_table = 0;
        if (!file || (flags & O_TRUNC) ||
@@ -542,8 +531,6 @@ hdestroy(hashp)
                /* we need to chmod the file to allow it to be deleted... */
                chmod(hashp->fname, 0700);
                unlink(hashp->fname);
-               /* destroy the temporary name */
-               tmpnam(NULL);
        }
        free(hashp);