forked from Minki/linux
[IRDA]: handle out of memory errors
This patch checks return value of memory allocation functions for irda subsystem and fixes memory leaks in error cases. Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Signed-off-by: Samuel Ortiz <samuel@sortiz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
22f8cde5bc
commit
bb5aa42734
@ -91,6 +91,12 @@ struct ias_object *irias_new_object( char *name, int id)
|
||||
|
||||
obj->magic = IAS_OBJECT_MAGIC;
|
||||
obj->name = strndup(name, IAS_MAX_CLASSNAME);
|
||||
if (!obj->name) {
|
||||
IRDA_WARNING("%s(), Unable to allocate name!\n",
|
||||
__FUNCTION__);
|
||||
kfree(obj);
|
||||
return NULL;
|
||||
}
|
||||
obj->id = id;
|
||||
|
||||
/* Locking notes : the attrib spinlock has lower precendence
|
||||
@ -101,6 +107,7 @@ struct ias_object *irias_new_object( char *name, int id)
|
||||
if (obj->attribs == NULL) {
|
||||
IRDA_WARNING("%s(), Unable to allocate attribs!\n",
|
||||
__FUNCTION__);
|
||||
kfree(obj->name);
|
||||
kfree(obj);
|
||||
return NULL;
|
||||
}
|
||||
@ -357,6 +364,15 @@ void irias_add_integer_attrib(struct ias_object *obj, char *name, int value,
|
||||
|
||||
/* Insert value */
|
||||
attrib->value = irias_new_integer_value(value);
|
||||
if (!attrib->name || !attrib->value) {
|
||||
IRDA_WARNING("%s: Unable to allocate attribute!\n",
|
||||
__FUNCTION__);
|
||||
if (attrib->value)
|
||||
irias_delete_value(attrib->value);
|
||||
kfree(attrib->name);
|
||||
kfree(attrib);
|
||||
return;
|
||||
}
|
||||
|
||||
irias_add_attrib(obj, attrib, owner);
|
||||
}
|
||||
@ -391,6 +407,15 @@ void irias_add_octseq_attrib(struct ias_object *obj, char *name, __u8 *octets,
|
||||
attrib->name = strndup(name, IAS_MAX_ATTRIBNAME);
|
||||
|
||||
attrib->value = irias_new_octseq_value( octets, len);
|
||||
if (!attrib->name || !attrib->value) {
|
||||
IRDA_WARNING("%s: Unable to allocate attribute!\n",
|
||||
__FUNCTION__);
|
||||
if (attrib->value)
|
||||
irias_delete_value(attrib->value);
|
||||
kfree(attrib->name);
|
||||
kfree(attrib);
|
||||
return;
|
||||
}
|
||||
|
||||
irias_add_attrib(obj, attrib, owner);
|
||||
}
|
||||
@ -424,6 +449,15 @@ void irias_add_string_attrib(struct ias_object *obj, char *name, char *value,
|
||||
attrib->name = strndup(name, IAS_MAX_ATTRIBNAME);
|
||||
|
||||
attrib->value = irias_new_string_value(value);
|
||||
if (!attrib->name || !attrib->value) {
|
||||
IRDA_WARNING("%s: Unable to allocate attribute!\n",
|
||||
__FUNCTION__);
|
||||
if (attrib->value)
|
||||
irias_delete_value(attrib->value);
|
||||
kfree(attrib->name);
|
||||
kfree(attrib);
|
||||
return;
|
||||
}
|
||||
|
||||
irias_add_attrib(obj, attrib, owner);
|
||||
}
|
||||
@ -473,6 +507,12 @@ struct ias_value *irias_new_string_value(char *string)
|
||||
value->type = IAS_STRING;
|
||||
value->charset = CS_ASCII;
|
||||
value->t.string = strndup(string, IAS_MAX_STRING);
|
||||
if (!value->t.string) {
|
||||
IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__);
|
||||
kfree(value);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
value->len = strlen(value->t.string);
|
||||
|
||||
return value;
|
||||
|
Loading…
Reference in New Issue
Block a user