|
@@ -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);
|