[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