Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/bsd/cron Apply selected patches from OpenWall:



details:   https://anonhg.NetBSD.org/src/rev/3ac464759e4f
branches:  trunk
changeset: 354281:3ac464759e4f
user:      christos <christos%NetBSD.org@localhost>
date:      Fri Jun 09 17:36:29 2017 +0000

description:
Apply selected patches from OpenWall:
    http://cvsweb.openwall.com/cgi/cvsweb.cgi/Owl/packages/vixie-cron/

1. Add PAM support.
2. Sanitize children process reaping
3. futimens when we have an fd
4. close_all for crontab(8)
5. use a table for spool dirs instead of duplicating code.
6. handle errors from process_exit()
7. Add ENABLE_FIX_DIRECTORIES ifdef and enable it by default for compat
8. Avoid using fd's < STDERR

Not applied:
1. no xfork (no setresuid)
2. did not do the lstat before open.
3. did not enable cron group

diffstat:

 external/bsd/cron/bin/cron/Makefile    |    9 +-
 external/bsd/cron/bin/crontab/Makefile |    4 +-
 external/bsd/cron/dist/Makefile        |    4 +-
 external/bsd/cron/dist/closeall.c      |   34 ++++++++
 external/bsd/cron/dist/config.h        |    8 +-
 external/bsd/cron/dist/cron.c          |   17 ++--
 external/bsd/cron/dist/crontab.c       |   13 ++-
 external/bsd/cron/dist/database.c      |   82 +++++++++++--------
 external/bsd/cron/dist/do_command.c    |  131 ++++++++++++++++++++------------
 external/bsd/cron/dist/funcs.h         |   11 ++-
 external/bsd/cron/dist/misc.c          |   36 ++++++++-
 external/bsd/cron/dist/pam_auth.c      |  121 ++++++++++++++++++++++++++++++
 external/bsd/cron/dist/popen.c         |    9 +-
 13 files changed, 368 insertions(+), 111 deletions(-)

diffs (truncated from 951 to 300 lines):

diff -r af2e328df18f -r 3ac464759e4f external/bsd/cron/bin/cron/Makefile
--- a/external/bsd/cron/bin/cron/Makefile       Fri Jun 09 17:29:03 2017 +0000
+++ b/external/bsd/cron/bin/cron/Makefile       Fri Jun 09 17:36:29 2017 +0000
@@ -1,11 +1,12 @@
-#      $NetBSD: Makefile,v 1.3 2012/06/22 20:32:34 abs Exp $
+#      $NetBSD: Makefile,v 1.4 2017/06/09 17:36:29 christos Exp $
 
 BINDIR=        /usr/sbin
 PROG=  cron
 SRCS=  cron.c database.c do_command.c entry.c env.c job.c \
-       misc.c popen.c pw_dup.c user.c
-CPPFLAGS+=-I${.CURDIR} -DLOGIN_CAP
-LDADD+=-lutil
+       misc.c pam_auth.c popen.c pw_dup.c user.c
+CPPFLAGS+=-I${.CURDIR} -DLOGIN_CAP -DUSE_PAM
+DPADD+=${LIBPAM} ${LIBUTIL}
+LDADD+=-lpam -lutil
 MAN=   cron.8
 
 CWARNFLAGS.clang+=     -Wno-string-plus-int
diff -r af2e328df18f -r 3ac464759e4f external/bsd/cron/bin/crontab/Makefile
--- a/external/bsd/cron/bin/crontab/Makefile    Fri Jun 09 17:29:03 2017 +0000
+++ b/external/bsd/cron/bin/crontab/Makefile    Fri Jun 09 17:36:29 2017 +0000
@@ -1,10 +1,10 @@
-#      $NetBSD: Makefile,v 1.2 2010/05/07 21:54:07 christos Exp $
+#      $NetBSD: Makefile,v 1.3 2017/06/09 17:36:29 christos Exp $
 
 .include <bsd.own.mk>
 
 USE_FORT?= yes # setuid
 PROG=  crontab
-SRCS=  crontab.c misc.c entry.c env.c pw_dup.c
+SRCS=  crontab.c misc.c entry.c env.c pw_dup.c closeall.c
 CPPFLAGS+=-I${.CURDIR} -DDEBUGGING=1
 BINOWN =root
 BINMODE=4555
diff -r af2e328df18f -r 3ac464759e4f external/bsd/cron/dist/Makefile
--- a/external/bsd/cron/dist/Makefile   Fri Jun 09 17:29:03 2017 +0000
+++ b/external/bsd/cron/dist/Makefile   Fri Jun 09 17:36:29 2017 +0000
@@ -86,14 +86,14 @@
 HEADERS                =       bitstring.h cron.h config.h pathnames.h externs.h \
                        macros.h structs.h funcs.h globals.h
 SOURCES                =       cron.c crontab.c database.c do_command.c entry.c \
