Merge authors:
  James Hunt (jamesodhunt)
Related merge proposals:
  
https://code.launchpad.net/~jamesodhunt/upstart/bug-1222705-reprise/+merge/226983
  proposed by: James Hunt (jamesodhunt)
  review: Approve - Colin Watson (cjwatson)
  review: Needs Information - Dimitri John Ledkov (xnox)
  https://code.launchpad.net/~jamesodhunt/upstart/bug-1222705/+merge/204222
  proposed by: James Hunt (jamesodhunt)
------------------------------------------------------------
revno: 1656 [merge]
committer: James Hunt <james.h...@ubuntu.com>
branch nick: upstart
timestamp: Wed 2014-07-16 16:57:39 +0100
message:
  * Merged lp:~jamesodhunt/upstart/bug-1222705-reprise.
modified:
  ChangeLog
  init/environ.c
  init/tests/test_environ.c


--
lp:upstart
https://code.launchpad.net/~upstart-devel/upstart/trunk

Your team Upstart Reviewers is subscribed to branch lp:upstart.
To unsubscribe from this branch go to 
https://code.launchpad.net/~upstart-devel/upstart/trunk/+edit-subscription
=== modified file 'ChangeLog'
--- ChangeLog	2014-07-11 21:32:38 +0000
+++ ChangeLog	2014-07-16 09:40:18 +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 15:55:18 +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 (**env) * (*len + 1)))
+		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:58:33 +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);
 	}

-- 
upstart-devel mailing list
upstart-devel@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/upstart-devel

Reply via email to