[Merge] lp:~jamesodhunt/upstart/bug-1222705-reprise into lp:upstart
Colin Watson
cjwatson at canonical.com
Wed Jul 16 15:34:35 UTC 2014
Review: Approve
I agree with your analysis re NihAllocCtx. This looks right, and the form of the new code matches a similar section from environ_add, so that's good. Just one style comment.
Diff comments:
> === modified file 'ChangeLog'
> --- ChangeLog 2014-07-11 21:32:38 +0000
> +++ ChangeLog 2014-07-16 12:59:21 +0000
> @@ -1,3 +1,11 @@
> +2014-07-16 James Hunt <james.hunt at 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.hunt at 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 12:59:21 +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,21 @@
> * 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;
> + /* shrink amount of memory used */
> + if (! nih_realloc (*env, parent, sizeof (char *) * (*len + 1)))
I would be inclined to say "sizeof (**env)" rather than "sizeof (char *)", on a don't-repeat-yourself principle, and to make correctness clearer without having to look up the type of env.
> + return NULL;
>
> - 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 12:59:21 +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);
> }
>
> @@ -695,17 +700,6 @@
>
> if (test_alloc_failed) {
> TEST_EQ_P (ret, NULL);
> -
> - TEST_EQ (len, 1);
> -
> - TEST_ALLOC_PARENT (env[0], env);
> - TEST_ALLOC_SIZE (env[0], 8);
> -
> - TEST_NE_P (env[0], NULL);
> - TEST_EQ_STR (env[0], "FOO=BAR");
> -
> - TEST_EQ_P (env[1], NULL);
> -
> nih_free (env);
> continue;
> }
> @@ -713,6 +707,7 @@
> TEST_NE_P (ret, NULL);
> TEST_EQ (len, 0);
> TEST_EQ_P (env[0], NULL);
> + TEST_FREE (removed);
>
> nih_free (env);
> }
> @@ -730,6 +725,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);
> }
>
> @@ -737,17 +735,6 @@
>
> if (test_alloc_failed) {
> TEST_EQ_P (ret, NULL);
> -
> - TEST_EQ (len, 1);
> -
> - TEST_ALLOC_PARENT (env[0], env);
> - TEST_ALLOC_SIZE (env[0], 8);
> -
> - TEST_NE_P (env[0], NULL);
> - TEST_EQ_STR (env[0], "FOO=BAR");
> -
> - TEST_EQ_P (env[1], NULL);
> -
> nih_free (env);
> continue;
> }
> @@ -755,6 +742,7 @@
> TEST_NE_P (ret, NULL);
> TEST_EQ (len, 0);
> TEST_EQ_P (env[0], NULL);
> + TEST_FREE (removed);
>
> nih_free (env);
> }
> @@ -781,6 +769,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);
> @@ -794,18 +784,6 @@
>
> if (test_alloc_failed) {
> TEST_EQ_P (ret, NULL);
> -
> - TEST_EQ (len, 2);
> - TEST_ALLOC_PARENT (env[0], env);
> - TEST_ALLOC_SIZE (env[0], 8);
> - TEST_EQ_STR (env[0], "FOO=BAR");
> -
> - TEST_ALLOC_PARENT (env[1], env);
> - TEST_ALLOC_SIZE (env[1], 8);
> - TEST_EQ_STR (env[1], "BAZ=QUX");
> -
> - TEST_EQ_P (env[2], NULL);
> -
> nih_free (env);
> continue;
> }
> @@ -816,6 +794,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 +831,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);
> @@ -865,18 +846,6 @@
>
> if (test_alloc_failed) {
> TEST_EQ_P (ret, NULL);
> -
> - TEST_EQ (len, 2);
> - TEST_ALLOC_PARENT (env[0], env);
> - TEST_ALLOC_SIZE (env[0], 8);
> - TEST_EQ_STR (env[0], "UPSTART_TEST_VARIABLE=foo");
> -
> - TEST_ALLOC_PARENT (env[1], env);
> - TEST_ALLOC_SIZE (env[1], 8);
> - TEST_EQ_STR (env[1], "BAZ=QUX");
> -
> - TEST_EQ_P (env[2], NULL);
> -
> nih_free (env);
> continue;
> }
> @@ -887,6 +856,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 +891,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);
> }
> @@ -930,18 +902,6 @@
>
> if (test_alloc_failed) {
> TEST_EQ_P (ret, NULL);
> -
> - TEST_EQ (len, 2);
> - TEST_ALLOC_PARENT (env[0], env);
> - TEST_ALLOC_SIZE (env[0], 8);
> - TEST_EQ_STR (env[0], "FOO=BAR");
> -
> - TEST_ALLOC_PARENT (env[1], env);
> - TEST_ALLOC_SIZE (env[1], 8);
> - TEST_EQ_STR (env[1], "BAZ=QUX");
> -
> - TEST_EQ_P (env[2], NULL);
> -
> nih_free (env);
> continue;
> }
> @@ -954,6 +914,7 @@
> TEST_EQ_STR (env[0], "FOO=BAR");
>
> TEST_EQ_P (env[1], NULL);
> + TEST_FREE (removed);
>
> nih_free (env);
> }
> @@ -991,6 +952,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);
> }
>
> @@ -999,18 +963,6 @@
>
> if (test_alloc_failed) {
> TEST_EQ_P (ret, NULL);
> -
> - TEST_EQ (len, 2);
> - TEST_ALLOC_PARENT (env[0], env);
> - TEST_ALLOC_SIZE (env[0], 8);
> - TEST_EQ_STR (env[0], "FOO=BAR");
> -
> - TEST_ALLOC_PARENT (env[1], env);
> - TEST_ALLOC_SIZE (env[1], 8);
> - TEST_EQ_STR (env[1], "UPSTART_TEST_VARIABLE=foo");
> -
> - TEST_EQ_P (env[2], NULL);
> -
> nih_free (env);
> continue;
> }
> @@ -1023,6 +975,7 @@
> TEST_EQ_STR (env[0], "FOO=BAR");
>
> TEST_EQ_P (env[1], NULL);
> + TEST_FREE (removed);
>
> nih_free (env);
> }
>
--
https://code.launchpad.net/~jamesodhunt/upstart/bug-1222705-reprise/+merge/226983
Your team Upstart Reviewers is subscribed to branch lp:upstart.
More information about the upstart-devel
mailing list