Control: tags -1 patch

Hi Scott,

On Sun, Oct 27, 2013 at 10:23:20AM -0700, Steve Langasek wrote:
> You've recently merged a patch to the libnih github repo to allow passing of
> empty arrays to dbus calls (commit 163a2e).  Could you please include this
> patch in the package in Debian soon (new upstream release, cherry-pick,
> whatever works for you)?  This currently blocks us from getting a newer
> upstream version of upstart into Debian, since later releases of upstart
> rely on this functionality.

> I would be more than happy to NMU this change in if you're ok with that and
> don't have time to get to it right now.  Or if you don't want an NMU, and
> aren't going to get to this in the near future, please let me know that so I
> can do cherry-picks of my own in upstart to work around bug #722572, which
> is fixed in newer upstream versions.

In the absence of any guidance on this issue, I have prepared an NMU of
libnih to cherry-pick the change in question and am uploading it to the
DELAYED/10-day queue.  Please find the debdiff attached.

Thanks,
-- 
Steve Langasek                   Give me a lever long enough and a Free OS
Debian Developer                   to set it on, and I can move the world.
Ubuntu Developer                                    http://www.debian.org/
slanga...@ubuntu.com                                     vor...@debian.org
diff -Nru libnih-1.0.3/debian/changelog libnih-1.0.3/debian/changelog
--- libnih-1.0.3/debian/changelog	2012-12-31 09:32:22.000000000 -0800
+++ libnih-1.0.3/debian/changelog	2013-11-11 00:23:00.000000000 -0800
@@ -1,3 +1,11 @@
+libnih (1.0.3-4.2) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * Cherry-pick from upstream: update dbus code generator to allow for empty
+    lists for type 'as'.  Closes: #728036.
+
+ -- Steve Langasek <vor...@debian.org>  Mon, 11 Nov 2013 07:37:27 +0000
+
 libnih (1.0.3-4.1) unstable; urgency=low
 
   * Non-maintainer Upload.
diff -Nru libnih-1.0.3/debian/patches/0001-Update-dbus-code-generator-to-allow-for-empty-lists-.patch libnih-1.0.3/debian/patches/0001-Update-dbus-code-generator-to-allow-for-empty-lists-.patch
--- libnih-1.0.3/debian/patches/0001-Update-dbus-code-generator-to-allow-for-empty-lists-.patch	1969-12-31 16:00:00.000000000 -0800
+++ libnih-1.0.3/debian/patches/0001-Update-dbus-code-generator-to-allow-for-empty-lists-.patch	2013-11-10 23:37:11.000000000 -0800
@@ -0,0 +1,634 @@
+Author: Stéphane Graber <stgra...@ubuntu.com>, Steve Langasek <steve.langa...@canonical.com>
+Description: Update dbus code generator to allow for empty lists for type 'as'
+ This drops the != NULL check for NULL terminated arrays and moves the
+ iteration loop inside an 'if' statement.
+
+Index: libnih-1.0.3/nih-dbus-tool/marshal.c
+===================================================================
+--- libnih-1.0.3.orig/nih-dbus-tool/marshal.c
++++ libnih-1.0.3/nih-dbus-tool/marshal.c
+@@ -364,6 +364,7 @@
+ 	nih_local TypeVar *element_len_var = NULL;
+ 	nih_local char *   block = NULL;
+ 	nih_local char *   vars_block = NULL;
++	nih_local char *   loop_block = NULL;
+ 
+ 	nih_assert (iter != NULL);
+ 	nih_assert (iter_name != NULL);
+@@ -448,7 +449,7 @@
+ 	nih_list_add (locals, &array_iter_var->entry);
+ 
+ 	if (dbus_type_is_fixed (element_type)) {
+-		if (! nih_strcat_sprintf (&code, parent,
++		if (! nih_strcat_sprintf (&loop_block, parent,
+ 					  "for (size_t %s = 0; %s < %s; %s++) {\n",
+ 					  loop_name, loop_name, len_name, loop_name)) {
+ 			nih_free (code);
+@@ -456,6 +457,12 @@
+ 		}
+ 	} else {
+ 		if (! nih_strcat_sprintf (&code, parent,
++					  "if (%s) {\n",
++					  name)) {
++			nih_free (code);
++			return NULL;
++		}
++		if (! nih_strcat_sprintf (&loop_block, parent,
+ 					  "for (size_t %s = 0; %s[%s]; %s++) {\n",
+ 					  loop_name, name, loop_name, loop_name)) {
+ 			nih_free (code);
+@@ -576,7 +583,7 @@
+ 	}
+ 
+ 
+-	if (! nih_strcat_sprintf (&code, parent,
++	if (! nih_strcat_sprintf (&loop_block, parent,
+ 			   "%s"
+ 			   "\n"
+ 			   "%s"
+@@ -590,9 +597,34 @@
+ 	}
+ 
+ 	/* Close the container again */
++	if (! nih_strcat_sprintf (&loop_block, parent,
++				  "}\n")) {
++		nih_free (code);
++		return NULL;
++	}
++
++	if (dbus_type_is_fixed (element_type)) {
++		if (! nih_strcat_sprintf (&code, parent,
++				 "%s\n", loop_block)) {
++			nih_free (code);
++			return NULL;
++		}
++	}
++	else {
++		if (! indent (&loop_block, NULL, 1)) {
++			nih_free (code);
++			return NULL;
++		}
++
++		if (! nih_strcat_sprintf (&code, parent,
++				 "%s"
++				 "}\n\n", loop_block)) {
++			nih_free (code);
++			return NULL;
++		}
++	}
++
+ 	if (! nih_strcat_sprintf (&code, parent,
+-				  "}\n"
+-				  "\n"
+ 				  "if (! dbus_message_iter_close_container (&%s, &%s)) {\n"
+ 				  "%s"
+ 				  "}\n",
+Index: libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
+===================================================================
+--- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
++++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
+@@ -88,17 +88,19 @@
+ 			goto enomem;
+ 		}
+ 
+-		for (size_t output_i = 0; output[output_i]; output_i++) {
+-			const char *output_element;
++		if (output) {
++			for (size_t output_i = 0; output[output_i]; output_i++) {
++				const char *output_element;
+ 
+-			output_element = output[output_i];
++				output_element = output[output_i];
+ 
+-			/* Marshal a char * onto the message */
+-			if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
+-				dbus_message_iter_abandon_container (&iter, &output_iter);
+-				dbus_message_unref (reply);
+-				reply = NULL;
+-				goto enomem;
++				/* Marshal a char * onto the message */
++				if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
++					dbus_message_iter_abandon_container (&iter, &output_iter);
++					dbus_message_unref (reply);
++					reply = NULL;
++					goto enomem;
++				}
+ 			}
+ 		}
+ 
+Index: libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
+===================================================================
+--- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
++++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
+@@ -136,17 +136,19 @@
+ 			goto enomem;
+ 		}
+ 
+-		for (size_t output_i = 0; output[output_i]; output_i++) {
+-			const char *output_element;
++		if (output) {
++			for (size_t output_i = 0; output[output_i]; output_i++) {
++				const char *output_element;
+ 
+-			output_element = output[output_i];
++				output_element = output[output_i];
+ 
+-			/* Marshal a char * onto the message */
+-			if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
+-				dbus_message_iter_abandon_container (&iter, &output_iter);
+-				dbus_message_unref (reply);
+-				reply = NULL;
+-				goto enomem;
++				/* Marshal a char * onto the message */
++				if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
++					dbus_message_iter_abandon_container (&iter, &output_iter);
++					dbus_message_unref (reply);
++					reply = NULL;
++					goto enomem;
++				}
+ 			}
+ 		}
+ 
+Index: libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
+===================================================================
+--- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
++++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
+@@ -7,7 +7,6 @@
+ 	DBusMessageIter output_iter;
+ 
+ 	nih_assert (message != NULL);
+-	nih_assert (output != NULL);
+ 
+ 	/* If the sender doesn't care about a reply, don't bother wasting
+ 	 * effort constructing and sending one.
+@@ -28,16 +27,18 @@
+ 		return -1;
+ 	}
+ 
+-	for (size_t output_i = 0; output[output_i]; output_i++) {
+-		const char *output_element;
+-
+-		output_element = output[output_i];
+-
+-		/* Marshal a char * onto the message */
+-		if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
+-			dbus_message_iter_abandon_container (&iter, &output_iter);
+-			dbus_message_unref (reply);
+-			return -1;
++	if (output) {
++		for (size_t output_i = 0; output[output_i]; output_i++) {
++			const char *output_element;
++
++			output_element = output[output_i];
++
++			/* Marshal a char * onto the message */
++			if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
++				dbus_message_iter_abandon_container (&iter, &output_iter);
++				dbus_message_unref (reply);
++				return -1;
++			}
+ 		}
+ 	}
+ 
+Index: libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
+===================================================================
+--- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
++++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
+@@ -7,7 +7,6 @@
+ 	DBusMessageIter output_iter;
+ 
+ 	nih_assert (message != NULL);
+-	nih_assert (output != NULL);
+ 
+ 	/* If the sender doesn't care about a reply, don't bother wasting
+ 	 * effort constructing and sending one.
+@@ -28,16 +27,18 @@
+ 		return -1;
+ 	}
+ 
+-	for (size_t output_i = 0; output[output_i]; output_i++) {
+-		const char *output_element;
+-
+-		output_element = output[output_i];
+-
+-		/* Marshal a char * onto the message */
+-		if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
+-			dbus_message_iter_abandon_container (&iter, &output_iter);
+-			dbus_message_unref (reply);
+-			return -1;
++	if (output) {
++		for (size_t output_i = 0; output[output_i]; output_i++) {
++			const char *output_element;
++
++			output_element = output[output_i];
++
++			/* Marshal a char * onto the message */
++			if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
++				dbus_message_iter_abandon_container (&iter, &output_iter);
++				dbus_message_unref (reply);
++				return -1;
++			}
+ 		}
+ 	}
+ 
+Index: libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
+===================================================================
+--- libnih-1.0.3.orig/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
++++ libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
+@@ -14185,6 +14185,57 @@
+ 	}
+ 
+ 
++	/* Check that we can pass a NULL pointer for the array.
++	 */
++	TEST_FEATURE ("with NULL array pointer");
++	TEST_ALLOC_FAIL {
++		dbus_error_init (&dbus_error);
++		dbus_bus_add_match (client_conn, "type='signal'", &dbus_error);
++		assert (! dbus_error_is_set (&dbus_error));
++		dbus_error_free (&dbus_error);
++
++		ret = my_test_emit_new_str_array (server_conn,
++						  "/com/netsplit/Nih/Test",
++						  NULL);
++
++		if (test_alloc_failed) {
++			TEST_LT (ret, 0);
++
++			dbus_error_init (&dbus_error);
++			dbus_bus_remove_match (client_conn, "type='signal'",
++					       &dbus_error);
++			assert (! dbus_error_is_set (&dbus_error));
++			dbus_error_free (&dbus_error);
++
++			continue;
++		}
++
++		dbus_connection_flush (server_conn);
++
++		TEST_DBUS_MESSAGE (client_conn, signal);
++		TEST_TRUE (dbus_message_is_signal (
++				   signal, "com.netsplit.Nih.Test", "NewStrArray"));
++		TEST_EQ_STR (dbus_message_get_signature (signal),
++			     (DBUS_TYPE_ARRAY_AS_STRING
++			      DBUS_TYPE_STRING_AS_STRING));
++
++		dbus_message_iter_init (signal, &iter);
++
++		dbus_message_iter_recurse (&iter, &subiter);
++
++		TEST_EQ (dbus_message_iter_get_arg_type (&subiter),
++			 DBUS_TYPE_INVALID);
++
++		dbus_message_unref (signal);
++
++		dbus_error_init (&dbus_error);
++		dbus_bus_remove_match (client_conn, "type='signal'",
++				       &dbus_error);
++		assert (! dbus_error_is_set (&dbus_error));
++		dbus_error_free (&dbus_error);
++	}
++
++
+ 	/* Check that we can give an empty array consisting of just the
+ 	 * NULL pointer.
+ 	 */
+Index: libnih-1.0.3/nih-dbus-tool/tests/test_marshal.c
+===================================================================
+--- libnih-1.0.3.orig/nih-dbus-tool/tests/test_marshal.c
++++ libnih-1.0.3/nih-dbus-tool/tests/test_marshal.c
+@@ -1479,39 +1479,41 @@
+ 				   "\treturn -1;\n"
+ 				   "}\n"
+ 				   "\n"
+-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
+-				   "\tDBusMessageIter value_element_iter;\n"
+-				   "\tconst int16_t * value_element;\n"
+-				   "\tsize_t          value_element_len;\n"
++				   "if (value) {\n"
++				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
++				   "\t\tDBusMessageIter value_element_iter;\n"
++				   "\t\tconst int16_t * value_element;\n"
++				   "\t\tsize_t          value_element_len;\n"
+ 				   "\n"
+-				   "\tvalue_element = value[value_i];\n"
+-				   "\tvalue_element_len = value_len[value_i];\n"
++				   "\t\tvalue_element = value[value_i];\n"
++				   "\t\tvalue_element_len = value_len[value_i];\n"
+ 				   "\n"
+ 
+-				   "\t/* Marshal an array onto the message */\n"
+-				   "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
+-				   "\t}\n"
++				   "\t\t/* Marshal an array onto the message */\n"
++				   "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\treturn -1;\n"
++				   "\t\t}\n"
+ 				   "\n"
+-				   "\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
+-				   "\t\tint16_t value_element_element;\n"
++				   "\t\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
++				   "\t\t\tint16_t value_element_element;\n"
+ 				   "\n"
+-				   "\t\tvalue_element_element = value_element[value_element_i];\n"
++				   "\t\t\tvalue_element_element = value_element[value_element_i];\n"
+ 				   "\n"
+-				   "\t\t/* Marshal a int16_t onto the message */\n"
+-				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
+-				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
++				   "\t\t\t/* Marshal a int16_t onto the message */\n"
++				   "\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
++				   "\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
++				   "\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\t\treturn -1;\n"
++				   "\t\t\t}\n"
++				   "\t\t}\n"
++				   "\n"
++				   "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
+ 				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+ 				   "\t\t\treturn -1;\n"
+ 				   "\t\t}\n"
+-				   "\t}\n"
+-				   "\n"
+-				   "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
+-				   "\t}\n"
+ 
++				   "\t}\n"
+ 				   "}\n"
+ 				   "\n"
+ 				   "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
+@@ -1766,15 +1768,17 @@
+ 				   "\treturn -1;\n"
+ 				   "}\n"
+ 				   "\n"
+-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
+-				   "\tconst char *value_element;\n"
++				   "if (value) {\n"
++				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
++				   "\t\tconst char *value_element;\n"
+ 				   "\n"
+-				   "\tvalue_element = value[value_i];\n"
++				   "\t\tvalue_element = value[value_i];\n"
+ 				   "\n"
+-				   "\t/* Marshal a char * onto the message */\n"
+-				   "\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
++				   "\t\t/* Marshal a char * onto the message */\n"
++				   "\t\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\treturn -1;\n"
++				   "\t\t}\n"
+ 				   "\t}\n"
+ 				   "}\n"
+ 				   "\n"
+@@ -1933,35 +1937,39 @@
+ 				   "\treturn -1;\n"
+ 				   "}\n"
+ 				   "\n"
+-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
+-				   "\tDBusMessageIter value_element_iter;\n"
+-				   "\tchar * const *  value_element;\n"
++				   "if (value) {\n"
++				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
++				   "\t\tDBusMessageIter value_element_iter;\n"
++				   "\t\tchar * const *  value_element;\n"
+ 				   "\n"
+-				   "\tvalue_element = value[value_i];\n"
++				   "\t\tvalue_element = value[value_i];\n"
+ 				   "\n"
+-				   "\t/* Marshal an array onto the message */\n"
+-				   "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
+-				   "\t}\n"
+-				   "\n"
+-				   "\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
+-				   "\t\tconst char *value_element_element;\n"
++				   "\t\t/* Marshal an array onto the message */\n"
++				   "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\treturn -1;\n"
++				   "\t\t}\n"
+ 				   "\n"
+-				   "\t\tvalue_element_element = value_element[value_element_i];\n"
++				   "\t\tif (value_element) {\n"
++				   "\t\t\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
++				   "\t\t\t\tconst char *value_element_element;\n"
++				   "\n"
++				   "\t\t\t\tvalue_element_element = value_element[value_element_i];\n"
++				   "\n"
++				   "\t\t\t\t/* Marshal a char * onto the message */\n"
++				   "\t\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
++				   "\t\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
++				   "\t\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\t\t\treturn -1;\n"
++				   "\t\t\t\t}\n"
++				   "\t\t\t}\n"
++				   "\t\t}\n"
+ 				   "\n"
+-				   "\t\t/* Marshal a char * onto the message */\n"
+-				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
+-				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
++				   "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
+ 				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+ 				   "\t\t\treturn -1;\n"
+ 				   "\t\t}\n"
+ 				   "\t}\n"
+-				   "\n"
+-				   "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
+-				   "\t}\n"
+ 				   "}\n"
+ 				   "\n"
+ 				   "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
+@@ -2194,16 +2202,18 @@
+ 				   "\treturn -1;\n"
+ 				   "}\n"
+ 				   "\n"
+-				   "for (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
+-				   "\tconst char *value_item2_element;\n"
++				   "if (value_item2) {\n"
++				   "\tfor (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
++				   "\t\tconst char *value_item2_element;\n"
+ 				   "\n"
+-				   "\tvalue_item2_element = value_item2[value_item2_i];\n"
++				   "\t\tvalue_item2_element = value_item2[value_item2_i];\n"
+ 				   "\n"
+-				   "\t/* Marshal a char * onto the message */\n"
+-				   "\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
++				   "\t\t/* Marshal a char * onto the message */\n"
++				   "\t\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\treturn -1;\n"
++				   "\t\t}\n"
+ 				   "\t}\n"
+ 				   "}\n"
+ 				   "\n"
+@@ -2642,41 +2652,43 @@
+ 				   "\treturn -1;\n"
+ 				   "}\n"
+ 				   "\n"
+-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
+-				   "\tDBusMessageIter                  value_element_iter;\n"
+-				   "\tconst char *                     value_element_item0;\n"
+-				   "\tuint32_t                         value_element_item1;\n"
+-				   "\tconst MyStructArrayValueElement *value_element;\n"
++				   "if (value) {\n"
++				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
++				   "\t\tDBusMessageIter                  value_element_iter;\n"
++				   "\t\tconst char *                     value_element_item0;\n"
++				   "\t\tuint32_t                         value_element_item1;\n"
++				   "\t\tconst MyStructArrayValueElement *value_element;\n"
+ 				   "\n"
+-				   "\tvalue_element = value[value_i];\n"
++				   "\t\tvalue_element = value[value_i];\n"
+ 				   "\n"
+-				   "\t/* Marshal a structure onto the message */\n"
+-				   "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
+-				   "\t}\n"
++				   "\t\t/* Marshal a structure onto the message */\n"
++				   "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\treturn -1;\n"
++				   "\t\t}\n"
+ 				   "\n"
+-				   "\tvalue_element_item0 = value_element->item0;\n"
++				   "\t\tvalue_element_item0 = value_element->item0;\n"
+ 				   "\n"
+-				   "\t/* Marshal a char * onto the message */\n"
+-				   "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
+-				   "\t}\n"
++				   "\t\t/* Marshal a char * onto the message */\n"
++				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\treturn -1;\n"
++				   "\t\t}\n"
+ 				   "\n"
+-				   "\tvalue_element_item1 = value_element->item1;\n"
++				   "\t\tvalue_element_item1 = value_element->item1;\n"
+ 				   "\n"
+-				   "\t/* Marshal a uint32_t onto the message */\n"
+-				   "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
+-				   "\t}\n"
++				   "\t\t/* Marshal a uint32_t onto the message */\n"
++				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\treturn -1;\n"
++				   "\t\t}\n"
+ 				   "\n"
+-				   "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
++				   "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\treturn -1;\n"
++				   "\t\t}\n"
+ 				   "\t}\n"
+ 				   "}\n"
+ 				   "\n"
+@@ -2912,41 +2924,43 @@
+ 				   "\treturn -1;\n"
+ 				   "}\n"
+ 				   "\n"
+-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
+-				   "\tDBusMessageIter                     value_element_iter;\n"
+-				   "\tconst char *                        value_element_item0;\n"
+-				   "\tuint32_t                            value_element_item1;\n"
+-				   "\tconst MyDictEntryArrayValueElement *value_element;\n"
++				   "if (value) {\n"
++				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
++				   "\t\tDBusMessageIter                     value_element_iter;\n"
++				   "\t\tconst char *                        value_element_item0;\n"
++				   "\t\tuint32_t                            value_element_item1;\n"
++				   "\t\tconst MyDictEntryArrayValueElement *value_element;\n"
+ 				   "\n"
+-				   "\tvalue_element = value[value_i];\n"
++				   "\t\tvalue_element = value[value_i];\n"
+ 				   "\n"
+-				   "\t/* Marshal a structure onto the message */\n"
+-				   "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
+-				   "\t}\n"
++				   "\t\t/* Marshal a structure onto the message */\n"
++				   "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\treturn -1;\n"
++				   "\t\t}\n"
+ 				   "\n"
+-				   "\tvalue_element_item0 = value_element->item0;\n"
++				   "\t\tvalue_element_item0 = value_element->item0;\n"
+ 				   "\n"
+-				   "\t/* Marshal a char * onto the message */\n"
+-				   "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
+-				   "\t}\n"
++				   "\t\t/* Marshal a char * onto the message */\n"
++				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\treturn -1;\n"
++				   "\t\t}\n"
+ 				   "\n"
+-				   "\tvalue_element_item1 = value_element->item1;\n"
++				   "\t\tvalue_element_item1 = value_element->item1;\n"
+ 				   "\n"
+-				   "\t/* Marshal a uint32_t onto the message */\n"
+-				   "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
+-				   "\t}\n"
++				   "\t\t/* Marshal a uint32_t onto the message */\n"
++				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\treturn -1;\n"
++				   "\t\t}\n"
+ 				   "\n"
+-				   "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
+-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+-				   "\t\treturn -1;\n"
++				   "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
++				   "\t\t\treturn -1;\n"
++				   "\t\t}\n"
+ 				   "\t}\n"
+ 				   "}\n"
+ 				   "\n"
+Index: libnih-1.0.3/nih-dbus-tool/type.c
+===================================================================
+--- libnih-1.0.3.orig/nih-dbus-tool/type.c
++++ libnih-1.0.3/nih-dbus-tool/type.c
+@@ -1101,7 +1101,7 @@
+ 	nih_assert (block != NULL);
+ 	nih_assert (var != NULL);
+ 
+-	if (! strchr (var->type, '*'))
++	if (! strchr (var->type, '*') || ! strcmp (var->type, "char * const *"))
+ 		return *block;
+ 
+ 	if (next && (! strcmp (next->type, "size_t"))) {
diff -Nru libnih-1.0.3/debian/patches/series libnih-1.0.3/debian/patches/series
--- libnih-1.0.3/debian/patches/series	2012-12-31 08:57:57.000000000 -0800
+++ libnih-1.0.3/debian/patches/series	2013-11-10 23:33:48.000000000 -0800
@@ -1 +1,3 @@
 0001-Fallback-to-lstat-if-dirent.d_type-is-not-available-.patch
+0001-Update-dbus-code-generator-to-allow-for-empty-lists-.patch
+

Attachment: signature.asc
Description: Digital signature

Reply via email to