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.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); > + 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. -- upstart-devel mailing list upstart-devel@lists.ubuntu.com Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/upstart-devel