Skip to content

Commit

Permalink
[IRDA]: handle out of memory errors
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Akinobu Mita authored and David S. Miller committed Feb 8, 2007
1 parent 22f8cde commit bb5aa42
Showing 1 changed file with 40 additions and 0 deletions.
40 changes: 40 additions & 0 deletions net/irda/irias_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit bb5aa42

Please sign in to comment.