Commit 1e66df3e authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Jeremy Fitzhardinge

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: default avatarJeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: default avatarChris 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>
parent 8b4a4080
...@@ -105,6 +105,7 @@ extern void * memchr(const void *,int,__kernel_size_t); ...@@ -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
......
...@@ -6,7 +6,6 @@ ...@@ -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) ...@@ -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); ...@@ -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; ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment