Merge lp:~stgraber/upstart/upstart-shell-paths into lp:upstart

Proposed by Stéphane Graber
Status: Merged
Merged at revision: 1408
Proposed branch: lp:~stgraber/upstart/upstart-shell-paths
Merge into: lp:upstart
Diff against target: 65 lines (+18/-3)
2 files modified
init/job_process.c (+10/-3)
init/tests/test_job_process.c (+8/-0)
To merge this branch: bzr merge lp:~stgraber/upstart/upstart-shell-paths
Reviewer Review Type Date Requested Status
James Hunt Approve
Review via email: mp+140175@code.launchpad.net

Description of the change

We recently noticed a bunch of upstart build failures caused by
test_job_process reporting that pWD=/ was added to the environment which
wasn't quite expected.

This was eventually tracked down to upstart calling the command through a
shell if any of the usual shell special characters are found (like ~ in this
case).

This branch does two things:
 - Changes job_process.c slightly to explicitly set ->script = TRUE when
   upstart decides that the command needs to be run under a shell.
 - Updates the tests to check for the post-run value of ->script and allow
   for PWD=/ in such case.

PWD will always be / if present as the shell itself is provided without any
environment and so can't inherit PWD.

To post a comment you must log in.
1409. By Stéphane Graber

Cleanup

Revision history for this message
James Hunt (jamesodhunt) wrote :

This is bug 1086474.

LGTM. Merged.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'init/job_process.c'
--- init/job_process.c 2012-12-03 20:27:09 +0000
+++ init/job_process.c 2012-12-17 11:39:20 +0000
@@ -178,11 +178,18 @@
178 nih_assert (proc != NULL);178 nih_assert (proc != NULL);
179 nih_assert (proc->command != NULL);179 nih_assert (proc->command != NULL);
180180
181
182 /* If the command string contains any shell-like characters,
183 * automatically set script = TRUE since that's the best way to deal
184 * with things like variables.
185 */
186 if (strpbrk (proc->command, SHELL_CHARS))
187 proc->script = TRUE;
188
181 /* We run the process using a shell if it says it wants to be run189 /* We run the process using a shell if it says it wants to be run
182 * as such, or if it contains any shell-like characters; since that's190 * as such.
183 * the best way to deal with things like variables.
184 */191 */
185 if ((proc->script) || strpbrk (proc->command, SHELL_CHARS)) {192 if (proc->script) {
186 char *nl, *p;193 char *nl, *p;
187194
188 argc = 0;195 argc = 0;
189196
=== modified file 'init/tests/test_job_process.c'
--- init/tests/test_job_process.c 2012-12-07 21:52:38 +0000
+++ init/tests/test_job_process.c 2012-12-17 11:39:20 +0000
@@ -680,6 +680,8 @@
680 output = fopen (filename, "r");680 output = fopen (filename, "r");
681 TEST_FILE_EQ (output, "BAR=BAZ\n");681 TEST_FILE_EQ (output, "BAR=BAZ\n");
682 TEST_FILE_EQ (output, "FOO=BAR\n");682 TEST_FILE_EQ (output, "FOO=BAR\n");
683 if (job->class->process[PROCESS_MAIN]->script)
684 TEST_FILE_EQ (output, "PWD=/\n");
683 TEST_FILE_EQ (output, "UPSTART_INSTANCE=\n");685 TEST_FILE_EQ (output, "UPSTART_INSTANCE=\n");
684 TEST_FILE_EQ (output, "UPSTART_JOB=test\n");686 TEST_FILE_EQ (output, "UPSTART_JOB=test\n");
685 TEST_FILE_EQ (output, "UPSTART_NO_SESSIONS=1\n");687 TEST_FILE_EQ (output, "UPSTART_NO_SESSIONS=1\n");
@@ -734,6 +736,8 @@
734 output = fopen (filename, "r");736 output = fopen (filename, "r");
735 TEST_FILE_EQ (output, "BAR=BAZ\n");737 TEST_FILE_EQ (output, "BAR=BAZ\n");
736 TEST_FILE_EQ (output, "FOO=BAR\n");738 TEST_FILE_EQ (output, "FOO=BAR\n");
739 if (job->class->process[PROCESS_MAIN]->script)
740 TEST_FILE_EQ (output, "PWD=/\n");
737 TEST_FILE_EQ (output, "UPSTART_INSTANCE=foo\n");741 TEST_FILE_EQ (output, "UPSTART_INSTANCE=foo\n");
738 TEST_FILE_EQ (output, "UPSTART_JOB=test\n");742 TEST_FILE_EQ (output, "UPSTART_JOB=test\n");
739 TEST_FILE_EQ (output, "UPSTART_NO_SESSIONS=1\n");743 TEST_FILE_EQ (output, "UPSTART_NO_SESSIONS=1\n");
@@ -790,6 +794,8 @@
790 TEST_FILE_EQ (output, "BAR=BAZ\n");794 TEST_FILE_EQ (output, "BAR=BAZ\n");
791 TEST_FILE_EQ (output, "CRACKLE=FIZZ\n");795 TEST_FILE_EQ (output, "CRACKLE=FIZZ\n");
792 TEST_FILE_EQ (output, "FOO=SMACK\n");796 TEST_FILE_EQ (output, "FOO=SMACK\n");
797 if (job->class->process[PROCESS_PRE_STOP]->script)
798 TEST_FILE_EQ (output, "PWD=/\n");
793 TEST_FILE_EQ (output, "UPSTART_INSTANCE=\n");799 TEST_FILE_EQ (output, "UPSTART_INSTANCE=\n");
794 TEST_FILE_EQ (output, "UPSTART_JOB=test\n");800 TEST_FILE_EQ (output, "UPSTART_JOB=test\n");
795 TEST_FILE_EQ (output, "UPSTART_NO_SESSIONS=1\n");801 TEST_FILE_EQ (output, "UPSTART_NO_SESSIONS=1\n");
@@ -846,6 +852,8 @@
846 TEST_FILE_EQ (output, "BAR=BAZ\n");852 TEST_FILE_EQ (output, "BAR=BAZ\n");
847 TEST_FILE_EQ (output, "CRACKLE=FIZZ\n");853 TEST_FILE_EQ (output, "CRACKLE=FIZZ\n");
848 TEST_FILE_EQ (output, "FOO=SMACK\n");854 TEST_FILE_EQ (output, "FOO=SMACK\n");
855 if (job->class->process[PROCESS_POST_STOP]->script)
856 TEST_FILE_EQ (output, "PWD=/\n");
849 TEST_FILE_EQ (output, "UPSTART_INSTANCE=\n");857 TEST_FILE_EQ (output, "UPSTART_INSTANCE=\n");
850 TEST_FILE_EQ (output, "UPSTART_JOB=test\n");858 TEST_FILE_EQ (output, "UPSTART_JOB=test\n");
851 TEST_FILE_EQ (output, "UPSTART_NO_SESSIONS=1\n");859 TEST_FILE_EQ (output, "UPSTART_NO_SESSIONS=1\n");

Subscribers

People subscribed via source and target branches