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:
Родитель
8b4a40809e
Коммит
1e66df3ee3
|
@ -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
|
||||
|
|
26
mm/util.c
26
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
|
||||
*/
|
||||
|
@ -26,6 +25,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
|
||||
*
|
||||
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче