James Hunt has proposed merging lp:~jamesodhunt/upstart/bug-1222705-reprise into lp:upstart.
Requested reviews: Upstart Reviewers (upstart-reviewers) For more details, see: https://code.launchpad.net/~jamesodhunt/upstart/bug-1222705-reprise/+merge/226983 -- https://code.launchpad.net/~jamesodhunt/upstart/bug-1222705-reprise/+merge/226983 Your team Upstart Reviewers is requested to review the proposed merge of lp:~jamesodhunt/upstart/bug-1222705-reprise into lp:upstart.
=== modified file 'ChangeLog' --- ChangeLog 2014-07-11 21:32:38 +0000 +++ ChangeLog 2014-07-16 09:47:35 +0000 @@ -1,3 +1,11 @@ +2014-07-16 James Hunt <james.h...@ubuntu.com> + + * init/environ.c: environ_remove(): + - Ensure removed entry is deref'd (LP: #1222705). + - Avoid recreating array. + * init/tests/test_environ.c: test_remove(): Add checks to ensure + removed entry freed as expected. + 2014-07-11 James Hunt <james.h...@ubuntu.com> * NEWS: Release 1.13 === modified file 'init/environ.c' --- init/environ.c 2013-10-24 13:33:05 +0000 +++ init/environ.c 2014-07-16 09:47:35 +0000 @@ -176,9 +176,7 @@ { size_t _len; size_t keylen; - size_t new_len = 0; char **e; - char **new_env; nih_assert (env); nih_assert (str); @@ -195,10 +193,6 @@ if (*len < 1) return NULL; - new_env = nih_str_array_new (NULL); - if (! new_env) - return NULL; - for (e = *env; e && *e; e++) { keylen = strcspn (*e, "="); @@ -206,17 +200,17 @@ * name=value pair, or a bare name), so don't copy it to * the new environment. */ - if (! strncmp (str, *e, keylen)) - continue; - - if (! environ_add (&new_env, parent, &new_len, TRUE, *e)) - return NULL; + if (! strncmp (str, *e, keylen)) { + nih_unref (*e, *env); + + /* shuffle up the remaining entries */ + memmove (e, e + 1, (char *)(*env + *len) - (char *)e); + + (*len)--; + } } - *env = new_env; - *len = new_len; - - return new_env; + return *env; } /** === modified file 'init/tests/test_environ.c' --- init/tests/test_environ.c 2013-10-24 13:33:05 +0000 +++ init/tests/test_environ.c 2014-07-16 09:47:35 +0000 @@ -618,8 +618,10 @@ void test_remove (void) { - char **env = NULL, **ret; - size_t len = 0; + char **env = NULL; + char *removed = NULL; + char **ret = NULL; + size_t len = 0; TEST_FUNCTION ("environ_remove"); @@ -688,6 +690,9 @@ TEST_ALLOC_PARENT (env[0], env); TEST_ALLOC_SIZE (env[0], 8); TEST_EQ_STR (env[0], "FOO=BAR"); + removed = env[0]; + TEST_FREE_TAG (removed); + TEST_EQ_P (env[1], NULL); } @@ -713,6 +718,7 @@ TEST_NE_P (ret, NULL); TEST_EQ (len, 0); TEST_EQ_P (env[0], NULL); + TEST_FREE (removed); nih_free (env); } @@ -730,6 +736,9 @@ TEST_ALLOC_PARENT (env[0], env); TEST_ALLOC_SIZE (env[0], 8); TEST_EQ_STR (env[0], "FOO=BAR"); + removed = env[0]; + TEST_FREE_TAG (removed); + TEST_EQ_P (env[1], NULL); } @@ -755,6 +764,7 @@ TEST_NE_P (ret, NULL); TEST_EQ (len, 0); TEST_EQ_P (env[0], NULL); + TEST_FREE (removed); nih_free (env); } @@ -781,6 +791,8 @@ TEST_ALLOC_PARENT (env[0], env); TEST_ALLOC_SIZE (env[0], 8); TEST_EQ_STR (env[0], "FOO=BAR"); + removed = env[0]; + TEST_FREE_TAG (removed); TEST_ALLOC_PARENT (env[1], env); TEST_ALLOC_SIZE (env[1], 8); @@ -816,6 +828,7 @@ TEST_ALLOC_PARENT (env[0], env); TEST_ALLOC_SIZE (env[0], 8); TEST_EQ_STR (env[0], "BAZ=QUX"); + TEST_FREE (removed); TEST_EQ_P (env[1], NULL); @@ -852,6 +865,8 @@ TEST_ALLOC_PARENT (env[0], env); TEST_ALLOC_SIZE (env[0], 8); TEST_EQ_STR (env[0], "UPSTART_TEST_VARIABLE=foo"); + removed = env[0]; + TEST_FREE_TAG (removed); TEST_ALLOC_PARENT (env[1], env); TEST_ALLOC_SIZE (env[1], 8); @@ -887,6 +902,7 @@ TEST_ALLOC_PARENT (env[0], env); TEST_ALLOC_SIZE (env[0], 8); TEST_EQ_STR (env[0], "BAZ=QUX"); + TEST_FREE (removed); TEST_EQ_P (env[1], NULL); @@ -921,6 +937,8 @@ TEST_ALLOC_PARENT (env[1], env); TEST_ALLOC_SIZE (env[1], 8); TEST_EQ_STR (env[1], "BAZ=QUX"); + removed = env[1]; + TEST_FREE_TAG (removed); TEST_EQ_P (env[2], NULL); } @@ -954,6 +972,7 @@ TEST_EQ_STR (env[0], "FOO=BAR"); TEST_EQ_P (env[1], NULL); + TEST_FREE (removed); nih_free (env); } @@ -991,6 +1010,9 @@ /* Should have been expanded */ TEST_EQ_STR (env[1], "UPSTART_TEST_VARIABLE=foo"); + removed = env[1]; + TEST_FREE_TAG (removed); + TEST_EQ_P (env[2], NULL); } @@ -1023,6 +1045,7 @@ TEST_EQ_STR (env[0], "FOO=BAR"); TEST_EQ_P (env[1], NULL); + TEST_FREE (removed); nih_free (env); }
-- upstart-devel mailing list upstart-devel@lists.ubuntu.com Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/upstart-devel