diff options
Diffstat (limited to 'lib/parser.c')
| -rw-r--r-- | lib/parser.c | 32 | 
1 files changed, 20 insertions, 12 deletions
| diff --git a/lib/parser.c b/lib/parser.c index 703c8c13b34..4f0cbc03e0e 100644 --- a/lib/parser.c +++ b/lib/parser.c @@ -182,18 +182,25 @@ int match_hex(substring_t *s, int *result)  }  /** - * match_strcpy: - copies the characters from a substring_t to a string - * @to: string to copy characters to. - * @s: &substring_t to copy + * match_strlcpy: - Copy the characters from a substring_t to a sized buffer + * @dest: where to copy to + * @src: &substring_t to copy + * @size: size of destination buffer   * - * Description: Copies the set of characters represented by the given - * &substring_t @s to the c-style string @to. Caller guarantees that @to is - * large enough to hold the characters of @s. + * Description: Copy the characters in &substring_t @src to the + * c-style string @dest.  Copy no more than @size - 1 characters, plus + * the terminating NUL.  Return length of @src.   */ -void match_strcpy(char *to, const substring_t *s) +size_t match_strlcpy(char *dest, const substring_t *src, size_t size)  { -	memcpy(to, s->from, s->to - s->from); -	to[s->to - s->from] = '\0'; +	size_t ret = src->to - src->from; + +	if (size) { +		size_t len = ret >= size ? size - 1 : ret; +		memcpy(dest, src->from, len); +		dest[len] = '\0'; +	} +	return ret;  }  /** @@ -206,9 +213,10 @@ void match_strcpy(char *to, const substring_t *s)   */  char *match_strdup(const substring_t *s)  { -	char *p = kmalloc(s->to - s->from + 1, GFP_KERNEL); +	size_t sz = s->to - s->from + 1; +	char *p = kmalloc(sz, GFP_KERNEL);  	if (p) -		match_strcpy(p, s); +		match_strlcpy(p, s, sz);  	return p;  } @@ -216,5 +224,5 @@ EXPORT_SYMBOL(match_token);  EXPORT_SYMBOL(match_int);  EXPORT_SYMBOL(match_octal);  EXPORT_SYMBOL(match_hex); -EXPORT_SYMBOL(match_strcpy); +EXPORT_SYMBOL(match_strlcpy);  EXPORT_SYMBOL(match_strdup); | 
