Merge authors: James Hunt (jamesodhunt) Related merge proposals: https://code.launchpad.net/~jamesodhunt/upstart/bug-1302117-remerged/+merge/225177 proposed by: James Hunt (jamesodhunt) review: Approve - Dimitri John Ledkov (xnox) ------------------------------------------------------------ revno: 1642 [merge] fixes bug: https://launchpad.net/bugs/1302117 committer: Dimitri John Ledkov <dimitri.led...@canonical.com> branch nick: trunk timestamp: Mon 2014-07-07 17:39:49 +0100 message: Merge lp:~jamesodhunt/upstart/bug-1302117-remerged modified: ChangeLog init/log.c init/tests/test_job_process.c util/tests/test_initctl.c
-- lp:upstart https://code.launchpad.net/~upstart-devel/upstart/trunk Your team Upstart Reviewers is subscribed to branch lp:upstart. To unsubscribe from this branch go to https://code.launchpad.net/~upstart-devel/upstart/trunk/+edit-subscription
=== modified file 'ChangeLog' --- ChangeLog 2014-07-03 08:59:30 +0000 +++ ChangeLog 2014-07-07 10:15:25 +0000 @@ -1,3 +1,10 @@ +2014-07-07 James Hunt <james.h...@ubuntu.com> + + * init/tests/test_job_process.c: test_handler(): + - Remove logs generated by PROCESS_MAIN. This wasn't necessary before + due to the manifestation of LP: #1302117 not restoring the correct + umask. + 2014-07-03 James Hunt <james.h...@ubuntu.com> * init/job_process.c: @@ -97,6 +104,13 @@ - Clarify default behaviour of 'respawn' stanza. - Add missing 'respawn limit unlimited' details. +2014-04-10 James Hunt <james.h...@ubuntu.com> + + * init/log.c: log_file_open(): Restore umask after opening log file + (LP: #1302117). + * util/tests/test_initctl.c: test_reexec(): New test: + - "ensure re-exec does not disrupt umask". + 2014-03-11 James Hunt <james.h...@ubuntu.com> * NEWS: Release 1.12.1 === modified file 'init/log.c' --- init/log.c 2014-06-04 17:37:59 +0000 +++ init/log.c 2014-07-07 16:39:49 +0000 @@ -405,6 +405,7 @@ struct stat statbuf; int ret = -1; int mode = LOG_DEFAULT_MODE; + mode_t old; int flags = (O_CREAT | O_APPEND | O_WRONLY | O_CLOEXEC | O_NOFOLLOW | O_NONBLOCK); @@ -439,7 +440,7 @@ nih_assert (log->fd == -1); /* Impose some sane defaults. */ - umask (LOG_DEFAULT_UMASK); + old = umask (LOG_DEFAULT_UMASK); /* Non-blocking to avoid holding up the main loop. Without * this, we'd probably need to spawn a thread to handle @@ -447,6 +448,9 @@ */ log->fd = open (log->path, flags, mode); + /* Restore */ + umask (old); + log->open_errno = errno; /* Open may have failed due to path being unaccessible === modified file 'init/tests/test_job_process.c' --- init/tests/test_job_process.c 2014-06-05 17:57:29 +0000 +++ init/tests/test_job_process.c 2014-07-07 10:15:25 +0000 @@ -1,11 +1,8 @@ -/* - * FIXME: test_job_process has been left behind - */ /* upstart * * test_job_process.c - test suite for init/job_process.c * - * Copyright 2011 Canonical Ltd. + * Copyright © 2011-2014 Canonical Ltd. * Author: Scott James Remnant <sc...@netsplit.com>. * * This program is free software; you can redistribute it and/or modify @@ -5489,11 +5486,16 @@ unsigned long data; struct timespec now; char dirname[PATH_MAX]; + nih_local char *logfile = NULL; + int fds[2] = { -1, -1}; TEST_FILENAME (dirname); TEST_EQ (mkdir (dirname, 0755), 0); TEST_EQ (setenv ("UPSTART_LOGDIR", dirname, 1), 0); + logfile = NIH_MUST (nih_sprintf (NULL, "%s/%s.log", + dirname, "test")); + TEST_FUNCTION ("job_process_handler"); program_name = "test"; output = tmpfile (); @@ -5763,6 +5765,9 @@ class->process[PROCESS_PRE_START] = process_new (class); class->process[PROCESS_PRE_START]->command = "echo"; + assert0 (pipe (fds)); + close (fds[1]); + TEST_ALLOC_FAIL { TEST_ALLOC_SAFE { job = job_new (class, ""); @@ -5770,6 +5775,9 @@ blocked = blocked_new (job, BLOCKED_EVENT, event); event_block (event); nih_list_add (&job->blocking, &blocked->entry); + + job->process_data[PROCESS_PRE_START] = NIH_MUST ( + job_process_data_new (job->process_data, job, PROCESS_PRE_START, fds[0])); } job->goal = JOB_START; @@ -5812,9 +5820,12 @@ nih_free (job); } + close (fds[0]); + nih_free (class->process[PROCESS_PRE_START]); class->process[PROCESS_PRE_START] = NULL; + unlink (logfile); /* Check that we can handle a failing pre-start process of the job, * which changes the goal to stop and transitions a state change in @@ -5890,6 +5901,7 @@ nih_free (class->process[PROCESS_PRE_START]); class->process[PROCESS_PRE_START] = NULL; + unlink (logfile); /* Check that we can handle a killed starting task, which should * act as if it failed. A different error should be output and @@ -5964,6 +5976,7 @@ nih_free (class->process[PROCESS_PRE_START]); class->process[PROCESS_PRE_START] = NULL; + unlink (logfile); /* Check that we can catch the running task of a service stopping * with an error, and if the job is to be respawned, go into === modified file 'util/tests/test_initctl.c' --- util/tests/test_initctl.c 2014-06-05 10:13:51 +0000 +++ util/tests/test_initctl.c 2014-07-01 15:34:42 +0000 @@ -11052,6 +11052,8 @@ FILE *file; int ok; int ret; + mode_t expected_umask; + size_t len; TEST_GROUP ("re-exec support"); @@ -11317,6 +11319,80 @@ STOP_UPSTART (upstart_pid); /*******************************************************************/ + TEST_FEATURE ("ensure re-exec does not disrupt umask"); + + contents = nih_sprintf (NULL, "exec sh -c umask"); + TEST_NE_P (contents, NULL); + + CREATE_FILE (confdir, "umask.conf", contents); + nih_free (contents); + + start_upstart_common (&upstart_pid, TRUE, TRUE, confdir, logdir, NULL); + + cmd = nih_sprintf (NULL, "%s start umask 2>&1", get_initctl ()); + TEST_NE_P (cmd, NULL); + RUN_COMMAND (NULL, cmd, &output, &lines); + nih_free (output); + + logfile = NIH_MUST (nih_sprintf (NULL, "%s/%s", + logdir, + "umask.log")); + + /* Wait for log to be created */ + ok = FALSE; + for (int i = 0; i < 5; i++) { + sleep (1); + if (! stat (logfile, &statbuf)) { + ok = TRUE; + break; + } + } + TEST_EQ (ok, TRUE); + + contents = nih_file_read (NULL, logfile, &len); + TEST_NE_P (contents, NULL); + TEST_TRUE (len); + + /* overwrite '\n' */ + contents[len-1] = '\0'; + + expected_umask = (mode_t)atoi (contents); + assert0 (unlink (logfile)); + nih_free (contents); + + /* Restart */ + REEXEC_UPSTART (upstart_pid, TRUE); + + /* Re-run job */ + RUN_COMMAND (NULL, cmd, &output, &lines); + nih_free (output); + + /* Wait for log to be recreated */ + ok = FALSE; + for (int i = 0; i < 5; i++) { + sleep (1); + if (! stat (logfile, &statbuf)) { + ok = TRUE; + break; + } + } + TEST_EQ (ok, TRUE); + + contents = nih_file_read (NULL, logfile, &len); + TEST_NE_P (contents, NULL); + TEST_TRUE (len); + + /* overwrite '\n' */ + contents[len-1] = '\0'; + + TEST_EQ (expected_umask, (mode_t)atoi (contents)); + + STOP_UPSTART (upstart_pid); + + DELETE_FILE (confdir, "umask.conf"); + assert0 (unlink (logfile)); + + /*******************************************************************/ TEST_DBUS_END (dbus_pid);
-- upstart-devel mailing list upstart-devel@lists.ubuntu.com Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/upstart-devel