changeset 13685:cdfded691c93

2666 libhal should be more carefull about function parameters 2667 libhal can leak memory if realloc() fails Reviewed by: Andrew Stormont <Andrew.Stormont@nexenta.com> Reviewed by: Albert Lee <trisk@nexenta.com> Approved by: Richard Lowe <richlowe@richlowe.net>
author Milan Jurik <milan.jurik@xylab.cz>
date Tue, 08 May 2012 05:52:36 -0500
parents 9ccc3f459d46
children 4bc0783f6064
files usr/src/lib/hal/libhal/common/libhal.c
diffstat 1 files changed, 159 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/lib/hal/libhal/common/libhal.c	Tue May 08 09:29:55 2012 -0500
+++ b/usr/src/lib/hal/libhal/common/libhal.c	Tue May 08 05:52:36 2012 -0500
@@ -73,6 +73,30 @@
 		}								\
 	} while(0)
 
+/**
+ * LIBHAL_CHECK_UDI_VALID:
+ * @_udi_: the UID to check for 
+ * @_ret_:   what to use for return value if udi is invalid 
+ *
+ * Handy macro for checking whether a UID is valid and not NULL.
+ */
+#define LIBHAL_CHECK_UDI_VALID(_udi_,_ret_)						\
+	do {										\
+		if (_udi_ == NULL) {							\
+			fprintf (stderr,						\
+				 "%s %d : invalid udi %s. udi is NULL.\n",  		\
+				 __FILE__, __LINE__, _udi_);	 			\
+			return _ret_;							\
+		} else {								\
+			if(strncmp(_udi_, "/org/freedesktop/Hal/devices/", 29) != 0) {	\
+				fprintf (stderr,					\
+                                 	 "%s %d : invalid udi: %s doesn't start"	\
+					 "with '/org/freedesktop/Hal/devices/'. \n",    \
+	                                 __FILE__, __LINE__, _udi_);			\
+				return _ret_;						\
+			}								\
+		}									\
+	} while(0)
 
 static char **libhal_get_string_array_from_iter (DBusMessageIter *iter, int *num_elements);
 
@@ -115,6 +139,7 @@
 {
 	int count;
 	char **buffer;
+	char **t;
 
 	count = 0;
 	buffer = (char **)malloc (sizeof (char *) * 8);
@@ -128,9 +153,11 @@
 		char *str;
 		
 		if ((count % 8) == 0 && count != 0) {
-			buffer = realloc (buffer, sizeof (char *) * (count + 8));
-			if (buffer == NULL)
+			t = realloc (buffer, sizeof (char *) * (count + 8));
+			if (t == NULL)
 				goto oom;
+			else
+				buffer = t;
 		}
 		
 		dbus_message_iter_get_basic (iter, &value);
@@ -145,9 +172,11 @@
 	}
 
 	if ((count % 8) == 0) {
-		buffer = realloc (buffer, sizeof (char *) * (count + 1));
-		if (buffer == NULL)
+		t = realloc (buffer, sizeof (char *) * (count + 1));
+		if (t == NULL)
 			goto oom;
+		else
+			buffer = t;
 	}
 
 	buffer[count] = NULL;
@@ -156,6 +185,8 @@
 	return buffer;
 
 oom:
+	if (buffer != NULL)
+		free (buffer);
 	fprintf (stderr, "%s %d : error allocating memory\n", __FILE__, __LINE__);
 	return NULL;
 
