aboutsummaryrefslogtreecommitdiff
path: root/sys/compat/linuxkpi/common/include/linux/string.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/compat/linuxkpi/common/include/linux/string.h')
-rw-r--r--sys/compat/linuxkpi/common/include/linux/string.h40
1 files changed, 40 insertions, 0 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/string.h b/sys/compat/linuxkpi/common/include/linux/string.h
index f7b64560d254..b195dcc8fe9b 100644
--- a/sys/compat/linuxkpi/common/include/linux/string.h
+++ b/sys/compat/linuxkpi/common/include/linux/string.h
@@ -31,6 +31,7 @@
#include <sys/ctype.h>
+#include <linux/array_size.h>
#include <linux/types.h>
#include <linux/gfp.h>
#include <linux/slab.h>
@@ -88,6 +89,17 @@ memdup_user_nul(const void *ptr, size_t len)
}
static inline void *
+memdup_array_user(const void *src, size_t n, size_t size)
+{
+ size_t len;
+
+ if (check_mul_overflow(n, size, &len))
+ return (ERR_PTR(-EOVERFLOW));
+
+ return (memdup_user(src, len));
+}
+
+static inline void *
kmemdup(const void *src, size_t len, gfp_t gfp)
{
void *dst;
@@ -98,6 +110,12 @@ kmemdup(const void *src, size_t len, gfp_t gfp)
return (dst);
}
+static inline void *
+kmemdup_array(const void *src, size_t count, size_t element_size, gfp_t gfp)
+{
+ return (kmemdup(src, size_mul(count, element_size), gfp));
+}
+
/* See slab.h for kvmalloc/kvfree(). */
static inline void *
kvmemdup(const void *src, size_t len, gfp_t gfp)
@@ -198,6 +216,12 @@ memchr_inv(const void *start, int c, size_t length)
return (NULL);
}
+static inline bool
+mem_is_zero(const void *start, size_t length)
+{
+ return (memchr_inv(start, 0, length) == NULL);
+}
+
static inline size_t
str_has_prefix(const char *str, const char *prefix)
{
@@ -303,6 +327,22 @@ memcpy_and_pad(void *dst, size_t dstlen, const void *src, size_t len, int ch)
}
}
+#define strtomem(dst, src) do { \
+ size_t dstlen = ARRAY_SIZE(dst); \
+ size_t srclen = __builtin_object_size(src, 1); \
+ srclen = MIN(srclen, dstlen); \
+ srclen = strnlen(src, srclen); \
+ memcpy(dst, src, srclen); \
+} while (0)
+
+#define strtomem_pad(dst, src, pad) do { \
+ size_t dstlen = ARRAY_SIZE(dst); \
+ size_t srclen = __builtin_object_size(src, 1); \
+ srclen = MIN(srclen, dstlen); \
+ srclen = strnlen(src, srclen); \
+ memcpy_and_pad(dst, dstlen, src, srclen, pad); \
+} while (0)
+
#define memset_startat(ptr, bytepat, smember) \
({ \
uint8_t *_ptr = (uint8_t *)(ptr); \