butc: avoid freeing uninitialized pointer in writeDbDump()
[openafs.git] / src / butc / tcudbprocs.c
index b358194..3fe76f5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
 #include <afsconfig.h>
 #include <afs/param.h>
 
+#include <afs/procmgmt.h>
+#include <roken.h>
+
 #ifdef IGNORE_SOME_GCC_WARNINGS
 # pragma GCC diagnostic warning "-Wimplicit-function-declaration"
 #endif
 
-#include <sys/types.h>
-#ifdef AFS_NT40_ENV
-#include <winsock2.h>
-#include <io.h>
-#else
-#include <sys/time.h>
-#include <sys/file.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#endif
-#include <errno.h>
 #include <rx/xdr.h>
 #include <rx/rx.h>
 #include <afs/afsint.h>
-#include <stdio.h>
-#include <string.h>
-#include <afs/procmgmt.h>
-#include <afs/assert.h>
+#include <afs/afs_assert.h>
 #include <afs/prs_fs.h>
-#include <fcntl.h>
 #include <afs/nfs.h>
 #include <lwp.h>
 #include <lock.h>
@@ -51,6 +39,7 @@
 #include <afs/butm_prototypes.h>
 #include <afs/budb_prototypes.h>
 #include <afs/afsutil.h>
+
 #include "butc_internal.h"
 #include "error_macros.h"
 
