at already uses O_EXCL when creating files so there's no need to
lock the spool dir.

 - todd

Index: at.c
===================================================================
RCS file: /cvs/src/usr.bin/at/at.c,v
retrieving revision 1.72
diff -u -p -r1.72 at.c
--- at.c        11 Nov 2015 17:17:56 -0000      1.72
+++ at.c        11 Nov 2015 17:44:27 -0000
@@ -82,7 +82,6 @@ gid_t user_gid;                       /* user's real gid */
 gid_t spool_gid;               /* gid for writing to at spool */
 
 static void sigc(int);
-static void alarmc(int);
 static void writefile(const char *, time_t, char);
 static void list_jobs(int, char **, int, int);
 static time_t ttime(char *);
@@ -142,13 +141,6 @@ sigc(int signo)
        _exit(EXIT_FAILURE);
 }
 
-/* ARGSUSED */
-static void
-alarmc(int signo)
-{
-       /* just return */
-}
-
 static int
 newjob(time_t runtimer, int queue)
 {
@@ -182,7 +174,7 @@ writefile(const char *cwd, time_t runtim
        char timestr[TIMESIZE];
        struct passwd *pass_entry;
        struct tm runtime;
-       int fdes, lockdes, fd2;
+       int fd;
        FILE *fp;
        struct sigaction act;
        char **atenv;
@@ -202,28 +194,6 @@ writefile(const char *cwd, time_t runtim
        act.sa_flags = 0;
        sigaction(SIGINT, &act, NULL);
 
-       if ((lockdes = open(AT_SPOOL, O_RDONLY|O_DIRECTORY, 0)) < 0)
-               fatal(AT_SPOOL);
-
-       /*
-        * Lock the jobs dir so we don't have to worry about someone
-        * else grabbing a file name out from under us.
-        * Set an alarm so we don't sleep forever waiting on the lock.
-        * If we don't succeed with ALARMC seconds, something is wrong...
-        */
-       bzero(&act, sizeof act);
-       act.sa_handler = alarmc;
-       sigemptyset(&act.sa_mask);
-#ifdef SA_INTERRUPT
-       act.sa_flags = SA_INTERRUPT;
-#endif
-       sigaction(SIGALRM, &act, NULL);
-       alarm(ALARMC);
-       ch = flock(lockdes, LOCK_EX);
-       alarm(0);
-       if (ch != 0)
-               fatal("unable to lock %s", AT_SPOOL);
-
        /*
         * Create the file. The x bit is only going to be set after it has
         * been completely written out, to make sure it is not executed in
@@ -231,13 +201,10 @@ writefile(const char *cwd, time_t runtim
         * their r bit.  Yes, this is a kluge.
         */
        cmask = umask(S_IRUSR | S_IWUSR | S_IXUSR);
-       if ((fdes = newjob(runtimer, queue)) == -1)
+       if ((fd = newjob(runtimer, queue)) == -1)
                fatal("unable to create atjob file");
 
-       if ((fd2 = dup(fdes)) < 0)
-               fatal("dup");
-
-       if (fchown(fd2, -1, user_gid) != 0)
+       if (fchown(fd, -1, user_gid) != 0)
                fatal("fchown");
 
        /*
@@ -246,10 +213,7 @@ writefile(const char *cwd, time_t runtim
         */
        fcreated = 1;
 
-       /* Now we can release the lock, so other people can access it */
-       (void)close(lockdes);
-
-       if ((fp = fdopen(fdes, "w")) == NULL)
+       if ((fp = fdopen(fd, "w")) == NULL)
                fatal("unable to reopen atjob file");
 
        /*
@@ -378,15 +342,13 @@ writefile(const char *cwd, time_t runtim
        if (ferror(stdin))
                fatalx("read error");
 
-       (void)fclose(fp);
-
        /*
         * Set the x bit so that we're ready to start executing
         */
-       if (fchmod(fd2, S_IRUSR | S_IWUSR | S_IXUSR) < 0)
+       if (fchmod(fileno(fp), S_IRUSR | S_IWUSR | S_IXUSR) < 0)
                fatal("fchmod");
 
-       (void)close(fd2);
+       (void)fclose(fp);
 
        /* Poke cron so it knows to reload the at spool. */
        poke_daemon(AT_SPOOL, RELOAD_AT);
@@ -875,8 +837,7 @@ main(int argc, char **argv)
        int cflag = 0;
        int nflag = 0;
 
-       if (pledge("stdio rpath wpath cpath fattr getpw unix flock id",
-           NULL) == -1)
+       if (pledge("stdio rpath wpath cpath fattr getpw unix id", NULL) == -1)
                fatal("pledge");
 
        if (argc < 1)

Reply via email to