]> git.sur5r.net Git - openldap/commitdiff
when opening files in /tmp use O_CREAT|O_EXCL to overcome race conditions
authorBen Collins <bcollins@openldap.org>
Mon, 24 Apr 2000 16:46:13 +0000 (16:46 +0000)
committerBen Collins <bcollins@openldap.org>
Mon, 24 Apr 2000 16:46:13 +0000 (16:46 +0000)
servers/slurpd/rq.c

index 46667210b698ff8b6571d5b7d8c3e81e526847db..207b1c8ce0a538131a6c43f4e348181d6f5c216f 100644 (file)
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <sys/stat.h>
 #include <ac/unistd.h>         /* get ftruncate() */
 
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
 #include "slurp.h"
 #include "globals.h"
 
@@ -227,17 +235,28 @@ Rq_dump(
 {
     Re         *re;
     FILE       *fp;
+    int                tmpfd;
 
     if ( rq == NULL ) {
        Debug( LDAP_DEBUG_ANY, "Rq_dump: rq is NULL!\n", 0, 0, 0 );
        return;
     }
 
-    if (( fp = fopen( SLURPD_DUMPFILE, "w" )) == NULL ) {
+    if (unlink(SLURPD_DUMPFILE) == -1 && errno != ENOENT) {
+       Debug( LDAP_DEBUG_ANY, "Rq_dump: \"%s\" exists, and cannot unlink\n",
+               SLURPD_DUMPFILE, 0, 0 );
+       return;
+    }
+    if (( tmpfd = open(SLURPD_DUMPFILE, O_CREAT|O_RDWR|O_EXCL, 0600)) == -1) {
        Debug( LDAP_DEBUG_ANY, "Rq_dump: cannot open \"%s\" for write\n",
                SLURPD_DUMPFILE, 0, 0 );
        return;
     }
+    if (( fp = fdopen( tmpfd, "w" )) == NULL ) {
+       Debug( LDAP_DEBUG_ANY, "Rq_dump: cannot fdopen \"%s\" for write\n",
+               SLURPD_DUMPFILE, 0, 0 );
+       return;
+    }
 
     rq->rq_lock( rq );
     for ( re = rq->rq_gethead( rq ); re != NULL; re = rq->rq_getnext( re )) {