svn commit: r184780 - head/usr.sbin/cron/crontab

Matteo Riondato matteo at FreeBSD.org
Sat Nov 8 23:34:12 PST 2008


Author: matteo
Date: Sun Nov  9 07:34:11 2008
New Revision: 184780
URL: http://svn.freebsd.org/changeset/base/184780

Log:
  Don't leave files in /var/cront/tabs when interrupted
  
  PR:		17363
  MFC after:	3 days

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

Modified: head/usr.sbin/cron/crontab/crontab.c
==============================================================================
--- head/usr.sbin/cron/crontab/crontab.c	Sun Nov  9 06:44:53 2008	(r184779)
+++ head/usr.sbin/cron/crontab/crontab.c	Sun Nov  9 07:34:11 2008	(r184780)
@@ -63,6 +63,7 @@ static	FILE		*NewCrontab;
 static	int		CheckErrorCount;
 static	enum opt_t	Option;
 static	struct passwd	*pw;
+static	char 		*tmp_path;
 static	void		list_cmd(void),
 			delete_cmd(void),
 			edit_cmd(void),
@@ -486,6 +487,16 @@ edit_cmd() {
 }
 
 
+void
+static remove_tmp(int sig)
+{
+	if (tmp_path) {
+		unlink(tmp_path);
+	}
+	exit(ERROR_EXIT);
+}
+
+
 /* returns	0	on success
  *		-1	on syntax error
  *		-2	on install error
@@ -498,6 +509,7 @@ replace_cmd() {
 	entry	*e;
 	time_t	now = time(NULL);
 	char	**envp = env_init();
+	void (*f[3])();
 
 	if (envp == NULL) {
 		warnx("cannot allocate memory");
@@ -506,6 +518,13 @@ replace_cmd() {
 
 	(void) snprintf(n, sizeof(n), "tmp.%d", Pid);
 	(void) snprintf(tn, sizeof(n), CRON_TAB(n));
+
+	/* Set up to remove the temp file if interrupted by a signal. */
+	f[0] = signal(SIGHUP, remove_tmp);
+	f[1] = signal(SIGINT, remove_tmp);
+	f[2] = signal(SIGTERM, remove_tmp);
+	tmp_path = tn;
+
 	if (!(tmp = fopen(tn, "w+"))) {
 		warn("%s", tn);
 		return (-2);
@@ -598,6 +617,13 @@ replace_cmd() {
 		unlink(tn);
 		return (-2);
 	}
+
+	/* Restore the default signal handlers. */
+	tmp_path = NULL;
+	signal(SIGHUP, f[0]);
+	signal(SIGINT, f[1]);
+	signal(SIGTERM, f[2]);
+
 	log_it(RealUser, Pid, "REPLACE", User);
 
 	poke_daemon();


More information about the svn-src-all mailing list