add kstrndup
Add a kstrndup function, modelled on strndup. Like strndup this returns a string copied into its own allocated memory, but it copies no more than the specified number of bytes from the source. Remove private strndup() from irda code. Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com> Signed-off-by: Chris Wright <chrisw@sous-sol.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Randy Dunlap <randy.dunlap@oracle.com> Cc: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> Cc: Akinobu Mita <akinobu.mita@gmail.com> Cc: Arnaldo Carvalho de Melo <acme@mandriva.com> Cc: Al Viro <viro@ftp.linux.org.uk> Cc: Panagiotis Issaris <takis@issaris.org> Cc: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
This commit is contained in:
parent
8b4a40809e
commit
1e66df3ee3
|
@ -105,6 +105,7 @@ extern void * memchr(const void *,int,__kernel_size_t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern char *kstrdup(const char *s, gfp_t gfp);
|
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);
|
extern void *kmemdup(const void *src, size_t len, gfp_t gfp);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
26
mm/util.c
26
mm/util.c
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kstrdup - allocate space for and copy an existing string
|
* kstrdup - allocate space for and copy an existing string
|
||||||
*
|
|
||||||
* @s: the string to duplicate
|
* @s: the string to duplicate
|
||||||
* @gfp: the GFP mask used in the kmalloc() call when allocating memory
|
* @gfp: the GFP mask used in the kmalloc() call when allocating memory
|
||||||
*/
|
*/
|
||||||
|
@ -26,6 +25,30 @@ char *kstrdup(const char *s, gfp_t gfp)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kstrdup);
|
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
|
* kmemdup - duplicate region of memory
|
||||||
*
|
*
|
||||||
|
@ -80,7 +103,6 @@ EXPORT_SYMBOL(krealloc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* strndup_user - duplicate an existing string from user space
|
* strndup_user - duplicate an existing string from user space
|
||||||
*
|
|
||||||
* @s: The string to duplicate
|
* @s: The string to duplicate
|
||||||
* @n: Maximum number of bytes to copy, including the trailing NUL.
|
* @n: Maximum number of bytes to copy, including the trailing NUL.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -36,39 +36,6 @@ hashbin_t *irias_objects;
|
||||||
*/
|
*/
|
||||||
struct ias_value irias_missing = { IAS_MISSING, 0, 0, 0, {0}};
|
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)
|
* 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->magic = IAS_OBJECT_MAGIC;
|
||||||
obj->name = strndup(name, IAS_MAX_CLASSNAME);
|
obj->name = kstrndup(name, IAS_MAX_CLASSNAME, GFP_ATOMIC);
|
||||||
if (!obj->name) {
|
if (!obj->name) {
|
||||||
IRDA_WARNING("%s(), Unable to allocate name!\n",
|
IRDA_WARNING("%s(), Unable to allocate name!\n",
|
||||||
__FUNCTION__);
|
__FUNCTION__);
|
||||||
|
@ -360,7 +327,7 @@ void irias_add_integer_attrib(struct ias_object *obj, char *name, int value,
|
||||||
}
|
}
|
||||||
|
|
||||||
attrib->magic = IAS_ATTRIB_MAGIC;
|
attrib->magic = IAS_ATTRIB_MAGIC;
|
||||||
attrib->name = strndup(name, IAS_MAX_ATTRIBNAME);
|
attrib->name = kstrndup(name, IAS_MAX_ATTRIBNAME, GFP_ATOMIC);
|
||||||
|
|
||||||
/* Insert value */
|
/* Insert value */
|
||||||
attrib->value = irias_new_integer_value(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->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);
|
attrib->value = irias_new_octseq_value( octets, len);
|
||||||
if (!attrib->name || !attrib->value) {
|
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->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);
|
attrib->value = irias_new_string_value(value);
|
||||||
if (!attrib->name || !attrib->value) {
|
if (!attrib->name || !attrib->value) {
|
||||||
|
@ -506,7 +473,7 @@ struct ias_value *irias_new_string_value(char *string)
|
||||||
|
|
||||||
value->type = IAS_STRING;
|
value->type = IAS_STRING;
|
||||||
value->charset = CS_ASCII;
|
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) {
|
if (!value->t.string) {
|
||||||
IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__);
|
IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__);
|
||||||
kfree(value);
|
kfree(value);
|
||||||
|
|
Loading…
Reference in New Issue