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