diff options
| -rw-r--r-- | include/linux/string.h | 1 | ||||
| -rw-r--r-- | mm/util.c | 26 | ||||
| -rw-r--r-- | net/irda/irias_object.c | 43 | 
3 files changed, 30 insertions, 40 deletions
diff --git a/include/linux/string.h b/include/linux/string.h index 7f2eb6a477f..ee5e9ccc4aa 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -105,6 +105,7 @@ extern void * memchr(const void *,int,__kernel_size_t);  #endif  extern char *kstrdup(const char *s, gfp_t gfp); +extern char *kstrndup(const char *s, size_t len, gfp_t gfp);  extern void *kmemdup(const void *src, size_t len, gfp_t gfp);  #ifdef __cplusplus diff --git a/mm/util.c b/mm/util.c index 78f3783bdcc..bf340d80686 100644 --- a/mm/util.c +++ b/mm/util.c @@ -6,7 +6,6 @@  /**   * kstrdup - allocate space for and copy an existing string - *   * @s: the string to duplicate   * @gfp: the GFP mask used in the kmalloc() call when allocating memory   */ @@ -27,6 +26,30 @@ char *kstrdup(const char *s, gfp_t gfp)  EXPORT_SYMBOL(kstrdup);  /** + * kstrndup - allocate space for and copy an existing string + * @s: the string to duplicate + * @max: read at most @max chars from @s + * @gfp: the GFP mask used in the kmalloc() call when allocating memory + */ +char *kstrndup(const char *s, size_t max, gfp_t gfp) +{ +	size_t len; +	char *buf; + +	if (!s) +		return NULL; + +	len = strnlen(s, max); +	buf = kmalloc_track_caller(len+1, gfp); +	if (buf) { +		memcpy(buf, s, len); +		buf[len] = '\0'; +	} +	return buf; +} +EXPORT_SYMBOL(kstrndup); + +/**   * kmemdup - duplicate region of memory   *   * @src: memory region to duplicate @@ -80,7 +103,6 @@ EXPORT_SYMBOL(krealloc);  /*   * strndup_user - duplicate an existing string from user space - *   * @s: The string to duplicate   * @n: Maximum number of bytes to copy, including the trailing NUL.   */ diff --git a/net/irda/irias_object.c b/net/irda/irias_object.c index 4adaae242b9..cf302457097 100644 --- a/net/irda/irias_object.c +++ b/net/irda/irias_object.c @@ -36,39 +36,6 @@ hashbin_t *irias_objects;   */  struct ias_value irias_missing = { IAS_MISSING, 0, 0, 0, {0}}; -/* - * Function strndup (str, max) - * - *    My own kernel version of strndup! - * - * Faster, check boundary... Jean II - */ -static char *strndup(char *str, size_t max) -{ -	char *new_str; -	int len; - -	/* Check string */ -	if (str == NULL) -		return NULL; -	/* Check length, truncate */ -	len = strlen(str); -	if(len > max) -		len = max; - -	/* Allocate new string */ -	new_str = kmalloc(len + 1, GFP_ATOMIC); -	if (new_str == NULL) { -		IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); -		return NULL; -	} - -	/* Copy and truncate */ -	memcpy(new_str, str, len); -	new_str[len] = '\0'; - -	return new_str; -}  /*   * Function ias_new_object (name, id) @@ -90,7 +57,7 @@ struct ias_object *irias_new_object( char *name, int id)  	}  	obj->magic = IAS_OBJECT_MAGIC; -	obj->name = strndup(name, IAS_MAX_CLASSNAME); +	obj->name = kstrndup(name, IAS_MAX_CLASSNAME, GFP_ATOMIC);  	if (!obj->name) {  		IRDA_WARNING("%s(), Unable to allocate name!\n",  			     __FUNCTION__); @@ -360,7 +327,7 @@ void irias_add_integer_attrib(struct ias_object *obj, char *name, int value,  	}  	attrib->magic = IAS_ATTRIB_MAGIC; -	attrib->name = strndup(name, IAS_MAX_ATTRIBNAME); +	attrib->name = kstrndup(name, IAS_MAX_ATTRIBNAME, GFP_ATOMIC);  	/* Insert value */  	attrib->value = irias_new_integer_value(value); @@ -404,7 +371,7 @@ void irias_add_octseq_attrib(struct ias_object *obj, char *name, __u8 *octets,  	}  	attrib->magic = IAS_ATTRIB_MAGIC; -	attrib->name = strndup(name, IAS_MAX_ATTRIBNAME); +	attrib->name = kstrndup(name, IAS_MAX_ATTRIBNAME, GFP_ATOMIC);  	attrib->value = irias_new_octseq_value( octets, len);  	if (!attrib->name || !attrib->value) { @@ -446,7 +413,7 @@ void irias_add_string_attrib(struct ias_object *obj, char *name, char *value,  	}  	attrib->magic = IAS_ATTRIB_MAGIC; -	attrib->name = strndup(name, IAS_MAX_ATTRIBNAME); +	attrib->name = kstrndup(name, IAS_MAX_ATTRIBNAME, GFP_ATOMIC);  	attrib->value = irias_new_string_value(value);  	if (!attrib->name || !attrib->value) { @@ -506,7 +473,7 @@ 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); +	value->t.string = kstrndup(string, IAS_MAX_STRING, GFP_ATOMIC);  	if (!value->t.string) {  		IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__);  		kfree(value);  |