Mercurial > illumos > illumos-gate
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;