diff options
Diffstat (limited to 'sys/compat/linuxkpi/common/include/linux/string.h')
| -rw-r--r-- | sys/compat/linuxkpi/common/include/linux/string.h | 40 |
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); \ |