-                       env.c job.c user.c popen.c misc.c pw_dup.c
+                       env.c job.c user.c popen.c misc.c pam_auth.c pw_dup.c
 SHAR_SOURCE    =       $(INFOS) $(MANPAGES) Makefile $(HEADERS) $(SOURCES)
 LINT_CRON      =       cron.c database.c user.c entry.c \
                        misc.c job.c do_command.c env.c popen.c pw_dup.c
 LINT_CRONTAB   =       crontab.c misc.c entry.c env.c
 CRON_OBJ       =       cron.o database.o user.o entry.o job.o do_command.o \
                        misc.o env.o popen.o pw_dup.o
-CRONTAB_OBJ    =       crontab.o misc.o entry.o env.o pw_dup.o
+CRONTAB_OBJ    =       crontab.o misc.o entry.o env.o pw_dup.o closeall.o
 
 all            :       cron crontab
 
diff -r af2e328df18f -r 3ac464759e4f external/bsd/cron/dist/closeall.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/external/bsd/cron/dist/closeall.c Fri Jun 09 17:36:29 2017 +0000
@@ -0,0 +1,34 @@
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#ifdef __linux__
+#include <linux/limits.h>
+#endif
+
+#include "cron.h"
+
+int close_all(int start)
+{
+#ifdef F_CLOSEM
+       return fcntl(start, F_CLOSEM);
+#else
+       int fd, max;
+
+       max = sysconf(_SC_OPEN_MAX);
+       if (max <= 0)
+               return -1;
+
+#ifdef __linux__
+       if (max < NR_OPEN)
+               max = NR_OPEN;
+#endif
+
+       for (fd = start; fd < max; fd++) {
+               if (close(fd) && errno != EBADF)
+                       return -1;
+       }
+
+       return 0;
+#endif
+}
diff -r af2e328df18f -r 3ac464759e4f external/bsd/cron/dist/config.h
--- a/external/bsd/cron/dist/config.h   Fri Jun 09 17:29:03 2017 +0000
+++ b/external/bsd/cron/dist/config.h   Fri Jun 09 17:36:29 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: config.h,v 1.4 2012/11/03 15:39:23 christos Exp $      */
+/*     $NetBSD: config.h,v 1.5 2017/06/09 17:36:30 christos Exp $      */
 
 /* Copyright 1988,1990,1993,1994 by Paul Vixie
  * All rights reserved
@@ -94,6 +94,7 @@
 #define HAVE_FCHOWN            /*-*/
 #define HAVE_UTIMES            /*-*/
 #define HAVE_UTIMENSAT
+#define HAVE_FUTIMENS
 #define _INCOMPLETE_XOPEN_C063
 
                        /* if your OS supports a BSD-style login.conf file */
@@ -108,6 +109,11 @@
                         * If this is not defined then crontab and at
                         * must be setuid root.
                         */
+                       /* if your os supports PAM authentication */
+/*#define USE_PAM                      */
+
 /*#define CRON_GROUP   "crontab"       */
 
+#define ENABLE_FIX_DIRECTORIES
+
 #define MAXTABSIZE_DEFAULT     (1024*256)
