X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Firda%2Firias_object.c;h=b1ee99a59c0cee416137e1d4cbcb371117d6a271;hb=refs%2Fheads%2Fvserver;hp=058bf54dcb7eaa09a9ab18709eaa08caba9e52a0;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/net/irda/irias_object.c b/net/irda/irias_object.c index 058bf54dc..b1ee99a59 100644 --- a/net/irda/irias_object.c +++ b/net/irda/irias_object.c @@ -43,7 +43,7 @@ struct ias_value irias_missing = { IAS_MISSING, 0, 0, 0, {0}}; * * Faster, check boundary... Jean II */ -static char *strndup(char *str, int max) +static char *strndup(char *str, size_t max) { char *new_str; int len; @@ -59,7 +59,7 @@ static char *strndup(char *str, int max) /* Allocate new string */ new_str = kmalloc(len + 1, GFP_ATOMIC); if (new_str == NULL) { - WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); + IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); return NULL; } @@ -82,14 +82,12 @@ struct ias_object *irias_new_object( char *name, int id) IRDA_DEBUG( 4, "%s()\n", __FUNCTION__); - obj = (struct ias_object *) kmalloc(sizeof(struct ias_object), - GFP_ATOMIC); + obj = kzalloc(sizeof(struct ias_object), GFP_ATOMIC); if (obj == NULL) { - WARNING("%s(), Unable to allocate object!\n", - __FUNCTION__); + IRDA_WARNING("%s(), Unable to allocate object!\n", + __FUNCTION__); return NULL; } - memset(obj, 0, sizeof( struct ias_object)); obj->magic = IAS_OBJECT_MAGIC; obj->name = strndup(name, IAS_MAX_CLASSNAME); @@ -101,7 +99,8 @@ struct ias_object *irias_new_object( char *name, int id) obj->attribs = hashbin_new(HB_LOCK); if (obj->attribs == NULL) { - WARNING("%s(), Unable to allocate attribs!\n", __FUNCTION__); + IRDA_WARNING("%s(), Unable to allocate attribs!\n", + __FUNCTION__); kfree(obj); return NULL; } @@ -116,13 +115,12 @@ EXPORT_SYMBOL(irias_new_object); * Delete given attribute and deallocate all its memory * */ -void __irias_delete_attrib(struct ias_attrib *attrib) +static void __irias_delete_attrib(struct ias_attrib *attrib) { - ASSERT(attrib != NULL, return;); - ASSERT(attrib->magic == IAS_ATTRIB_MAGIC, return;); + IRDA_ASSERT(attrib != NULL, return;); + IRDA_ASSERT(attrib->magic == IAS_ATTRIB_MAGIC, return;); - if (attrib->name) - kfree(attrib->name); + kfree(attrib->name); irias_delete_value(attrib->value); attrib->magic = ~IAS_ATTRIB_MAGIC; @@ -132,11 +130,10 @@ void __irias_delete_attrib(struct ias_attrib *attrib) void __irias_delete_object(struct ias_object *obj) { - ASSERT(obj != NULL, return;); - ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); + IRDA_ASSERT(obj != NULL, return;); + IRDA_ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); - if (obj->name) - kfree(obj->name); + kfree(obj->name); hashbin_delete(obj->attribs, (FREE_FUNC) __irias_delete_attrib); @@ -156,14 +153,17 @@ int irias_delete_object(struct ias_object *obj) { struct ias_object *node; - ASSERT(obj != NULL, return -1;); - ASSERT(obj->magic == IAS_OBJECT_MAGIC, return -1;); + IRDA_ASSERT(obj != NULL, return -1;); + IRDA_ASSERT(obj->magic == IAS_OBJECT_MAGIC, return -1;); + /* Remove from list */ node = hashbin_remove_this(irias_objects, (irda_queue_t *) obj); if (!node) - return 0; /* Already removed */ + IRDA_DEBUG( 0, "%s(), object already removed!\n", + __FUNCTION__); - __irias_delete_object(node); + /* Destroy */ + __irias_delete_object(obj); return 0; } @@ -176,13 +176,14 @@ EXPORT_SYMBOL(irias_delete_object); * the object, remove the object as well. * */ -int irias_delete_attrib(struct ias_object *obj, struct ias_attrib *attrib) +int irias_delete_attrib(struct ias_object *obj, struct ias_attrib *attrib, + int cleanobject) { struct ias_attrib *node; - ASSERT(obj != NULL, return -1;); - ASSERT(obj->magic == IAS_OBJECT_MAGIC, return -1;); - ASSERT(attrib != NULL, return -1;); + IRDA_ASSERT(obj != NULL, return -1;); + IRDA_ASSERT(obj->magic == IAS_OBJECT_MAGIC, return -1;); + IRDA_ASSERT(attrib != NULL, return -1;); /* Remove attribute from object */ node = hashbin_remove_this(obj->attribs, (irda_queue_t *) attrib); @@ -192,9 +193,13 @@ int irias_delete_attrib(struct ias_object *obj, struct ias_attrib *attrib) /* Deallocate attribute */ __irias_delete_attrib(node); - /* Check if object has still some attributes */ + /* Check if object has still some attributes, destroy it if none. + * At first glance, this look dangerous, as the kernel reference + * various IAS objects. However, we only use this function on + * user attributes, not kernel attributes, so there is no risk + * of deleting a kernel object this way. Jean II */ node = (struct ias_attrib *) hashbin_get_first(obj->attribs); - if (!node) + if (cleanobject && !node) irias_delete_object(obj); return 0; @@ -208,8 +213,8 @@ int irias_delete_attrib(struct ias_object *obj, struct ias_attrib *attrib) */ void irias_insert_object(struct ias_object *obj) { - ASSERT(obj != NULL, return;); - ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); + IRDA_ASSERT(obj != NULL, return;); + IRDA_ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); hashbin_insert(irias_objects, (irda_queue_t *) obj, 0, obj->name); } @@ -223,7 +228,7 @@ EXPORT_SYMBOL(irias_insert_object); */ struct ias_object *irias_find_object(char *name) { - ASSERT(name != NULL, return NULL;); + IRDA_ASSERT(name != NULL, return NULL;); /* Unsafe (locking), object might change */ return hashbin_lock_find(irias_objects, 0, name); @@ -240,9 +245,9 @@ struct ias_attrib *irias_find_attrib(struct ias_object *obj, char *name) { struct ias_attrib *attrib; - ASSERT(obj != NULL, return NULL;); - ASSERT(obj->magic == IAS_OBJECT_MAGIC, return NULL;); - ASSERT(name != NULL, return NULL;); + IRDA_ASSERT(obj != NULL, return NULL;); + IRDA_ASSERT(obj->magic == IAS_OBJECT_MAGIC, return NULL;); + IRDA_ASSERT(name != NULL, return NULL;); attrib = hashbin_lock_find(obj->attribs, 0, name); if (attrib == NULL) @@ -251,7 +256,6 @@ struct ias_attrib *irias_find_attrib(struct ias_object *obj, char *name) /* Unsafe (locking), attrib might change */ return attrib; } -EXPORT_SYMBOL(irias_find_attrib); /* * Function irias_add_attribute (obj, attrib) @@ -259,14 +263,14 @@ EXPORT_SYMBOL(irias_find_attrib); * Add attribute to object * */ -void irias_add_attrib( struct ias_object *obj, struct ias_attrib *attrib, - int owner) +static void irias_add_attrib(struct ias_object *obj, struct ias_attrib *attrib, + int owner) { - ASSERT(obj != NULL, return;); - ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); + IRDA_ASSERT(obj != NULL, return;); + IRDA_ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); - ASSERT(attrib != NULL, return;); - ASSERT(attrib->magic == IAS_ATTRIB_MAGIC, return;); + IRDA_ASSERT(attrib != NULL, return;); + IRDA_ASSERT(attrib->magic == IAS_ATTRIB_MAGIC, return;); /* Set if attrib is owned by kernel or user space */ attrib->value->owner = owner; @@ -290,8 +294,8 @@ int irias_object_change_attribute(char *obj_name, char *attrib_name, /* Find object */ obj = hashbin_lock_find(irias_objects, 0, obj_name); if (obj == NULL) { - WARNING("%s: Unable to find object: %s\n", __FUNCTION__, - obj_name); + IRDA_WARNING("%s: Unable to find object: %s\n", __FUNCTION__, + obj_name); return -1; } @@ -301,8 +305,8 @@ int irias_object_change_attribute(char *obj_name, char *attrib_name, /* Find attribute */ attrib = hashbin_find(obj->attribs, 0, attrib_name); if (attrib == NULL) { - WARNING("%s: Unable to find attribute: %s\n", __FUNCTION__, - attrib_name); + IRDA_WARNING("%s: Unable to find attribute: %s\n", + __FUNCTION__, attrib_name); spin_unlock_irqrestore(&obj->attribs->hb_spinlock, flags); return -1; } @@ -337,17 +341,16 @@ void irias_add_integer_attrib(struct ias_object *obj, char *name, int value, { struct ias_attrib *attrib; - ASSERT(obj != NULL, return;); - ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); - ASSERT(name != NULL, return;); + IRDA_ASSERT(obj != NULL, return;); + IRDA_ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); + IRDA_ASSERT(name != NULL, return;); - attrib = (struct ias_attrib *) kmalloc(sizeof(struct ias_attrib), - GFP_ATOMIC); + attrib = kzalloc(sizeof(struct ias_attrib), GFP_ATOMIC); if (attrib == NULL) { - WARNING("%s: Unable to allocate attribute!\n", __FUNCTION__); + IRDA_WARNING("%s: Unable to allocate attribute!\n", + __FUNCTION__); return; } - memset(attrib, 0, sizeof( struct ias_attrib)); attrib->magic = IAS_ATTRIB_MAGIC; attrib->name = strndup(name, IAS_MAX_ATTRIBNAME); @@ -371,19 +374,18 @@ void irias_add_octseq_attrib(struct ias_object *obj, char *name, __u8 *octets, { struct ias_attrib *attrib; - ASSERT(obj != NULL, return;); - ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); + IRDA_ASSERT(obj != NULL, return;); + IRDA_ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); - ASSERT(name != NULL, return;); - ASSERT(octets != NULL, return;); + IRDA_ASSERT(name != NULL, return;); + IRDA_ASSERT(octets != NULL, return;); - attrib = (struct ias_attrib *) kmalloc(sizeof(struct ias_attrib), - GFP_ATOMIC); + attrib = kzalloc(sizeof(struct ias_attrib), GFP_ATOMIC); if (attrib == NULL) { - WARNING("%s: Unable to allocate attribute!\n", __FUNCTION__); + IRDA_WARNING("%s: Unable to allocate attribute!\n", + __FUNCTION__); return; } - memset(attrib, 0, sizeof( struct ias_attrib)); attrib->magic = IAS_ATTRIB_MAGIC; attrib->name = strndup(name, IAS_MAX_ATTRIBNAME); @@ -405,19 +407,18 @@ void irias_add_string_attrib(struct ias_object *obj, char *name, char *value, { struct ias_attrib *attrib; - ASSERT(obj != NULL, return;); - ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); + IRDA_ASSERT(obj != NULL, return;); + IRDA_ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); - ASSERT(name != NULL, return;); - ASSERT(value != NULL, return;); + IRDA_ASSERT(name != NULL, return;); + IRDA_ASSERT(value != NULL, return;); - attrib = (struct ias_attrib *) kmalloc(sizeof( struct ias_attrib), - GFP_ATOMIC); + attrib = kzalloc(sizeof( struct ias_attrib), GFP_ATOMIC); if (attrib == NULL) { - WARNING("%s: Unable to allocate attribute!\n", __FUNCTION__); + IRDA_WARNING("%s: Unable to allocate attribute!\n", + __FUNCTION__); return; } - memset(attrib, 0, sizeof( struct ias_attrib)); attrib->magic = IAS_ATTRIB_MAGIC; attrib->name = strndup(name, IAS_MAX_ATTRIBNAME); @@ -438,12 +439,11 @@ struct ias_value *irias_new_integer_value(int integer) { struct ias_value *value; - value = kmalloc(sizeof(struct ias_value), GFP_ATOMIC); + value = kzalloc(sizeof(struct ias_value), GFP_ATOMIC); if (value == NULL) { - WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); + IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); return NULL; } - memset(value, 0, sizeof(struct ias_value)); value->type = IAS_INTEGER; value->len = 4; @@ -464,12 +464,11 @@ struct ias_value *irias_new_string_value(char *string) { struct ias_value *value; - value = kmalloc(sizeof(struct ias_value), GFP_ATOMIC); + value = kzalloc(sizeof(struct ias_value), GFP_ATOMIC); if (value == NULL) { - WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); + IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); return NULL; } - memset( value, 0, sizeof( struct ias_value)); value->type = IAS_STRING; value->charset = CS_ASCII; @@ -478,7 +477,6 @@ struct ias_value *irias_new_string_value(char *string) return value; } -EXPORT_SYMBOL(irias_new_string_value); /* * Function irias_new_octseq_value (octets, len) @@ -491,12 +489,11 @@ struct ias_value *irias_new_octseq_value(__u8 *octseq , int len) { struct ias_value *value; - value = kmalloc(sizeof(struct ias_value), GFP_ATOMIC); + value = kzalloc(sizeof(struct ias_value), GFP_ATOMIC); if (value == NULL) { - WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); + IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); return NULL; } - memset(value, 0, sizeof(struct ias_value)); value->type = IAS_OCT_SEQ; /* Check length */ @@ -504,30 +501,26 @@ struct ias_value *irias_new_octseq_value(__u8 *octseq , int len) len = IAS_MAX_OCTET_STRING; value->len = len; - value->t.oct_seq = kmalloc(len, GFP_ATOMIC); + value->t.oct_seq = kmemdup(octseq, len, GFP_ATOMIC); if (value->t.oct_seq == NULL){ - WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); + IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); kfree(value); return NULL; } - memcpy(value->t.oct_seq, octseq , len); return value; } -EXPORT_SYMBOL(irias_new_octseq_value); struct ias_value *irias_new_missing_value(void) { struct ias_value *value; - value = kmalloc(sizeof(struct ias_value), GFP_ATOMIC); + value = kzalloc(sizeof(struct ias_value), GFP_ATOMIC); if (value == NULL) { - WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); + IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); return NULL; } - memset(value, 0, sizeof(struct ias_value)); value->type = IAS_MISSING; - value->len = 0; return value; } @@ -542,7 +535,7 @@ void irias_delete_value(struct ias_value *value) { IRDA_DEBUG(4, "%s()\n", __FUNCTION__); - ASSERT(value != NULL, return;); + IRDA_ASSERT(value != NULL, return;); switch (value->type) { case IAS_INTEGER: /* Fallthrough */ @@ -550,14 +543,12 @@ void irias_delete_value(struct ias_value *value) /* No need to deallocate */ break; case IAS_STRING: - /* If string, deallocate string */ - if (value->t.string != NULL) - kfree(value->t.string); + /* Deallocate string */ + kfree(value->t.string); break; case IAS_OCT_SEQ: - /* If byte stream, deallocate byte stream */ - if (value->t.oct_seq != NULL) - kfree(value->t.oct_seq); + /* Deallocate byte stream */ + kfree(value->t.oct_seq); break; default: IRDA_DEBUG(0, "%s(), Unknown value type!\n", __FUNCTION__);