]> diplodocus.org Git - nmh/blobdiff - sbr/lock_file.c
Fix invalid pointer arithmetic.
[nmh] / sbr / lock_file.c
index 9fbcbd78d94dec5320177858f89a58066394dd7e..2c8b1c7531ae9ea286de318e1bd52c88d119c894 100644 (file)
@@ -1,6 +1,4 @@
-
-/*
- * lock.c -- routines to lock/unlock files
+/* lock_file.c -- routines to lock/unlock files
  *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
@@ -19,6 +17,8 @@
 #include <h/signals.h>
 #include <h/utils.h>
 #include <h/mts.h>
+#include "lock_file.h"
+#include "m_mktemp.h"
 
 #ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
@@ -73,15 +73,9 @@ struct lock {
 
 enum locktype { FCNTL_LOCKING, FLOCK_LOCKING, LOCKF_LOCKING, DOT_LOCKING };
 
-/*
- * Flags to indicate whether we've initialized the lock types, and
- * our saved lock types
- */
-static int datalockinit = 0;
-static int spoollockinit = 0;
+/* Our saved lock types. */
 static enum locktype datalocktype, spoollocktype;
 
-
 /* top of list containing all open locks */
 static struct lock *l_top = NULL;
 
@@ -96,7 +90,7 @@ static int lkopen_lockf (const char *, int, mode_t, int *);
 static int lkopen_flock (const char *, int, mode_t, int *);
 #endif /* HAVE_FLOCK */
 
-static enum locktype init_locktype(const char *);
+static enum locktype init_locktype(const char *) PURE;
 
 static int lkopen_dot (const char *, int, mode_t, int *);
 static void lkclose_dot (int, const char *);
@@ -117,17 +111,18 @@ static int lockit (struct lockinfo *);
 int
 lkopendata(const char *file, int access, mode_t mode, int *failed_to_lock)
 {
-    if (! datalockinit) {
-       char *cp = context_find("datalocking");
+    static bool deja_vu;
 
-       if (cp) {
-           datalocktype = init_locktype(cp);
+    if (!deja_vu) {
+        char *dl;
+
+        deja_vu = true;
+       if ((dl = context_find("datalocking"))) {
+           datalocktype = init_locktype(dl);
        } else {
            /* We default to fcntl locking for data files */
            datalocktype = FCNTL_LOCKING;
        }
-
-       datalockinit = 1;
     }
 
     return lkopen(file, access, mode, datalocktype, failed_to_lock);
@@ -140,10 +135,11 @@ lkopendata(const char *file, int access, mode_t mode, int *failed_to_lock)
 
 int lkopenspool(const char *file, int access, mode_t mode, int *failed_to_lock)
 {
-    if (! spoollockinit) {
-       spoollocktype = init_locktype(spoollocking);
+    static bool deja_vu;
 
-       spoollockinit = 1;
+    if (!deja_vu) {
+       deja_vu = true;
+        spoollocktype = init_locktype(spoollocking);
     }
 
     return lkopen(file, access, mode, spoollocktype, failed_to_lock);
@@ -526,6 +522,7 @@ lkopen_dot (const char *file, int access, mode_t mode, int *failed_to_lock)
             lockname (file, &lkinfo, 1);
        }
 
+        close(fd);
         *failed_to_lock = 1;
         return -1;
     }
@@ -560,7 +557,7 @@ lockit (struct lockinfo *li)
     curlock = li->curlock;
 
     if ((tmpfile = m_mktemp(li->tmplock, &fd, NULL)) == NULL) {
-        advise(NULL, "unable to create temporary file in %s", li->tmplock);
+        inform("unable to create temporary file in %s", li->tmplock);
        return -1;
     }
 
@@ -579,7 +576,7 @@ lockit (struct lockinfo *li)
     fd = link(tmpfile, curlock);
     (void) m_unlink(tmpfile);
 
-    return (fd == -1 ? -1 : 0);
+    return fd == -1 ? -1 : 0;
 }
 #endif /* HAVE_LIBLOCKFILE */
 
@@ -632,7 +629,9 @@ lockname (const char *file, struct lockinfo *li, int isnewlock)
 
     snprintf (bp, sizeof(li->curlock) - bplen, "%s.lock", cp);
 
-#if !defined(HAVE_LIBLOCKFILE)
+#if defined(HAVE_LIBLOCKFILE)
+    NMH_UNUSED(isnewlock);
+#else
     /*
      * If this is for a new lock, create a name for
      * the temporary lock file for lockit()