@@ -83,7 +72,7 @@ int restoreText(struct butm_tapeInfo *, struct rstTapeInfo *,
 
 void * KeepAlive(void *);
 /* CreateDBDump
- *      create a dump entry for a saved database 
+ *      create a dump entry for a saved database
  */
 
 afs_int32
@@ -136,7 +125,6 @@ GetDBTape(afs_int32 taskId, Date expires, struct butm_tapeInfo *tapeInfoPtr,
     char tapeName[BU_MAXTAPELEN];
     char strlevel[5];
     struct timeval tp;
-    struct timezone tzp;
     afs_int32 curTime;
     int tapecount = 1;
 
@@ -195,7 +183,7 @@ GetDBTape(afs_int32 taskId, Date expires, struct butm_tapeInfo *tapeInfoPtr,
                goto getNewTape;
            }
 
-           /* On first tape, the savedb has not started yet, so the database is not locked 
+           /* On first tape, the savedb has not started yet, so the database is not locked
             * and we can therefore, access information from it. This is easier to do because
             * database dumps don't have appended dumps (nor appended).
             */
@@ -204,7 +192,7 @@ GetDBTape(afs_int32 taskId, Date expires, struct butm_tapeInfo *tapeInfoPtr,
                struct budb_dumpEntry de, de2;
 
                /* Verify the tape has not expired
-                * Early database dumps don't have a dumpid 
+                * Early database dumps don't have a dumpid
                 */
                if (!tapeExpired(&oldTapeLabel)) {
                    TLog(taskId, "This tape has not expired\n");
@@ -245,12 +233,12 @@ GetDBTape(afs_int32 taskId, Date expires, struct butm_tapeInfo *tapeInfoPtr,
            }
 
            /* Otherwise, the savedb is in progress and we can't
-            * access the database (it's locked). So we rely on the 
+            * access the database (it's locked). So we rely on the
             * information available (and not the backup database).
             */
            else {
                /* Check the tape's expiration date. Use the expiration on the label */
-               gettimeofday(&tp, &tzp);
+               gettimeofday(&tp, NULL);
                curTime = tp.tv_sec;
                if (curTime < oldTapeLabel.expirationDate) {
                    TLog(taskId, "This tape has not expired\n");
@@ -341,7 +329,7 @@ freeTapeList(void)
 }
 
 /* addTapesToDb
- *       With the list of tapes, add them to the database. 
+ *       With the list of tapes, add them to the database.
  *       Also delete any olddumpids that are around.
  */
 
@@ -427,6 +415,8 @@ writeDbDump(struct butm_tapeInfo *tapeInfoPtr, afs_uint32 taskId,
     extern struct tapeConfig globalTapeConfig;
     extern struct udbHandleS udbHandle;
 
+    charList.charListT_val = 0;
+    charList.charListT_len = 0;
     blockSize = BUTM_BLKSIZE;
     writeBlock = (char *)malloc(BUTM_BLOCKSIZE);
     if (!writeBlock)
@@ -436,12 +426,12 @@ writeDbDump(struct butm_tapeInfo *tapeInfoPtr, afs_uint32 taskId,
     memset(writeBuffer, 0, BUTM_BLKSIZE);
     maxReadSize = 1024;
 
-    /* 
-     * The margin of space to check for end of tape is set to the 
-     * amount of space used to write an end-of-tape multiplied by 2. 
+    /*
+     * The margin of space to check for end of tape is set to the
+     * amount of space used to write an end-of-tape multiplied by 2.
      * The amount of space is size of a 16K EODump marker, its EOF
      * marker, and up to two EOF markers done on close (1 16K blocks +
-     * 3 EOF * markers). 
+     * 3 EOF * markers).
      */
     tc_EndMargin = (16384 + 3 * globalTapeConfig.fileMarkSize) * 2;
     tc_KEndMargin = tc_EndMargin / 1024;
@@ -457,8 +447,6 @@ writeDbDump(struct butm_tapeInfo *tapeInfoPtr, afs_uint32 taskId,
     writeBufPtr = &writeBuffer[0];
     firstcall = 1;
     sequence = 1;
-    charList.charListT_val = 0;
-    charList.charListT_len = 0;
 
     while (1) {                        /*w */
        /* When no data in buffer, read data from the budb_server */
@@ -640,7 +628,7 @@ void *
 saveDbToTape(void *param)
 {
     struct saveDbIf *saveDbIfPtr = (struct saveDbIf *)param;
-    afs_int32 code = 0;
+    afs_int32 code;
     afs_int32 i;
     int wroteLabel;
     afs_uint32 taskId;
@@ -652,8 +640,10 @@ saveDbToTape(void *param)
     extern struct deviceSyncNode *deviceLatch;
     extern struct tapeConfig globalTapeConfig;
 
+    afs_pthread_setname_self("Db save");
     expires = (saveDbIfPtr->archiveTime ? NEVERDATE : 0);
     taskId = saveDbIfPtr->taskId;
+    dumpEntry.id = 0;
 
     setStatus(taskId, DRIVE_WAIT);
     EnterDeviceQueue(deviceLatch);     /* lock tape device */
@@ -696,7 +686,7 @@ saveDbToTape(void *param)
                  &wroteLabel);
 
     /*
-     * If did not write the label, remove created dump 
+     * If did not write the label, remove created dump
      * Else if wrote the label, remove old dump from db so it's not saved.
      */
     if (!wroteLabel) {
@@ -1034,6 +1024,7 @@ restoreDbFromTape(void *param)
     extern struct tapeConfig globalTapeConfig;
     extern struct deviceSyncNode *deviceLatch;
 
+    afs_pthread_setname_self("Db restore");
     setStatus(taskId, DRIVE_WAIT);
     EnterDeviceQueue(deviceLatch);     /* lock tape device */
     clearStatus(taskId, DRIVE_WAIT);
@@ -1114,12 +1105,12 @@ restoreDbFromTape(void *param)
 }
 
 /* KeepAlive
- * 
- *      While dumping the database, keeps the connection alive.  
+ *
+ *      While dumping the database, keeps the connection alive.
  *      Every 10 seconds, wake up and ask to read 0 bytes of the database.
- *      This resets the database's internal timer so that it does not 
+ *      This resets the database's internal timer so that it does not
  *      prematuraly quit (on asking for new tapes and such).
- *      
+ *
  *      Use the same udbHandle as writeDbDump so we go to the same server.
  */
 void *
@@ -1131,6 +1122,7 @@ KeepAlive(void *unused)
 
     extern struct udbHandleS udbHandle;
 
+    afs_pthread_setname_self("Keep-alive");
     while (1) {
 #ifdef AFS_PTHREAD_ENV
        sleep(5);
@@ -1204,7 +1196,7 @@ restoreDbHeader(struct butm_tapeInfo *tapeInfo,
  *     nextHeader - ptr to structure for return value
  * exit:
  *     nextHeader - next structure header from tape
- * notes: 
+ * notes:
  *     upon entry, the dump structure header has been read confirming that
  *     a database dump tree exists on the tape
  */
@@ -1218,14 +1210,11 @@ restoreDbDump(struct butm_tapeInfo *tapeInfo,
     struct budb_tapeEntry netTapeEntry, hostTapeEntry;
     struct budb_volumeEntry netVolumeEntry, hostVolumeEntry;
     struct structDumpHeader netItemHeader;
-    afs_int32 taskId;
     int restoreThisDump = 1;
     afs_int32 code = 0;
 
     extern struct udbHandleS udbHandle;
 
-    taskId = rstTapeInfoPtr->taskId;
-
     /* read dump entry */
     memset(&netDumpEntry, 0, sizeof(netDumpEntry));
     code =
@@ -1452,11 +1441,7 @@ restoreText(struct butm_tapeInfo *tapeInfo,
 
     /* open the text file */
     sprintf(filename, "%s/bu_XXXXXX", gettmpdir());
-#if defined (HAVE_MKSTEMP)
     fid = mkstemp(filename);
-#else
-    fid = open(mktemp(filename), O_RDWR | O_CREAT | O_EXCL, 0600);
-#endif
     if (fid < 0) {
        ErrorLog(0, rstTapeInfoPtr->taskId, errno, 0,
                 "Can't open temporary text file: %s\n", filename);
@@ -1529,7 +1514,7 @@ static char *tapeReadBufferPtr = 0;       /* position in buffer */
 
 /* getTapeData
  *     Read information from tape, and place the requested number of bytes
- *     in the buffer supplied 
+ *     in the buffer supplied
  * entry:
  *     tapeInfo
  *     rstTapeInfoPtr - Info about the dump being restored.