]> git.sur5r.net Git - openldap/commitdiff
libmdb: Set close-on-exec flag on lockfile
authorHallvard Furuseth <hallvard@openldap.org>
Thu, 12 Apr 2012 05:34:13 +0000 (07:34 +0200)
committerHallvard Furuseth <hallvard@openldap.org>
Thu, 12 Apr 2012 06:15:33 +0000 (08:15 +0200)
libraries/libmdb/mdb.c

index 8280e22afbd63d13df0f42903ec7d16b6287e47b..879841ee1e2f716962c57464be72577ea5b89f8c 100644 (file)
@@ -2734,11 +2734,22 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
                }
        }
        size = GetFileSize(env->me_lfd, NULL);
+
 #else
-       if ((env->me_lfd = open(lpath, O_RDWR|O_CREAT, mode)) == -1) {
-               rc = ErrCode();
-               return rc;
+#if !(O_CLOEXEC)
+       {
+               int fdflags;
+               if ((env->me_lfd = open(lpath, O_RDWR|O_CREAT, mode)) == -1)
+                       return ErrCode();
+               /* Lose record locks when exec*() */
+               if ((fdflags = fcntl(env->me_lfd, F_GETFD) | FD_CLOEXEC) >= 0)
+                       fcntl(env->me_lfd, F_SETFD, fdflags);
        }
+#else /* O_CLOEXEC on Linux: Open file and set FD_CLOEXEC atomically */
+       if ((env->me_lfd = open(lpath, O_RDWR|O_CREAT|O_CLOEXEC, mode)) == -1)
+               return ErrCode();
+#endif
+
        /* Try to get exclusive lock. If we succeed, then
         * nobody is using the lock region and we should initialize it.
         */