Skip to content

Commit

Permalink
add kstrndup
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jeremy Fitzhardinge authored and Jeremy Fitzhardinge committed Jul 18, 2007
1 parent 8b4a408 commit 1e66df3
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 40 deletions.
1 change: 1 addition & 0 deletions include/linux/string.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
26 changes: 24 additions & 2 deletions mm/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand All @@ -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
*
Expand Down Expand Up @@ -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.
*/
Expand Down
43 changes: 5 additions & 38 deletions net/irda/irias_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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__);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 1e66df3

Please sign in to comment.