@@ -196,8 +227,8 @@
  * Represents a property. Opaque.
  */
 struct LibHalProperty_s {
-	int type;		     /**< Type of property */
-	char *key;		     /**< ASCII string */
+	LibHalPropertyType type;	     	/**< Type of property */
+	char *key;		     		/**< ASCII string */
 
 	/** Possible values of the property */
 	union {
@@ -297,6 +328,10 @@
 libhal_property_fill_value_from_variant (LibHalProperty *p, DBusMessageIter *var_iter)
 {
 	DBusMessageIter iter_array;
+
+	LIBHAL_CHECK_PARAM_VALID(p, "LibHalProperty *p", FALSE);
+	LIBHAL_CHECK_PARAM_VALID(var_iter, "DBusMessageIter *var_iter", FALSE);
+
 	switch (p->type) {
 	case DBUS_TYPE_ARRAY:
 		if (dbus_message_iter_get_element_type (var_iter) != DBUS_TYPE_STRING)
@@ -395,6 +430,7 @@
 	DBusError _error;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, NULL);
+	LIBHAL_CHECK_UDI_VALID(udi, NULL);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -555,8 +591,7 @@
 	unsigned int num_elems;
 	LibHalProperty *p;
 
-	if (set == NULL)
-		return 0;
+	LIBHAL_CHECK_PARAM_VALID(set, "*set", 0);
 	
 	num_elems = 0;
 	for (p = set->properties_head; p != NULL; p = p->next)
@@ -923,7 +958,12 @@
 
 	object_path = dbus_message_get_path (message);
 
-	/*printf("*** in filter_func, object_path=%s\n", object_path);*/
+	/*fprintf (stderr, "*** libhal filer_func: connection=%p obj_path=%s interface=%s method=%s\n", 
+		   connection,
+		   dbus_message_get_path (message), 
+		   dbus_message_get_interface (message),
+		   dbus_message_get_member (message));
+        */
 
 	if (dbus_message_is_signal (message, "org.freedesktop.Hal.Manager",
 				    "DeviceAdded")) {
@@ -1106,10 +1146,12 @@
 	DBusMessage *message;
 	DBusMessage *reply;
 	DBusMessageIter iter, reply_iter;
-	int type;
+	LibHalPropertyType type;
 	DBusError _error;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, LIBHAL_PROPERTY_TYPE_INVALID); /* or return NULL? */
+	LIBHAL_CHECK_UDI_VALID(udi, LIBHAL_PROPERTY_TYPE_INVALID);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", LIBHAL_PROPERTY_TYPE_INVALID);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -1168,6 +1210,8 @@
 	DBusError _error;
 	
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, NULL);
+	LIBHAL_CHECK_UDI_VALID(udi, NULL);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", NULL);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -1238,6 +1282,8 @@
 	DBusError _error;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, NULL);
+	LIBHAL_CHECK_UDI_VALID(udi, NULL);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", NULL);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -1310,6 +1356,8 @@
 	DBusError _error;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, -1);
+	LIBHAL_CHECK_UDI_VALID(udi, -1);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", -1);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -1379,6 +1427,8 @@
 	DBusError _error;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, -1);
+	LIBHAL_CHECK_UDI_VALID(udi, -1);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", -1);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -1447,6 +1497,8 @@
 	DBusError _error;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, -1.0);
+	LIBHAL_CHECK_UDI_VALID(udi, -1.0);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", -1.0);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -1515,6 +1567,8 @@
 	DBusError _error;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -1581,6 +1635,8 @@
 	char *method_name = NULL;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
 
 	/** @todo  sanity check incoming params */
 	switch (type) {
@@ -1675,6 +1731,11 @@
 				   const char *value,
 				   DBusError *error)
 {
+	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+	LIBHAL_CHECK_PARAM_VALID(value, "*value", FALSE);
+	
 	return libhal_device_set_property_helper (ctx, udi, key,
 						  DBUS_TYPE_STRING,
 						  value, 0, 0, 0.0f, FALSE, error);
@@ -1697,6 +1758,10 @@
 libhal_device_set_property_int (LibHalContext *ctx, const char *udi,
 				const char *key, dbus_int32_t value, DBusError *error)
 {
+	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+	
 	return libhal_device_set_property_helper (ctx, udi, key,
 						  DBUS_TYPE_INT32,
 						  NULL, value, 0, 0.0f, FALSE, error);
@@ -1719,6 +1784,10 @@
 libhal_device_set_property_uint64 (LibHalContext *ctx, const char *udi,
 				   const char *key, dbus_uint64_t value, DBusError *error)
 {
+	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+	
 	return libhal_device_set_property_helper (ctx, udi, key,
 						  DBUS_TYPE_UINT64,
 						  NULL, 0, value, 0.0f, FALSE, error);
@@ -1741,6 +1810,10 @@
 libhal_device_set_property_double (LibHalContext *ctx, const char *udi,
 				   const char *key, double value, DBusError *error)
 {
+	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+	
 	return libhal_device_set_property_helper (ctx, udi, key,
 						  DBUS_TYPE_DOUBLE,
 						  NULL, 0, 0, value, FALSE, error);
@@ -1763,6 +1836,10 @@
 libhal_device_set_property_bool (LibHalContext *ctx, const char *udi,
 				 const char *key, dbus_bool_t value, DBusError *error)
 {
+	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+	
 	return libhal_device_set_property_helper (ctx, udi, key,
 						  DBUS_TYPE_BOOLEAN,
 						  NULL, 0, 0, 0.0f, value, error);
@@ -1785,6 +1862,10 @@
 libhal_device_remove_property (LibHalContext *ctx, 
 			       const char *udi, const char *key, DBusError *error)
 {
+	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+	
 	return libhal_device_set_property_helper (ctx, udi, key, DBUS_TYPE_INVALID,	
 						  /* DBUS_TYPE_INVALID means remove */
 						  NULL, 0, 0, 0.0f, FALSE, error);
@@ -1815,6 +1896,9 @@
 	DBusMessageIter iter;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+	LIBHAL_CHECK_PARAM_VALID(value, "*value", FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -1871,6 +1955,9 @@
 	DBusMessageIter iter;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+	LIBHAL_CHECK_PARAM_VALID(value, "*value", FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -1927,6 +2014,8 @@
 	DBusMessageIter iter;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -1982,6 +2071,9 @@
 	DBusMessageIter iter;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+	LIBHAL_CHECK_PARAM_VALID(value, "*value", FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -2037,6 +2129,7 @@
 	DBusMessage *reply;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
 
 	if (reason_why_locked != NULL)
 		*reason_why_locked = NULL;
@@ -2104,6 +2197,7 @@
 	DBusMessage *reply;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal",
 						udi,
@@ -2237,6 +2331,8 @@
 	DBusMessageIter iter;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(temp_udi, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal",
 						"/org/freedesktop/Hal/Manager",
@@ -2294,6 +2390,7 @@
 	DBusMessageIter iter;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal",
 						"/org/freedesktop/Hal/Manager",
@@ -2347,6 +2444,7 @@
 	DBusError _error;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal",
 						"/org/freedesktop/Hal/Manager",
@@ -2416,6 +2514,8 @@
 	DBusError _error;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -2481,6 +2581,8 @@
 	DBusMessageIter iter;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(target_udi, FALSE);
+	LIBHAL_CHECK_UDI_VALID(source_udi, FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal",
 						"/org/freedesktop/Hal/Manager",
@@ -2548,6 +2650,9 @@
 	DBusError _error;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi1, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi2, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(property_namespace, "*property_namespace", FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal",
 						"/org/freedesktop/Hal/Manager",
@@ -2615,6 +2720,7 @@
 	LibHalPropertySetIterator i;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
 
 	printf ("device_id = %s\n", udi);
 
@@ -2702,6 +2808,8 @@
 	DBusError _error;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, NULL);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", NULL);
+	LIBHAL_CHECK_PARAM_VALID(value, "*value", NULL);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal",
 						"/org/freedesktop/Hal/Manager",
@@ -2769,6 +2877,8 @@
 	DBusMessageIter iter;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(capability, "*capability", FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -2821,6 +2931,8 @@
 	dbus_bool_t ret;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(capability, "*capability", FALSE);
 
 	ret = FALSE;
 
@@ -2860,6 +2972,7 @@
 	DBusError _error;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, NULL);
+	LIBHAL_CHECK_PARAM_VALID(capability, "*capability", NULL);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal",
 						"/org/freedesktop/Hal/Manager",
@@ -2951,6 +3064,7 @@
 	char buf[512];
 	
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
 
 	snprintf (buf, 512,
 		  "type='signal',"
@@ -2981,6 +3095,7 @@
 	char buf[512];
 	
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
 
 	snprintf (buf, 512,
 		  "type='signal',"
@@ -3387,6 +3502,7 @@
 	dbus_bool_t result;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
 						"org.freedesktop.Hal.Device",
@@ -3443,6 +3559,7 @@
 	dbus_bool_t result;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal",
 						udi,
@@ -3507,6 +3624,9 @@
 	dbus_bool_t result;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(condition_name, "*condition_name", FALSE);
+	LIBHAL_CHECK_PARAM_VALID(condition_details, "*condition_details", FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal",
 						udi,
@@ -3563,7 +3683,7 @@
 /** 
  * libhal_device_addon_is_ready:
  * @ctx: the context for the connection to hald
- * @udi: the Unique Device Id
+ * @udi: the Unique Device Id this addon is handling
  * @error: pointer to an initialized dbus error object for returning errors or NULL
  *
  * HAL addon's must call this method when they are done initializing the device object. The HAL
@@ -3583,6 +3703,7 @@
 	dbus_bool_t result;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal",
 						udi,
@@ -3649,6 +3770,8 @@
 	dbus_bool_t result;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(udi, FALSE);
+	LIBHAL_CHECK_PARAM_VALID(interface_name, "*interface_name", FALSE);
 
 	message = dbus_message_new_method_call ("org.freedesktop.Hal",
 						udi,
@@ -3732,6 +3855,8 @@
 {
 	LibHalChangeSet *changeset;
 
+	LIBHAL_CHECK_UDI_VALID(udi, NULL);
+
 	changeset = calloc (1, sizeof (LibHalChangeSet));
 	if (changeset == NULL)
 		goto out;
@@ -3753,6 +3878,9 @@
 static void
 libhal_changeset_append (LibHalChangeSet *changeset, LibHalChangeSetElement *elem)
 {
+	LIBHAL_CHECK_PARAM_VALID(changeset, "*changeset", );
+	LIBHAL_CHECK_PARAM_VALID(elem, "*elem", );
+
 	if (changeset->head == NULL) {
 		changeset->head = elem;
 		changeset->tail = elem;
@@ -3782,6 +3910,10 @@
 {
 	LibHalChangeSetElement *elem;
 
+	LIBHAL_CHECK_PARAM_VALID(changeset, "*changeset", FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+	LIBHAL_CHECK_PARAM_VALID(value, "*value", FALSE);
+
 	elem = calloc (1, sizeof (LibHalChangeSetElement));
 	if (elem == NULL)
 		goto out;
@@ -3821,6 +3953,9 @@
 {
 	LibHalChangeSetElement *elem;
 
+	LIBHAL_CHECK_PARAM_VALID(changeset, "*changeset", FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+
 	elem = calloc (1, sizeof (LibHalChangeSetElement));
 	if (elem == NULL)
 		goto out;
@@ -3854,6 +3989,9 @@
 {
 	LibHalChangeSetElement *elem;
 
+	LIBHAL_CHECK_PARAM_VALID(changeset, "*changeset", FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+
 	elem = calloc (1, sizeof (LibHalChangeSetElement));
 	if (elem == NULL)
 		goto out;
@@ -3887,6 +4025,9 @@
 {
 	LibHalChangeSetElement *elem;
 
+	LIBHAL_CHECK_PARAM_VALID(changeset, "*changeset", FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+
 	elem = calloc (1, sizeof (LibHalChangeSetElement));
 	if (elem == NULL)
 		goto out;
@@ -3920,6 +4061,9 @@
 {
 	LibHalChangeSetElement *elem;
 
+	LIBHAL_CHECK_PARAM_VALID(changeset, "*changeset", FALSE);
+	LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+
 	elem = calloc (1, sizeof (LibHalChangeSetElement));
 	if (elem == NULL)
 		goto out;
@@ -3956,6 +4100,9 @@
 	int len;
 	int i, j;
 
+        LIBHAL_CHECK_PARAM_VALID(changeset, "*changeset", FALSE);
+        LIBHAL_CHECK_PARAM_VALID(key, "*key", FALSE);
+
 	elem = calloc (1, sizeof (LibHalChangeSetElement));
 	if (elem == NULL)
 		goto out;
@@ -4026,6 +4173,7 @@
 	int i;
 
 	LIBHAL_CHECK_LIBHALCONTEXT(ctx, FALSE);
+	LIBHAL_CHECK_UDI_VALID(changeset->udi, FALSE);
 
 	if (changeset->head == NULL) {
 		return TRUE;