Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 5 Feb 2020 04:35:54 +0000 (UTC)
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r357565 - in head/usr.sbin/cron: cron crontab
Message-ID:  <202002050435.0154ZscZ085181@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevans
Date: Wed Feb  5 04:35:54 2020
New Revision: 357565
URL: https://svnweb.freebsd.org/changeset/base/357565

Log:
  cron(8): set the environment variables of the user and/or login class
  
  Prior to processing environment variable set in the crontab file as those
  should be of higher precedent, pull in the user or login class environment.
  
  This is another supporting feature for allowing one to configure system-wide
  settings that may affect both regular cron jobs as well as services.
  
  This is the final part of D21481.
  
  Submitted by:	Andrew Gierth <andrew_tao173.riddles.org.uk>

Modified:
  head/usr.sbin/cron/cron/do_command.c
  head/usr.sbin/cron/crontab/crontab.5

Modified: head/usr.sbin/cron/cron/do_command.c
==============================================================================
--- head/usr.sbin/cron/cron/do_command.c	Wed Feb  5 04:32:49 2020	(r357564)
+++ head/usr.sbin/cron/cron/do_command.c	Wed Feb  5 04:35:54 2020	(r357565)
@@ -43,6 +43,8 @@ static void		child_process(entry *, user *),
 
 static WAIT_T		wait_on_child(PID_T, const char *);
 
+extern char	*environ;
+
 void
 do_command(e, u)
 	entry	*e;
@@ -285,9 +287,11 @@ child_process(e, u)
 		 */
 		do_univ(u);
 
+		environ = NULL;
+
 # if defined(LOGIN_CAP)
-		/* Set user's entire context, but skip the environment
-		 * as cron provides a separate interface for this
+		/* Set user's entire context, but note that PATH will
+		 * be overridden later
 		 */
 		if ((pwd = getpwnam(usernm)) == NULL)
 			pwd = getpwuid(e->uid);
@@ -299,7 +303,7 @@ child_process(e, u)
 		}
 		if (pwd &&
 		    setusercontext(lc, pwd, e->uid,
-			    LOGIN_SETALL & ~(LOGIN_SETPATH|LOGIN_SETENV)) == 0)
+			    LOGIN_SETALL) == 0)
 			(void) endpwent();
 		else {
 			/* fall back to the old method */
@@ -342,7 +346,19 @@ child_process(e, u)
 		 */
 		{
 			char	*shell = env_get("SHELL", e->envp);
+			char	**p;
 
+			/* Apply the environment from the entry, overriding existing
+			 * values (this will always set PATH, LOGNAME, etc.) putenv
+			 * should not fail unless malloc does.
+			 */
+			for (p = e->envp; *p; ++p) {
+				if (putenv(*p) != 0) {
+					warn("putenv");
+					_exit(ERROR_EXIT);
+				}
+			}
+
 # if DEBUGGING
 			if (DebugFlags & DTEST) {
 				fprintf(stderr,
@@ -352,9 +368,8 @@ child_process(e, u)
 				_exit(OK_EXIT);
 			}
 # endif /*DEBUGGING*/
-			execle(shell, shell, "-c", e->cmd, (char *)NULL,
-			    e->envp);
-			warn("execle: couldn't exec `%s'", shell);
+			execl(shell, shell, "-c", e->cmd, (char *)NULL);
+			warn("execl: couldn't exec `%s'", shell);
 			_exit(ERROR_EXIT);
 		}
 		break;

Modified: head/usr.sbin/cron/crontab/crontab.5
==============================================================================
--- head/usr.sbin/cron/crontab/crontab.5	Wed Feb  5 04:32:49 2020	(r357564)
+++ head/usr.sbin/cron/crontab/crontab.5	Wed Feb  5 04:35:54 2020	(r357565)
@@ -17,7 +17,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd September 24, 2019
+.Dd January 19, 2020
 .Dt CRONTAB 5
 .Os
 .Sh NAME
@@ -82,10 +82,18 @@ and
 are set from the
 .Pa /etc/passwd
 line of the crontab's owner.
+In addition, the environment variables of the
+user's login class, with the exception of
+.Ev PATH ,
+will be set from
+.Pa /etc/login.conf.db
+and
+.Pa ~/.login_conf .
 .Ev HOME ,
 .Ev PATH
 and
-.Ev SHELL
+.Ev SHELL ,
+and any variables set from the login class,
 may be overridden by settings in the crontab;
 .Ev LOGNAME
 may not.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202002050435.0154ZscZ085181>