diff -r af2e328df18f -r 3ac464759e4f external/bsd/cron/dist/cron.c
--- a/external/bsd/cron/dist/cron.c     Fri Jun 09 17:29:03 2017 +0000
+++ b/external/bsd/cron/dist/cron.c     Fri Jun 09 17:36:29 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cron.c,v 1.9 2014/09/07 13:34:12 joerg Exp $   */
+/*     $NetBSD: cron.c,v 1.10 2017/06/09 17:36:30 christos Exp $       */
 
 /* Copyright 1988,1990,1993,1994 by Paul Vixie
  * All rights reserved
@@ -25,7 +25,7 @@
 #if 0
 static char rcsid[] = "Id: cron.c,v 1.12 2004/01/23 18:56:42 vixie Exp";
 #else
-__RCSID("$NetBSD: cron.c,v 1.9 2014/09/07 13:34:12 joerg Exp $");
+__RCSID("$NetBSD: cron.c,v 1.10 2017/06/09 17:36:30 christos Exp $");
 #endif
 #endif
 
@@ -511,11 +511,10 @@
 
 static void
 sigchld_reaper(void) {
-       WAIT_T waiter;
-       PID_T pid;
+       for (;;) {
+               WAIT_T waiter;
+               PID_T pid = waitpid(-1, &waiter, WNOHANG);
 
-       do {
-               pid = waitpid(-1, &waiter, WNOHANG);
                switch (pid) {
                case -1:
                        if (errno == EINTR)
@@ -523,19 +522,19 @@
                        Debug(DPROC,
                              ("[%ld] sigchld...no children\n",
                               (long)getpid()));
-                       break;
+                       return;
                case 0:
                        Debug(DPROC,
                              ("[%ld] sigchld...no dead kids\n",
                               (long)getpid()));
-                       break;
+                       return;
                default:
                        Debug(DPROC,
                              ("[%ld] sigchld...pid #%ld died, stat=%d\n",
                               (long)getpid(), (long)pid, WEXITSTATUS(waiter)));
                        break;
                }
-       } while (pid > 0);
+       }
 }
 
 static void
diff -r af2e328df18f -r 3ac464759e4f external/bsd/cron/dist/crontab.c
--- a/external/bsd/cron/dist/crontab.c  Fri Jun 09 17:29:03 2017 +0000
+++ b/external/bsd/cron/dist/crontab.c  Fri Jun 09 17:36:29 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: crontab.c,v 1.13 2015/01/04 18:45:17 joerg Exp $       */
+/*     $NetBSD: crontab.c,v 1.14 2017/06/09 17:36:30 christos Exp $    */
 
 /* Copyright 1988,1990,1993,1994 by Paul Vixie
  * All rights reserved
@@ -25,7 +25,7 @@
 #if 0
 static char rcsid[] = "Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp";
 #else
-__RCSID("$NetBSD: crontab.c,v 1.13 2015/01/04 18:45:17 joerg Exp $");
+__RCSID("$NetBSD: crontab.c,v 1.14 2017/06/09 17:36:30 christos Exp $");
 #endif
 #endif
 
@@ -429,7 +429,11 @@
        if (fflush(NewCrontab) < OK) {
                err(ERROR_EXIT, "cannot flush output for `%s'", Filename);
        }
+#ifdef HAVE_FUTIMENS
+       if (futimens(t, ts) == -1)
+#else
        if (change_time(Filename, ts) == -1)
+#endif
                err(ERROR_EXIT, "cannot set time info for `%s'", Filename);
  again:
        rewind(NewCrontab);
@@ -465,6 +469,9 @@
                if (setuid(MY_UID(pw)) < 0) {
                        err(ERROR_EXIT, "cannot setuid(getuid())");
                }
+               if (close_all(3)) {
+                       err(ERROR_EXIT, "cannot close files");
+               }
                if (chdir(_PATH_TMP) < 0) {
                        err(ERROR_EXIT, "cannot chdir to `%s'", _PATH_TMP);
                }
@@ -682,7 +689,7 @@
            "# (%s installed on %-24.24s)\n", Filename, ctime(&now));
        (void)fprintf(tmp,
            "# (Cron version %s -- %s)\n", CRON_VERSION,
-           "$NetBSD: crontab.c,v 1.13 2015/01/04 18:45:17 joerg Exp $");
+           "$NetBSD: crontab.c,v 1.14 2017/06/09 17:36:30 christos Exp $");
 
        /* copy the crontab to the tmp
         */
diff -r af2e328df18f -r 3ac464759e4f external/bsd/cron/dist/database.c
--- a/external/bsd/cron/dist/database.c Fri Jun 09 17:29:03 2017 +0000
+++ b/external/bsd/cron/dist/database.c Fri Jun 09 17:36:29 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: database.c,v 1.8 2012/12/24 19:30:46 christos Exp $    */
+/*     $NetBSD: database.c,v 1.9 2017/06/09 17:36:30 christos Exp $    */
 
 /* Copyright 1988,1990,1993,1994 by Paul Vixie
  * All rights reserved
@@ -25,7 +25,7 @@
 #if 0
 static char rcsid[] = "Id: database.c,v 1.7 2004/01/23 18:56:42 vixie Exp";
 #else
-__RCSID("$NetBSD: database.c,v 1.8 2012/12/24 19:30:46 christos Exp $");
+__RCSID("$NetBSD: database.c,v 1.9 2017/06/09 17:36:30 christos Exp $");
 #endif
 #endif
 
@@ -36,16 +36,33 @@
 
 #define TMAX(a,b) ((a)>(b)?(a):(b))
 
+struct spooldir {
+       const char *path;
+       const char *uname;
+       const char *fname;
+       struct stat st;
+};
+
+static struct spooldir spools[] = {
+       { .path = SPOOL_DIR, },
+       { .path = CROND_DIR, .uname = "root", .fname = "*system*", },
+       { .path = NULL, }
+};
+
 static void            process_crontab(const char *, const char *,
                                        const char *, struct stat *,
                                        cron_db *, cron_db *);
 
 static void
-process_dir(const char *dname, struct stat *st, int sys, cron_db *new_db,
-    cron_db *old_db)
+process_dir(struct spooldir *sp, cron_db *new_db, cron_db *old_db)
 {
        DIR *dir;
        DIR_T *dp;
+       const char *dname = sp->path;
+       struct stat *st = &sp->st;
+
+       if (st->st_mtime == 0)
+               return;
 
        /* we used to keep this dir open all the time, for the sake of
         * efficiency.  however, we need to close it in every fork, and
@@ -109,40 +126,41 @@
                        continue;
                }
 
-               process_crontab(sys ? "root" : fname, sys ? "*system*" :
-                               fname, tabname, st, new_db, old_db);
+               process_crontab(sp->uname ? sp->uname : fname,
+                               sp->fname ? sp->fname : fname,
+                               tabname, st, new_db, old_db);
        }
        (void)closedir(dir);
 }
 
 void
 load_database(cron_db *old_db) {
-       struct stat spool_stat, syscron_stat, crond_stat;
+       struct stat syscron_stat;
        cron_db new_db;



Home | Main Index | Thread Index | Old Index