[Merge] lp:~jamesodhunt/upstart/bug-1222705-reprise into lp:upstart
Dimitri John Ledkov
launchpad at surgut.co.uk
Wed Jul 16 10:43:09 UTC 2014
Review: Needs Information
See inline comment about memove call.
Diff comments:
> === 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.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 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);
> +
This memmove call worries me. I thought that with recent glibc memmove/memcpy are unsafe for dst < src, because the copy/move is done "backwards" and thus overrides src data before it moves.
> + (*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);
> }
>
--
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